代码执行漏洞
程序员文章站
2022-07-15 15:46:13
...
原理
代码执行漏洞是指应用程序本身过滤不严,用户可以通过请求将代码注入到应用中执行。
相关函数
- eval()
- assert()
- preg_replace()
- call_user_func()
- call_user_func_arrary()
- arrary_map()
- 动态函数($a($b))
- 可变变量
形成原理
- eval()和assert(), 用于动态执行代码
<?php
assert($_GET['test']);
?>
-
preg_replace()函数, 对字符串进行正则处理
- preg_replace(pattern, replacement, subject)
- pattern: 要搜索的模式,可以是字符串或一个字符串数组。
- replacement: 用于替换的字符串或字符串数组。
- subject: 要搜索替换的目标字符串或字符串数组。
测试:搜索subject中匹配pattren的部分,用replacement替换。当pattren参数存在修饰符e时,replacement会被当成php代码执行。
<?php
preg_replace("/\[(.*)\]/e", '\\1', $_GET['test']);
?>
-
call_user_func()和array_map() 等函数,可调用其他函数。若其中参数作为调用的函数名,这个参数可控则可以执行代码。
测试:call_user_func() 把第一个参数作为回调函数调用
<?php
call_user_func($_GET['test'],'phpinfo()');
?>
array_map(),将自定义函数作用于每个数组成员中。
<?php
array_map($_GET['var'], array('phpinfo()'));
?>
同类函数
-
动态函数 执行,php函数可以由字符串拼接
测试:接受GET请求的a参数作为函数,b参数作为函数的参数。
<?php
$_GET['a']($_GET['b']);
?>
-
可变变量 一个变量名可以动态的设置使用
测试:双引号会解析中间的变量
<?php
$a="${@phpinfo()}";
?>
其中@不可省略,但可使用其他字符代替
- 空格:{ phpinfo()}";
- 注释符:{/**/phpinfo()}";
- tab:{ phpinfo()}";
- 回车换行符:{
phpinfo()}"; - 加号:{+phpinfo()}";
- 减号:{-phpinfo()}";
- 感叹哈:{!phpinfo()}";
- ~,\等
漏洞防御
- 尽量减少命令执行函数的使用,并在disable_functions 中禁用
- 在进入命令执行的函数或方法之前,对参数进行过滤
- 参数的值尽量使用引号包裹,并在拼接前调用addslashes 进行转义
- 关键字白名单