看图说话:命令行注入(Command Injection)漏洞示例
1. 什么是命令行注入?
命令注入:利用可以调用系统命令的web应用,通过构造特殊命令字符串的方式,把恶意代码输入一个编辑域(例如缺乏有效验证的输入框)来改变网页动态生成的内容,最终实现本应在服务端才能工作的系统命令。一个恶意黑客可以利用这种攻击方法来非法获取数据或者网络资源。
命令注入攻击最初被关注到,是Shell命令注入攻击(所以最初也被称为Shell命令注入攻击),由挪威一名程序员在1997年意外发现的。
在黑客的世界,针对不同的软件系统,有各自特有的命令注入方式。最常见的命令注入攻击形式是SQL命令注入攻击(简称SQL注入),是指恶意黑客利用设计上的安全漏洞,把SQL代码粘贴在网页形式的输入框内,进而改变服务端数据。PHP应用程序中也有名为PHP命令注入攻击的漏洞——国内著名的Web应用程序Discuz!、DedeCMS等都曾经存在过该类型漏洞。
无论哪种形式,它们的攻击原理都是一样的。即当恶意黑客进入一个有命令注入漏洞的网页时,他们构造数据同时输入了恶意命令代码,因为系统对此并未过滤,恶意命令代码一并执行,最终导致信息泄露或者正常数据的破坏,甚至可能会导致恶意命令掌控该用户的电脑和他们的网络。
命令行注入攻击中常用的命令拼接符:
常见的拼接命令:
ipconfig 查看本地网络net user 查看系统用户dir 查看当前目录find 查找包含指定字符的行whoami 查看系统当前有效用户名
&,&&,|,||命令拼接符的区别
A&B
拼接,A和B之间无制约关系
A&&B
A执行成功,之后才会执行B
A|B
A的输出作为B的输入
A||B
A执行失败,之后才会执行B
注:由于&在url中用于分隔参数所以在命令注入中需要转码为 %26
ipconfig 查看本地网络net user 查看系统用户dir 查看当前目录find 查找包含指定字符的行whoami 查看系统当前有效用户名&,&&,|,||命令拼接符的区别A&B拼接,A和B之间无制约关系A&&BA执行成功,之后才会执行B A|B A的输出作为B的输入 A||B A执行失败,之后才会执行B注:由于&在url中用于分隔参数所以在命令注入中需要转码为 %26
2. 实战演练
1、以下实际场景实验,打开靶机页面:
2、这是简单的ping功能页面,输入IP后,执行ping命令并返回内容,在“Enter an IP address: ”输入框里输入“127.0.0.1”,提交后,可以看到该命令正常执行后返回信息:
3、已知操作系统固有特点,使用连接符,可以执行多条指令:
代码语言:javascript复制command1 && command2 如果command1执行成功,则执行command2代码语言:javascript复制command1 | |command2 如果command1执行失败,则执行command2(实际连接符有多种组合方式,传说&和|两种连接符在windows和linux环境下都支持)
4、模拟攻击者,在“Enter an IP address: ”输入框里输入“127.0.0.1&&echo “hello world”” ,提交后,可以看到除了ping命令被正常执行外,echo “hello world”在最后被执行(hello world带着引号跑出来了,有点土啊):
5、模拟攻击者,在“Enter an IP address: ”输入框里输入“123||net user” ,提交后,可以看到ping命令执行失败,net user命令被执行:
6、一旦存在命令注入漏洞,攻击者就可以在目标系统执行任意命令,这通常意味着服务器被拱手让人。
3. 遗留问题
危害有哪些?世界上第一个命令注入攻击程序能随意地从一个网站删除网页,就像从本地磁盘删除文件一样简单;什么类型的网站会执行系统命令?或者说哪些web应用会成为攻击的目标群体?目前只知道域名查询类的网站会用系统命令执行用户提交的信息。接上一个问题,网站的什么部分会执行系统命令?发现漏洞,该如何最大化体现漏洞价值?(挖掘价值)利用完漏洞,该如何毁尸灭迹?(隐匿行踪)怎么防范?初步思路是白名单,具体实施方法还需要进一步研究。