什么是命令注入?
我的理解就是,由于一些web网站有一些执行系统命令的功能,但是没有对用户输入进行检测,导致存在一些漏洞。然后,攻击者利用这些漏洞与相关系统命令,构造相关语句,来获得自己想要的信息,或者执行一些敏感的操作。
基础的命令注入详解
在DVWA的界面,我们可以看到相应的表单提交代码。提交的方式是post密文传输。所以,对应的服务器端必然是用$_POST来获取浏览器端的表单数据。
正常情况下,攻击者都是不知道服务器源代码的,所以得进行一些测试。但是,如果攻击者有一定的网站开发经验,那么猜对的可能性就比较大。
由于我这里dvwa的防御等级调的是最低级,所以随便几个套路都能发现成功了。
比如:(看见红色的hello了吗?表示成功了)
还有加 | 这个一道杠的符号的,还有&&符号,等等,这些都是系统中的一些符号。
command1 && command2 先执行command1后执行command2
command1 | command2 只执行command2
command1 & command2 先执行command2后执行command1
这些都是常见的。
那么,这些漏洞的危害只有一个hello那么大吗?不是,根据这些漏洞既然能执行相关的系统命令了,那么就可以查看相应的系统信息了。
比如,我通过浏览器看到了自己linux系统上的文件有哪些:
这里有一个地方我比较感兴趣,就是,服务器端代码直接输出了结果,可是居然就是在表单下方显示结果,而不是在其他地方显示,这让我觉得有点特别。可能是我本人技术太差,还不懂。
当我把dvwa的防御等级变成中级的时候,发现有的命令注入方法提示失败了,打开源代码一看,原来是对输入进行了一些简单的过滤,相当于添加黑名单,但是黑名单又不够完善,所以依旧可以有一些漏网之鱼。
下面是低级和中级的代码对比:
补充:php_uname('s','WINDOWS NT')的相关参数意义
‘a’:此为默认。包含序列 “s n r v m” 里的所有模式。
’s’:操作系统名称。例如: FreeBSD。
‘n’:主机名。例如: localhost.example.com。
‘r’:版本名称,例如: 5.1.2-RELEASE。
‘v’:版本信息。操作系统之间有很大的不同。
‘m’:机器类型。例如:i386。
中级防御的情况下,只是加了不完善的黑名单罢了。所以用 | 来达到注入的目的完全可以。