Web_for_Pentester是国外安全研究者开发的一款渗透测试平台,由PentesterLab出品。官方给自己的定义是一个简单又十分有效地学习渗透测试的演练平台。
代码执行漏洞是因为对用户控制的输入数据没有进行恰当的过滤和转义。当你执行一个代码注入漏洞,你要在发送给web应用程序的数据中添加你的注入代码。比如,你想要执行ls命令,你要发送system(“ls”),因为这是个php程序。
就像其他web漏洞的例子一样,通常很难知道怎么注释掉剩下的代码(比如程序在用户控制的数据后添加的代码)。在PHP中,你可以用//来绕过被添加的代码。
和SQL注入漏洞一样,你可以用同样的技巧来测试并且确保你的注入代码被执行:
用注释符来执行注入 /* 任意值 */
用一个简单连接符”.”来注入(这里”用来打断语句并且正确的重组语句)
用字符串连接符来构造变量,比如用”.”ha”.”cker”来替代hacker
你还可以用基于时间的检测方式来定位漏洞,要用到php的sleep函数。下面两个例子也有不同的时间响应:
不使用sleep函数或者用零时间延迟函叔:sleep(0)
用时间函数引入较长的延时:sleep(10)
【实验步骤】
一、 Example1
1.1 由Code injection Example1的源代码example1.php可知,代码中使用了函数eval(),这是一个相当简单的代码注入例子。如图1所示
图 1
1.2 在火狐浏览器地址栏输入http://vulnerable/codeexec/example1.php?name=
hacker”;phpinfo();”,获得PHP信息。如图2所示
图 2
二、 Example2
2.1 由Code injection Example2的源代码example2.php可知,代码中使用了usort ()函数和create_function()函数。在给某些信息排序的时候,开发者通常用两种方式,一是通过SQL请求来排序,二是利用PHP的usort函数。usort()函数通常和create_function()函数一起使用,用来根据用户控制的输入信息来动态的产生排序函数。如果web应用程序缺少严格的过滤和检验就可能导致代码执行漏洞的产生。如图3、图4所示
图 3
图 4
2.2 下面对Example2进行探索。在浏览器地址栏输入http://vulnerable/codeexec/example2.php?order=phpinfo(),报错。如图5所示
图 5
2.3 在浏览器地址栏输入http://vulnerable/codeexec/example2.php?order=
id;phpinfo();//,报错。如图6所示
图 6
2.4 在浏览器地址栏输入http://vulnerable/codeexec/example2.php?order=
id);phpinfo();//,报错。如图7所示
图 7
2.5 在浏览器地址栏输入http://vulnerable/codeexec/example2.php?order=
id)};phpinfo();//,报错。如图8所示
图 8
2.6 在浏览器地址栏输入http://vulnerable/codeexec/example2.php?order=
id);};phpinfo();//,成功得到PHP信息,排除SQLi,估计程序使用的是usort()和create_function()。如图9所示
图 9
2.7 在浏览器地回来输入http://vulnerable/codeexec/example2.php?order=id);}
system(‘uname -a’);//,获得目标系统信息。如图10所示
图 10
三、 Example3
3.1 由Code injection Example3的源代码example3.php可知,代码中使用了函数preg_replace()函数。我们知道,在PHP中有一个非常危险的修饰符: PCRE_REPLACE_EVAL(/e),这个修饰符会导致在执行替换之前preg_replace函数把新值当做PHP代码来执行(PCRE_REPLACE_EVAL函数在PHP5.5.0开始被剔除了)。如图11所示
图 11
3.2 单击http://vulnerable主页面Code injection Example3,由URL可知用的应该是正则表达式。如图12所示
图 12
3.3 我们知道PHP中很大部分关于code injection的漏洞都来自对于PCRE(Perl Compatible Regular Expression)的使用不当。PCRE被用于使用正则表达式,如preg_match和 preg_replace。正常情况下, 它是安全的,不过当在正则表达式后使用/e的时候,就很危险。对于preg_replace()函数,在正则表达式后加/e时, 它允许PHP function添加一个callback。在浏览器地址栏输入http://vulnerable/codeexec/example3.php?new=phpinfo()&pattern=/lamer/e&base=Hello lamer,得到PHP信息。如图13所示
图 13
3.4 还可以使用system()函数执行任意命令。在浏览器地址栏输入http://vulnerable/codeexec/example3.php?new=system(‘pwd’)&pattern=/lamer/e&base=Hello lamer,得到当前目录信息,当前目录为var/www/codeexec。还可以将pwd改为ls列出当前目录下的所有文件。如图14、图15所示
图 14
图 15
四、 Example4
4.1 由Code injection Example4的源代码example4.php可知代码中使用了函数 assert()。如果使用的不恰当,这个函数会执行收到的值。这个行为可以用来制造代码执行漏洞。如图16所示
图 16
4.2 单击http://vulnerable主页面上Code injection Example4,在URL后添加个单引号,报错,由报错信息可知代码中使用了assert()函数。如图17所示
图 17
4.3 在浏览器地址栏输入http://vulnerable/codeexec/example4.php?name=xipu
‘.phpinfo().’,得到PHP信息。如图18所示
图 18