文章目录

  • 概述
  • 函数
  • 挖洞经验
    • eval和assert函数
    • preg_replace函数
    • call_user_func()和array()_map()函数
    • 动态函数执行

概述

  • 类似于SQL注入,可以吧SQL语句注入到SQL服务执行
  • PHP代码执行则是吧代码 注入应用中最终到WebServer去执行,这样的函数如果没有过滤,相对于存在一个后门代码执行

函数

  • eval()
  • assert()
  • preg_replace()
  • call_user_func()
  • call_user_func_arry()
  • array_map()等

挖洞经验

  • eval()和assert()函数导致的代码执行漏洞大多是因为载入缓存或者模板以及对变量的处理不严格导致,比如直接吧一个外部可控的参数直接拼接到模板里面然后调用这两个函数去当成PHP代码执行
  • preg_replace()函数的代码执行需要/e参数,这个函数本身是用来处理字符串的,因出现的漏洞比较多的是对字符串的处理,比如URL,HTML标签以及文章内容等过滤功能
  • call_user_func_arry()和array_map()函数的功能是调用函数,多用在框架里面动态调用函数,一般比较小的程序容易出现这种方式的代码执行比较少,array_map()函数的作用是调用函数并去除第一个参数外其他参数为数组,通常会写死一个参数,即调用的函数,类似三个函数功能的函数还有很多

eval和assert函数

  • 这两个函数原本的作用就是动态执行代码,所以它们的参数就是PHP代码,我们来看看怎么使用的,测试代码如下:
<?php
$q = $_GET['q'];  //获取用户输入的参数q
$id = $_GET['id']; //获取用户输入的参数id
eval("\$get = $id;"); //eval函数对$shiyanlou赋值
echo $q;  //打印q
echo $get; //打印赋值过后的get?>

我们来请求一次

  • 请求变量q时候
  • 并没有执行php代码

  • 请求变量id时候
  • 发现执行了php代码


结论

  • 如果变量被传入evalasser函数,该变量值打印出来的代码可以直接执行PHP代码

preg_replace函数

使用连接

  • preg_replace函数的作用是对字符串进行正则处理,下面我们来看看它什么情况下才会出现代码执行漏洞

它的参数返回如下

  • mixed preg_replace (mixed $pattern ,mixed $replacement , mixed
    $subject [, int $limit = -1 [, int &$count]] )
  • 这段代码的含义是搜索$subject匹配$pattern的部分以$replacement进行替换,而当$pattern处即第一个参数存在e修饰符时,$replacement的值会被当成PHP代码执行,我们来看一个简单的例子(1.php)
<?php
preg_replace("/\[(.*)\]/e",'\\1',$_GET['str']);
?>
  • 正则的意思是从$_GET[‘str’]变量里面搜索中括号[]中间的内容作为第一组结果,preg_replace()函数第二个参数’\1’代表这里用第一组结果填充,这里是可以直接执行代码的
  • 所以当我们请求/1.php?str=[phpinfo()]时候,则执行phpinfo(),结果如下

call_user_func()和array()_map()函数

  • call_user_func()和array_map()等数十个函数有调用其他函数的功能,其中一个参数作为要调用的函数名,那如果这个传入的参数名可控,那就可以调用意外的函数执行我们的代码,也就是存在代码执行漏洞

  • 我们用call_user_func()函数来举列。函数的作用是调用函数并且第二个参数作为要调用的函数的参数,官方文档如下:
    mixed call_user_func ( callable $callback [,mixed $parameter [ , mixed $…]])

  • 该函数第一个参数为回调函数后面的参数为回调函数的参数,测试代码如下:

<?php
$b=$_GET['b'];
call_user_func($_GET['a'],$b);?>
  • 请求php?a=assert&b=phpinfo()时候,执行了php代码
  • assert为要调用的函数,phpinfo为该函数调用的参数

动态函数执行

  • 由于PHP特性原因,PHP的函数可以直接由字符串拼接,这导致了PHP在安全的控制又加大了难度,比如增加了漏洞数量和提高了PHP后门的查杀难度
  • 要找漏洞就要先理解为什么程序要这么写,不小知名的程序中也用到动态函数的写法,这种写法跟call_user_func的初衷是一样的大多用在框架里面用来更简单更方便的调用函数,但是一旦过滤不严格就会造成代码执行漏洞
  • PHP动态函数写法为 “变量(参数)”,我们来看一个动态函数后门的写法:
<?php
$_GET['a']($_GET['b']);
?>
  • 代码的意思就是接受GET请求的a参数,作为函数,b参数作为函数的参数,当请求a参数值为assert,b参数为phpinfo()的时候打印出phpinfo信息,请求如下:
  • php?a=assert&b=phpinfo()


要挖掘这种形式的代码执行,需要找可控的动态函数名

