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

通俗易懂,全面清晰。

0x1 前言

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

0x2 简述

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

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

PHP 代码注入

在 PHP 中有一些函数

相关敏感函数:

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

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

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

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

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

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

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

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

PHP代码执行漏洞总结

0x4 漏洞案例分析

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

PHP eval

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

以bWAPP 中的php code injection 为例

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

Exp:

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

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

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

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

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

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

案例演示:

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

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

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

PHP preg_replace ()

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

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

案例演示:

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

2. 利用注册的用户登录

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

或者直接GET 如下代码

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

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

PHP create_function()

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

PHP unserialize

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

PHP assert

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

0x5 代码执行绕过

前面将一些常见的易造成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').'

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 作者:千域千寻

ref:PHP代码注入审计的更多相关文章

  1. 获取C#中方法的执行时间及其代码注入

    在优化C#代码或对比某些API的效率时,通常需要测试某个方法的运行时间,可以通过DateTime来统计指定方法的执行时间,也可以使用命名空间System.Diagnostics中封装了高精度计时器Qu ...

  2. 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码

    详解C#泛型(二)   一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...

  3. 阿里云提示Discuz uc.key泄露导致代码注入漏洞uc.php的解决方法

    适用所有用UC整合 阿里云提示漏洞: discuz中的/api/uc.php存在代码写入漏洞,导致黑客可写入恶意代码获取uckey,.......... 漏洞名称:Discuz uc.key泄露导致代 ...

  4. 【原】iOS动态性(三) Method Swizzling以及AOP编程:在运行时进行代码注入

    概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为“移花接木 ...

  5. Java链接MySQL练习题:格式化日期、性别;避免代码注入

    一.查询人员名单,按序号 姓名 性格(男或女) 民族(某族) 生日(年月日)输出 import java.sql.*; import java.text.SimpleDateFormat; publi ...

  6. 转:EasyHook远程代码注入

    EasyHook远程代码注入 最近一段时间由于使用MinHook的API挂钩不稳定,经常因为挂钩地址错误而导致宿主进程崩溃.听同事介绍了一款智能强大的挂钩引擎EasyHook.它比微软的detours ...

  7. Android 反编译 代码注入之HelloWorld

    为了向经典的"Hello, World"致敬,我们也从一个简单的程序开始HelloWorld.apk.当你把这个APK安装到手机上运行后,在屏幕上就显示一行文字"Hell ...

  8. apk反编译(4)Smali代码注入

    转自 : http://blog.sina.com.cn/s/blog_5674d18801019i89.html 应用场景 Smali代码注入只能应对函数级别的移植,对于类级别的移植是无能为力的.具 ...

  9. 注入攻击-SQL注入和代码注入

    注入攻击 OWASP将注入攻击和跨站脚本攻击(XSS)列入网络应用程序十大常见安全风险.实际上,它们会一起出现,因为 XSS 攻击依赖于注入攻击的成功.虽然这是最明显的组合关系,但是注入攻击带来的不仅 ...

随机推荐

  1. java-压缩文件成zip文件(多文件/单文件/多目录/单目录/无目录),用于下载

    本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处. http://www.cnblogs.com/king-xg/p/6424788.html 上代码: pac ...

  2. [DeeplearningAI笔记]卷积神经网络3.1-3.5目标定位/特征点检测/目标检测/滑动窗口的卷积神经网络实现/YOLO算法

    4.3目标检测 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.1目标定位 对象定位localization和目标检测detection 判断图像中的对象是不是汽车--Image clas ...

  3. 修改tomcat的Response Hearder 头中的Server信息

    如图: Server: Apache-Coyote/1.1 这个信息给入侵者提供了一定的指示作用.为了安全起见,要求更改这个信息.那么我们就来修改一下试试,非常简单,只要在Connector中添加se ...

  4. elasticsearch创建索引

    1.通过elasticsearch-head 创建 (1)登录localhost:9100 (2)点击复合查询 (3)输入内容 (4)勾选易读,点击验证是否是JSON格式 (5)点击提交请求,返回 { ...

  5. 说一说ASP.NET web.config 加密及解密方法 (代码)

    /// <summary> /// 保护web.config的加密和解密 /// </summary> public class ProtectHelper { /// < ...

  6. 51Nod 1256 扩展欧几里得求乘法逆元

    给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的. Input 输入2个数M, N中间用 ...

  7. 2017ACM暑期多校联合训练 - Team 7 1008 HDU 6127 Hard challenge (极角排序)

    题目链接 Problem Description There are n points on the plane, and the ith points has a value vali, and i ...

  8. Date对象相关函数使用

    参考:http://www.w3school.com.cn/jsref/jsref_obj_date.asp

  9. Docker微容器Alpine Linux

    Alpine 操作系统是一个面向安全的轻型 Linux 发行版. 它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功 ...

  10. python中赋值、浅拷贝、深拷贝详解(转)

    一.赋值 >>> a = [1, 2, 3]>>> b = a>>> print(id(a), id(b), sep='\n')139701469 ...