执行漏洞
执行漏洞分为: 代码执行漏洞和命令执行漏洞
一、代码执行漏洞
代码执行漏洞是程序能够调用函数, 将字符串转化为可执行代码, 且没有考虑到攻击者可以利用字符串, 造成代码执行漏洞。很难通过黑盒查找漏洞,大部分都是根据源代码判断代码执行漏洞
1. 相关函数:
PHP: eval、assert、preg_replace()、+/e模式(PHP版本<5.5.0)
Javascript: eval
Vbscript:Execute、Eval
Python: exec
Java: Java中没有php中eval函数这种直接可以将字符串转化为代码执行的函数,但是有反射机制,并且有各种基于反射机制的表达式引擎,如:OGNL、SpEL、MVEL等,这些都能造成代码执行漏洞。
2. 演示
有一个test.php程序:
<?php
eval($_GET['para']);
...
?>
意思接受参数para, 并且将para的值转化为php可执行文件, 是一种动态执行。(包含执行)
攻击者通过传递的参数来进行攻击:
http://www.***.com/test.php?para=phpinfo();
这样字符串phpinfo(); 就会被转化为php可执行命令执行, 当然攻击者还可以进行随心所欲的写入、越权操作甚至一句话木马等。
3. 引申
菜刀工具原理也是基于这个原理
4. 防范与修复
- 对于eval()函数一定要保证用户不能轻易接触eval参数或者用正则严格判断输入的数据格式。
- 对于字符串一定要使用单引号包裹可控代码,并且插入前进行addslashes()
- 对于preg_replace放弃使用e修饰符.如果必须要用e修饰符,请保证第二个参数中,对于正则匹配出的对象,用单引号包裹。
参考: 代码执行漏洞
二、命令执行漏洞
当应用需要调用一些外部程序时就会用到一些执行系统命令的函数。
1. 相关函数 (已php为例)
- system(args) 有回显
- passthru(args)(有回显)
- exec(args) (回显最后一行-必须echo输出)
- shell_exec(args) (无回显-必须输出)
- 反引号:``
- popen(handle,mode)(无回显)
- proc_open(‘cmd’,‘flag’,‘flag’)(无回显)
- $process = proc_open(‘dir’,$des,$pipes);
- echo stream_get_contents($pipes[1])
2. 演示
比如有一个test.php如下:
<?php
echo shell_exec($_GET['cmd']);
?>
接受para参数, 并且作为行命令执行:
http://www.***.com/test.php?cmd=ipconfig
3. 危害
- 盗取webshell, 执行系统命令, 读取文件等
- 反弹shell
- 控制整个网站甚至整个服务器
4. 防范
- 如在php.ini中的disable_function添加禁用高危函数
- 严格过滤关键字符