代码执行漏洞
概述
当应用在调用一些字符串转化为代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码注入漏洞(代码执行漏洞)
代码执行常见函数
PHP eval()、assert()、preg_replace()
python eval
Java 没有类似于前面两者的函数,但是有反射机制,并且有基于反射机制的表达式引擎,如:0GNL、SpEL、MVEL 等
代码执行漏洞例子
动态代码执行漏洞
动态代码执行漏洞,在程序开发过程中,需要用动态调用函数,如果参数可控的情况下,会造成代码执行漏洞。
<?php
function m_print(){
echo '这是一个页面';
}
$_GET['a']($_GET['b']);
?>
查看 php 信息 assert 可以执行 php 里面的一些函数比如 phpinfo()
eval代码执行漏洞
<?php
$data = isset($_GET['data'])?$_GET['data']:'这是一个 eval 漏洞页面';
@eval($ret = $data);
echo $ret;
?>
eval — 把字符串作为 PHP 代码执行
正则代码执行漏洞
preg_replace 使用了 /e 模式,导致可以代码执行
<?php
$data = $_GET['data'];
preg_replace('/<data>(.*)</data>/e','$ret = "\1";',$data);
?>
<form>
<label>请输入你的数据</label>
<input type='text' name='data'/>
<input type='submit' value='提交'/>
</form>
<data>{${phpinfo()}}</data>
代码执行的攻击方法
代码执行漏洞是一种很严重的漏洞,因为能注入执行脚本代码,所以利用的手段很多,常见的执行命令,获取敏感信息,写入 web 后门等
phpinfo();
fputs(fopen("shell.php","a"),"<?php phpinfo();?>");
代码执行的防御方法
1、使用 json 保存数组,当读取时就不需要使用 eval 了
2、对于必须使用 eval 的地方,一定严格处理用户数据(白名单、黑名单)
3、字符串使用单引号包括可控代码,插入前使用 addslashes 转义(addslashes、魔数引号、htmlspecialchars、 htmlentities、mysql_real_escape_string)
4、放弃使用 preg_replace 的 e 修饰符,使用 preg_replace_callback()替换(preg_replace_callback())
5、若必须使用 preg_replace 的 e 修饰符,则必用单引号包裹正则匹配出的对象(preg_replace+正则)
更新: 2025-05-05 09:48:29
原文: https://www.yuque.com/yuhui.net/network/kvcufnvpi60kwi3c

评论(0)
暂无评论