代码执行漏洞的原理
代码执行漏洞原理:
应用程序在调用一些能够将字符串转换为代码的函数(例如php中的eval中),没有考虑用户是否控制这个字符串,将造成代码执行漏洞。
PHP:eval assert
Python:exec
asp:<%=CreateObject(“wscript.shell”).exec(“cmd.exe/c ipconfig”).StdOut.ReadAII()%>
Java:没有类似函数,但采用的反射机制和各种基于反射机制的表达式引擎(OGNL、SpEL、MVEL等)有类似功能
代码执行漏洞的种类
代码执行函数
php中可以执行代码的函数有:
eval() eval('phpinfo();')参数为字符串,且满足php代码格式
assert()assert(phpinfo())参数为表达式或者函数
system()执行系统命令
exec()
shell_exec()
passthru()
pcntl_exec()
三种方式
这些函数中的参数(部分)可控时,则可能命令注入漏洞。通常会使用escapeshellarg对参数进行处理。
文件包含代码注入
当文件包含函数(include,include_once,require,require_once)中包含输入变量时,可能导致代码注射。
条件:allow_url_include=On,PHP Version>=5.2.0
访问:http://127.0.0.1/demo4.php?a=data:text/plain,<?php phpinfo(); ?>
可执行php命令
正则表达代码注入
原理:preg_replace()函数:当pattern中存在/e模式修饰符,匹配上时,即允许执行replacement中的命令。
preg_replace(Spattern,Sreplacement,Ssubject,Slimit,Scount)
搜索 subject中匹配 pattern的部分,以replacement进行替换。
参数说明:
$pattern:要搜索的模式,可以是字符串或一个字符串数组。
$replacement:用于替换的字符串或字符串数组。$subject:要搜索替换的目标字符串或字符串数组。
$limit:可选,对于每个模式用于每个subject字符串的最大可替换次数。默认是-1(无限制)
$count:可选,为替换执行的次数。
当参数3中有参数1的内容,则执行参数2的内容
动态代码执行
其他
代码执行漏洞的利用
代码执行漏洞审计实战
ZZZCMS
在模板管理中,进行修改添加
再次打开search目录:
源码分析:
找出问题点
查看调用点
网页调用点,定义的本机网站路径
调用点
代码执行漏洞的防御
- 使用json保存数组,当读取时就不需要使用eval了
- 对于必须使用eval的地方,一定严格处理用户数据
- 字符串使用单引号包括可控代码,插入前使用addslashes转义
- 放弃使用preg_replace的e修饰符,使用preg_replace_callback()替换
- 若必须使用preg_replace的e修饰符,则必用单引号包裹正则匹配出的对象