PHP-代码审计-代码执行相关推荐

  1. 代码审计:YCCMS 代码执行 文件上传 任意文件删除

    代码审计:YCCMS 代码执行 文件上传 任意文件删除 YCCMS 审计准备 代码审计 代码执行漏洞 文件上传漏洞 任意文件删除漏洞 YCCMS YCCMS是一款PHP版轻量级CMS建站系统,程序页面 ...

  2. 第二阶段 PHP代码审计之代码执行

    文章目录 一.代码执行原理 1.1 代码执行示例代码 二.代码执行相关函数 三.代码执行代码审计总结 一.代码执行原理 为了代码的灵活性与简洁性,会适当调用PHP中的一些代码执行函数来完成一些系统的功 ...

  3. 代码审计-php代码执行

    作者:小刚 一位苦于信息安全的萌新小白帽,记得关注给个赞,谢谢 本实验仅用于信息防御教学,切勿用于其它用途 php代码执行 前言 什么是代码执行,命令执行 1.eval assert导致的代码执行 2 ...

  4. 代码审计之代码执行注入

    1#基础了解 今天简单的了解了一下代码执行,就是在php里面有一些函数将输入的字符串参数当作PHP程序代码来执行. 常见的代码执行函数:eval().assert().preg_replace() e ...

  5. 代码审计之CVE-2017-6920 Drupal远程代码执行漏洞学习

     1.背景介绍: CVE-2017-6920是Drupal Core的YAML解析器处理不当所导致的一个远程代码执行漏洞,影响8.x的Drupal Core. Drupal介绍:Drupal 是一个由 ...

  6. 【代码审计】DouPHP_v1.3代码执行漏洞分析

      0x00 环境准备 DouPHP官网:http://www.douco.com/ 程序源码下载:http://down.douco.com/DouPHP_1.3_Release_20171002. ...

  7. 【代码审计】CmsEasy_v5.7 代码执行漏洞分析

      0x00 环境准备 CmsEasy官网:http://www.cmseasy.cn/ 网站源码版本:CmsEasy_v5.7_UTF8-0208 程序源码下载: http://ftp.cmseas ...

  8. cve-2019-1821 思科 Cisco Prime 企业局域网管理器 远程代码执行 漏洞分析

    前言 不是所有目录遍历漏洞危害都相同,取决于遍历的用法以及用户交互程度.正如你将看到,本文的这个漏洞类在代码中非常难发现,但可以造成巨大的影响. 这个漏洞存在于思科Prime Infrastructu ...

  9. thinkcmfx漏洞太大_ThinkCMF5 代码执行漏洞及后续有关思考

    摘要 修改配置时,大多数情况下都会对配置文件/缓存文件/数据库进行操作,而在这个过程中不论如何实现,几乎都会对"管理员" 所做的修改输入有过滤.当绕过了这些过滤方法之后,通常可以达 ...

  10. php 168任意代码执行漏洞之php的Complex (curly) syntax

    今天了解了php 168的任意代码执行漏洞,Poc: http://192.168.6.128/pentest/cms/php168/member/post.php ?only=1 &show ...

最新文章

  1. cocos2d-x 从onEnter、onExit、 引用计数 谈内存泄露问题
  2. android 校讯通 源码,校讯通Android版使用说明.doc
  3. 水鱼 学习回顾 <1>
  4. 有关提高visual studio开发效率的方法
  5. HttpURLConnection与 HttpClient 区别/性能测试对比
  6. HDU4612 Warm up
  7. web 三联发票针式打印_打印机共享操作,其实没想象的那么难
  8. Java不是true值不变_Java语言中String a=a;String b=a; 为什么 a==b 值为 true?
  9. 工作中,我们经常用到哪些SQL语句呢?
  10. 用TF实现线性回归模型。
  11. 关于写论文的小技巧[一]:公式编号
  12. 计算机磁盘管理打不开,教你怎样轻松解决磁盘打不开的问题
  13. Robocup 仿真2D 学习笔记(一) ubuntu16.04 搭建 robocup 仿真2D环境
  14. 班章管家分享五一假日什么理财产品会有收益?五一假日理财攻略
  15. Webpack 理解 Chunk
  16. 【线段树合并】【bzoj4399】: 魔法少女LJJ
  17. STM32存储器知识的相关应用(IAP、Bit Banding)
  18. Android 设置铃声——给app设置自定义铃声功能
  19. android购票日历,2017春运购票日历
  20. 二值化最佳阈值选取方法以及matlab实现

热门文章

  1. 『ACM C++』 PTA 天梯赛练习集L1 | 016-017
  2. Map实现java缓存机制的简单实例
  3. UVA - 12083 Guardian of Decency (二分匹配)
  4. .net开发人员应该知道(一)
  5. 谈搜索架构师的不同阶段
  6. java中数值023是什么类型_【Java 教程(原创)】023.参数传值——引用类型参数的传值...
  7. 自动发现_清华发布首个自动图学习框架,或有助于蛋白质建模和新药发现
  8. python 钉钉消息推送_python3实现钉钉消息推送的方法示例
  9. Linux nano编辑txt文件,Linux 文本编辑器 nano 的简单使用
  10. c#对象集合去重_C# List 对象去重