代码执行漏洞的原理

代码执行漏洞原理:
应用程序在调用一些能够将字符串转换为代码的函数(例如php中的eval中),没有考虑用户是否控制这个字符串,将造成代码执行漏洞。
PHP:eval assert
Python:exec
asp:<%=CreateObject(“wscript.shell”).exec(“cmd.exe/c ipconfig”).StdOut.ReadAII()%>
Java:没有类似函数,但采用的反射机制和各种基于反射机制的表达式引擎(OGNL、SpEL、MVEL等)有类似功能
image.png

代码执行漏洞的种类

代码执行函数

  1. php中可以执行代码的函数有:
  2. eval() eval('phpinfo();')参数为字符串,且满足php代码格式
  3. assert()assert(phpinfo())参数为表达式或者函数
  4. system()执行系统命令
  5. exec()
  6. shell_exec()
  7. passthru()
  8. pcntl_exec()

三种方式
image.png
image.png
image.png
image.png
这些函数中的参数(部分)可控时,则可能命令注入漏洞。通常会使用escapeshellarg对参数进行处理。

文件包含代码注入

当文件包含函数(include,include_once,require,require_once)中包含输入变量时,可能导致代码注射。
条件:allow_url_include=On,PHP Version>=5.2.0
image.png

  1. 访问:http://127.0.0.1/demo4.php?a=data:text/plain,<?php phpinfo(); ?>
  2. 可执行php命令

image.png

正则表达代码注入

原理:preg_replace()函数:当pattern中存在/e模式修饰符,匹配上时,即允许执行replacement中的命令。
preg_replace(Spattern,Sreplacement,Ssubject,Slimit,Scount)

搜索 subject中匹配 pattern的部分,以replacement进行替换。
参数说明:
$pattern:要搜索的模式,可以是字符串或一个字符串数组。
$replacement:用于替换的字符串或字符串数组。$subject:要搜索替换的目标字符串或字符串数组。
$limit:可选,对于每个模式用于每个subject字符串的最大可替换次数。默认是-1(无限制)
$count:可选,为替换执行的次数。
image.png
当参数3中有参数1的内容,则执行参数2的内容

动态代码执行

image.png
案例:
image.png

其他

Array_map()将函数作用到数组中的每个值上
image.png

代码执行漏洞的利用

image.png

代码执行漏洞审计实战

ZZZCMS

在模板管理中,进行修改添加
image.png
再次打开search目录:
image.png
源码分析:
找出问题点
image.png
查看调用点
image.png
网页调用点,定义的本机网站路径
image.png
image.png
调用点
image.png

代码执行漏洞的防御

  • 使用json保存数组,当读取时就不需要使用eval了
  • 对于必须使用eval的地方,一定严格处理用户数据
  • 字符串使用单引号包括可控代码,插入前使用addslashes转义
  • 放弃使用preg_replace的e修饰符,使用preg_replace_callback()替换
  • 若必须使用preg_replace的e修饰符,则必用单引号包裹正则匹配出的对象