zoukankan      html  css  js  c++  java
  • ref:PHP代码注入审计

    ref:https://www.waitalone.cn/php-code-injection.html

    通俗易懂,全面清晰。

    0x1 前言

    为了方便自己以后的翻阅和查找,最近正在整理一些所学的内容。个人觉得只有将知识系统化和模块化才能更加有效的吸收和学习。接下来就先开始整理关于 PHP 代码注入的一些问题和知识点。

    0x2 简述

    代码的执行来自于缺乏严格的过滤或者用户控制数据的逃逸。在这里由于攻击者可以控制部分或者所有内容传递给这些未进行严格过滤的函数,从而导致提交的内容会被作为PHP代码执行。

    0x3 PHP 代码注入&相关敏感函数

    PHP 代码注入

    在 PHP 中有一些函数

    相关敏感函数:

    phpcodeinjection1

    eval 会把字符串作为 PHP 代码来执行

    phpcodeinjection2

    preg_replace执行一个正则的搜索和替换

    phpcodeinjection3

    /e 修正符使 preg_replace将 replacement 参数当做 PHP 代码【在适当的逆向引用和替换完之后】

    assert:assert检查一个断言是否为 false

    phpcodeinjection4

    call_user_func: call_user_func把第一个参数作为回调函数调用

    phpcodeinjection5

    call_user_func_array:调用回调函数,并把一个数组参数作为回调函数的参数

    phpcodeinjection6

    create_function:增加一个匿名的函数【lamda-style】

    phpcodeinjection7

    还有很多这里就不一一列举具体请参考如下链接:

    PHP代码执行漏洞总结

    0x4 漏洞案例分析

    接下来看看上述的函数都在哪些情况下会产生php代码注入

    PHP eval

    phpcodeinjection8

    这里eval函数会将提交上来的值作为PHP 代码处理,例如我们提交phpinfo();那么可以看到他被成功执行了。

    phpcodeinjection9

    以bWAPP 中的php code injection 为例

    phpcodeinjection10

    当提交phpinfo();后, eval()函数会将其执行;同样也可以提交一段代码让其生成一个文件并写入内容

    Exp:

    phpcodeinjection11

    phpcodeinjection12

    看到回显,说明代码已经执行成功!

    此时创建了一个名为test.php 的文件并写入了一个一句话木马,用菜刀链接后可以看到在站点的根目录下确实生成了一个test.php 的文件

    2) http://phpchallenges2.sinaapp.com/index.php

    phpcodeinjection13

    这里用addslashes()函数进行了过滤,但是提交的php 代码可以这样在双引号中被执行

    phpcodeinjection14

    那么根据上面绕过过滤的方式我们就可以这样写入一句话代码了

    phpcodeinjection15

    案例-1:

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

    phpcodeinjection16

    phpcodeinjection17

    案例演示:

    phpcodeinjection18

    phpcodeinjection19

    既然有php 代码注入漏洞,只要是站点目录有写入的权限就可以写入一个一句话的马,利用代码如下:
    phpcodeinjection20

    执行后回到站点的根目录,会发现在根目录下生成了一个名为test.php 的文件

    phpcodeinjection21

    打开test.php 文件看一下,php 一句话的代码成功被写入!

    phpcodeinjection22

    PHP preg_replace ()

    phpcodeinjection23

    当replacement 参数构成一个合理的php 代码字符串的时候,/e 修正符使preg_replace(),将replacement 参数当做php 代码执行。如下图所示,preg_replace()将replacement参数作为php 代码成功执行。

    phpcodeinjection24

    2.bypass black-list filter

    3.案例-2:

    X7 Chat 2.0.5 preg_replace() PHP Code Execution

    影响版本:X7 Chat version 2.0.5

    漏洞描述:

    漏洞的产生最终是由于/lib/message.php 下的第119 行的preg_replce()函数导致,这里引用了/e 修饰符,并且未经过严格过滤最终导致任意代码执行。

    phpcodeinjection25

    案例演示:

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

    2. 利用注册的用户登录

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

    phpcodeinjection26

    或者直接GET 如下代码

    phpcodeinjection27

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

    phpcodeinjection28

    phpcodeinjection29

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

    PHP create_function()

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

    phpcodeinjection30

    phpcodeinjection31

    PHP unserialize

    phpcodeinjection32

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

    phpcodeinjection33

    PHP assert

    phpcodeinjection34

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

    phpcodeinjection35

    0x5 代码执行绕过

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

    案例演示:

    example1.php

    phpcodeinjection36

    解决方案:

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

    提交语句:

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

    phpcodeinjection37

    example2.php

    phpcodeinjection38

    解决方案:

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

    提交代码:

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

    phpcodeinjection39

    example3.php

    phpcodeinjection40

    解决方案:

    /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

    phpcodeinjection41

    example4.php

    phpcodeinjection42

    解决方案:

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

    提交代码:

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

    phpcodeinjection43

    0x6 代码防御

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

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

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

    0x7 相关参考

    代码审计典型语法结构

    PHP代码执行漏洞总结

    cn2.php.net

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

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

    文中相关漏洞源码:链接: http://pan.baidu.com/s/1cA90RW 密码: 8pw5

    原文地址:http://www.mottoin.com/90370.html 作者:千域千寻

  • 相关阅读:
    CSS弹性盒布局(display:flex)
    CSS中的display属性(none,block,inline,inline-block,inherit)
    【Python全栈-JavaScript】JavaScript的window.onload()与jQuery 的ready()的区别
    【数据可视化-Echarts】Echart基础
    【Python全栈】HTML <!--...--> 注释 、CSS/JS //注释 和 /*.....*/ 注释
    Python内置函数
    【Django】Model操作进阶
    【Django】Form组件-2
    【Django】分页
    【Django】模板语言
  • 原文地址:https://www.cnblogs.com/studyskill/p/9034440.html
Copyright © 2011-2022 走看看