软件安全性测试(连载15)

简介: 软件安全性测试(连载15)

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所示。


image.png

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 所示。


image.png

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所示。


image.png

33 命令行漏洞防护方法


      检查系统,如果系统不允许执行命令,命令行漏洞肯定不存在。如果允许执行命令,必须保证系统命令是固定的,而不是用户可以输入的,或者动态生成系统命令使用白名单过滤掉,不在白名单中的命令是不允许运行的。

目录
相关文章
|
存储 安全 Java
软件安全性测试(连载24)
软件安全性测试(连载24)
130 0
软件安全性测试(连载24)
|
SQL 缓存 网络协议
软件安全性测试(连载23)
软件安全性测试(连载23)
126 0
软件安全性测试(连载23)
|
SQL 存储 安全
软件安全性测试(连载21)
软件安全性测试(连载21)
162 0
软件安全性测试(连载21)
|
存储 JavaScript 前端开发
软件安全性测试(连载3)
软件安全性测试(连载3)
114 0
软件安全性测试(连载3)
|
SQL 存储 Oracle
软件安全性测试(连载11)
软件安全性测试(连载11)
125 0
软件安全性测试(连载11)
|
缓存 安全 Java
软件安全性测试(连载22)
软件安全性测试(连载22)
125 0
软件安全性测试(连载22)
|
前端开发 JavaScript 安全
软件安全性测试(连载13)
软件安全性测试(连载13)
159 0
软件安全性测试(连载13)
|
存储 移动开发 算法
软件安全性测试(连载19)
软件安全性测试(连载19)
112 0
软件安全性测试(连载19)
|
SQL 安全 前端开发
软件安全性测试(连载9)
软件安全性测试(连载9)
119 0
软件安全性测试(连载9)
|
安全 程序员 网络安全
软件安全性测试(连载18)
软件安全性测试(连载18)
102 0
软件安全性测试(连载18)