简介
定义
当应用在调用一些能将字符串转化成代码的函数时,未考虑用户是否能够控制此字符串,从而产生代码注入漏洞
在
php
中:eval
assert
preg_replace('/*/e','$ret="\\1";',$data);
在
asp
中:eval
execute
executeglobal
在
jsp
中:
jsp中没有php中的eval
函数,但是可以使用反射机制,使用基于反射机制的表达式引擎,例如:0GNL
、SpEL
、MVEL
等
漏洞存在原因
应用有时会考虑代码的简洁性、灵活性,在代码中调用eval
之类的函数。
即:应用的所有配置都在数据库中存储,通过此函数,直接读取配置,而不需要使用正则之类的来一点一点读取配置
例如在phpcms
中使用string2array()
:1
2
3
4
5
6
7
8# $data表示字符串数组
function string2array($data) {
if($data == '') {
return array();
}
@eval("\$array = $data;");
return $array;
}
漏洞利用
查找漏洞站点
例如:
由于thinkphp
存在代码执行漏洞,可以使用Google Hacing
搜索此类网站1
inurl:think.php
学会代码审计技巧,自行寻找
利用
简单代码执行:1
2
3
4
5<?php
$data = $_GET['data'];
eval("\$ret = strtolower(\"$data\");");
echo $ret;
?>
利用方式:
其中 ${}
代表变量1
2
3$data=1");phpinfo();//
http://localhost/?data=${phpinfo();}
http://localhost/?code=${@eval($_POST[1]);}
防御
常用方法
- 使用
json
保存数组,当读取时就无需使用eval
了 - 对于必须使用
eval
的地方,一定严格处理用户数据(黑、白名单) - 字符串使用单引号包括可控代码,插入前使用
addslashes
转义(addslashes
、魔术引号
、htmlspecialchars
、htmlentities
、mysql_real_escape_string
) - 放弃使用
preg_replace
的e
修饰符,使用preg_replace_callback()
替换 - 若必须使用
preg_replace
的e
修饰符,则必须使用单引号包裹正则匹配出的对象(preg_replace
+正则
)
命令执行
漏洞危害
- 继承Web应用程序的权限,执行系统命令
- 读写文件
- 反弹Shell
- 控制整个网站和服务器
- 进行内网渗透
Jsp的Strtus2框架
strtus2
框架一直出现安全问题,大多都是命令执行问题
例如:s2-037
、s2-045
、s2-048
等
可以去github寻找poc
和exp
防御方法
- 尽量不使用系统执行命令
- 在进行执行命令函数方法之前,变量一定要做好过滤,对敏感字符进行转义
- 在使用动态函数之前,确保使用的函数是指定的函数之一
- 对PHP语言来说,不能完全控制的危险函数最好舍弃
常用系统命令与功能
Windows下同时执行多条命令
语法格式:
命令格式 | 含义 |
---|---|
command1 & command2 |
顺序执行1、2,无论1执行否成功 |
command1 && command2 |
顺序执行1、2,只有1执行成功时才执行2 |
command1 $temp2 command2 | 顺序执行1、2,只有1执行失败时才执行2 |
command1 $temp1 command2 | 管道符,将1的执行作为输入传递给2 |
由于MarkDown表格语法对管道符|
冲突,此处
$temp2 代表 ||
$temp1 代表 |
Linux下同时执行多条命令
命令格式 | 含义 |
---|---|
command1 ; command2 |
顺序执行1、2,无论1执行否成功 |
command1 && command2 |
顺序执行1、2,只有1执行成功时才执行2 |
command1 $temp2 command2 | 顺序执行1、2,只有1执行失败时才执行2 |
command1 $temp1 command2 | 管道符,将1的执行作为输入传递给2 |
由于MarkDown表格语法对管道符|
冲突,此处
$temp2 代表 ||
$temp1 代表 |
补充
单引号内变量不传值
启动魔术引号gpc后,单引号会被转义
php弱类型,去数字1abcd只取第一个‘1’
使用/e参数会先执行再匹配,导致危险代码执行
preg_replace(“/test/e”,$data,”test”);
Kali破解Hash
1 |
|