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 |
&,&&,|,||命令拼接符的区别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、已知操作系统固有特点,使用连接符,可以执行多条指令:
command1 && command2 如果command1执行成功,则执行command2
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. 遗留问题