2.10命令行漏洞
1. 命令行漏洞概要
有些软件可以运行操作系统命令的,甚至可以允许用户输入命令行来运行操作系统命令。对于直接允许用户输入命令行,如果没有做有效的防范,用户可能操作一些超越自己权限的命令从而获得该用户原本不可知道的信息。对于间接运行命令行,可以接包后修改来实现。下面命令在运行ping命令以后,运行netuser命令获得当前服务器上的所有用户名。
C:\Users\xiang>ping 192.168.1.3 && net user 正在 Ping 192.168.1.3 具有 32 字节的数据: 来自 192.168.1.3 的回复: 字节=32 时间<1ms TTL=128 来自 192.168.1.3 的回复: 字节=32 时间<1ms TTL=128 来自 192.168.1.3 的回复: 字节=32 时间<1ms TTL=128 来自 192.168.1.3 的回复: 字节=32 时间<1ms TTL=128 192.168.1.3 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 0ms,最长 = 0ms,平均 = 0ms \\DESKTOP-9A8VFKB 的用户帐户 ------------------------------------------------------------------------------- Administrator DefaultAccount Guest WDAGUtilityAccount xiang
命令成功完成。
2. PHP命令执行
1)通过eval()函数执行命令
index.php <?php eval($_REQUEST['code']); ?>
打开浏览器,在URL中输入:http://www.mydomain.com/.../index.php?code=phpinfo(),
phpinfo()命令被触发,浏览器显示phpinfo信息,见31所示。
31 phpinfo()命令被触发
2)动态函数执行
如下PHP代码。
<?php $fun=$_GET['fun']; $par=$_GET['par']; $fun($par); ?>
打开浏览器,在URL中输入:http://www.mydomain.com/.../index.php?fun=system&par=netuser,页面上显示:
\\DESKTOP-9A8VFKB ���û��ʻ� ---------------------Administrator DefaultAccount GuestWDAGUtilityAccount xiang ����ɹ���ɡ�
相当于执行了system("net user")命令。
3)通过preg_replace()、ob_start()、array_map()函数执行命令
- preg_replace():执行一个正则表达式的搜索和替换。
- ob_start():打开输出缓冲区,所有的输出信息不在直接发送到浏览器,而是保存在输出缓冲区里面,可选回调函数用于处理输出结果信息。
- array_map():将函数作用到数组中的每个值上,每个值都乘以本身,并返回带有新值的数组。
利用这三个函数也可以执行命令,比如。
<?php $arr = $_GET['arr']; $array = array(1,2,3,4,5); $new_array =array_map($arr,$array); ?>
打开浏览器,在URL中输入:http://www.mydomain.com/.../index.php?arr=phpinfo,
phpinfo被执行。
3. JAVA命令执行
JAVA执行命令的方法如下,
Runtime.getRuntime().exec(command); 或 newProcessBiulder().start(command) ; RunntimerTest.java代码如下。 importjava.io.InputStreamReader;//导包操作 import java.io.BufferedReader; public class RunntimerTest { publicstatic void main(String args[]) throws Exception { if(args.length==0) { System.exit(1); //没有参数就退出} Stringcommand = args[0]; Runtimerun= Runtime.getRuntime(); Processpro=run.exec(command);//执行命令 InputStreamReaderin = new InputStreamReader (pro.getInputStream()); BufferedReaderbuff= new BufferedReader (in); for(Stringtemp= buff.readLine ();temp!=null;temp=buff.readLine()){ //输出结果 System.out.println(temp);} buff.close(); in.close(); } }
编译成class文件后,用管理员身份启动命令行工具,运行。
java RunntimerTest “regedit”
regedit 注册表编辑器就被运行。
4. Python命令执行
Python执行命令的方法如下,不再详述。
os.system('command')
或
output = os.popen('command') print (output.read())
或
(status, output) =commands.getstatusoutput('command') print (status, output)
5. 案例分享
案例4-4 命令行漏洞
网络管理软件,功能为尝试对方机器是否可以连接,界面见32 所示。
32 网络管理软件之尝试对方机器是否可以连接
后台实现使用系统ping命令,当用户输入192.168.0.4,实际上执行了ping 192.168.0.4操作,系统把执行结果显示在页面上。当用户输入192.168.0.4&&netuser,实际上执行了ping192.168.0.4&& net user。命令行漏洞被触发。
6. 框架执行漏洞
历史上著名的框架执行漏洞有以下几个。本书不做过多介绍,有兴趣的朋友可以通过其他渠道查阅。
1)基于Java的框架执行漏洞
- Hiberate
- Spring
- Struts
2)基于PHP的框架执行漏洞
- ThinkPHP
3)基于C的框架执行漏洞
- Openssl 心脏出血
7. 命令行漏洞防护方法
命令行漏洞防护方法如33所示。
33 命令行漏洞防护方法
检查系统,如果系统不允许执行命令,命令行漏洞肯定不存在。如果允许执行命令,必须保证系统命令是固定的,而不是用户可以输入的,或者动态生成系统命令使用白名单过滤掉,不在白名单中的命令是不允许运行的。