DVWA笔记(2)--Command Injection(命令注入)

command injection

简单说说命令注入:

命令注入,即是php通过各种能够执行系统命令的函数,如exec,shell_exec等,来执行外部输入的不可靠的命令。严重的服务器可以被控制,一般被黑客配合文件上传来控制靶机。防御命令注入其实很简单,只要不使用php危险函数就可以了,更彻底的话,在php.ini中禁止危险函数即可。

Low

页面:

乍一看,是用来ping某个ip的

正常使用一下

确实是用来ping的。

ping命令是通过cmd来运行的。所以这就是命令注入漏洞。我们可以通过这个漏洞来得到该主机的控制权。那我们就用新建用户来测试吧。

 

cmd中新建用户的命令: net user username /add

cmd中,可以通过&符号来分割两条命令。如:

net user & net user xiaopan233 /add

意思是先查看当前用户,接着再新建用户。所以我们可以利用这个特性来注入。

根据上图我们可以猜测。这个执行的命令是ping 192.168.1.1。所以我们可以这样子输入

192.168.1.1&net user xiaopan233 /add

我们到靶机那里看看

发现确实注入成功了。

来看看源码:

发现并没有进行安全过滤。所以一下就可以注入了

 

Medium

和low一样的注入。输入

192.168.1.1&net user xiaopan234 /add

也成功执行了。我们去靶机那里看看

发现也成功注入。。。那么medium和Low有什么区别嘛。。。看看源码

原来它是过滤了&&。。。通过str_replace来去掉&&。然鹅我用的是&来分割。这就绕过了。。

百度了一下。原来cmd中有三种方式分割命令。&  &&  ||

&是不管前后命令是否执行成功都会执行前后命令

&&是前面的命令执行成功才能执行后面的命令

||是前面的命令执行不成功才能执行后面的命令

涨知识了。。。       

 

high

知道了cmd有三种分割方式,那么我们就可以围绕这三种方式来绕过。

逐个测试

&:

可以看到是乱码,我们到kali的火狐里面看。因为可以调字体。

在meau ---> more --->Text Encoding 。选择中文简体

说明&被过滤了。

 

&&:

 

&&也被过滤了。

||:

使用||的时候要注意,||是前面语句执行错误才能触发后面的语句。所以我们输入的ip要故意弄错。我们输入:

asdf || net user xiaopan235 /add

因为ip是数字加点。弄个字母上去就会报错

成功绕过了,我们去靶机那里看看是否新增成功

 

看看源码吧。。(估计过滤时就是加了一个&的黑名单。。。)

可以看到不是只加了一个&。。。我们看到居然有||,但我们还是成功绕过了。估计是我打的时候||与语句之间有空格。测试一下没有空格会怎么样。

看来成功过滤了。去掉||,所以变成了asdfnet。那么为什么加了空格就能绕过呢。我们仔细看可以看到。过滤的数组中|多了一个空格!

而又因为str_replace的特性,它替换数组时是从上到下替换的(即在上面的数组中,从”&”开始一个个查找)。所以当打了空格的时候。”| ”比”||”先匹配到。所以我们的” || ”就变成了” |”。”| ”变为了空。如下图:

 

而|在cmd中是管道符。将前面的语句的输出作为后面语句的输入。就像linux的|一样。实例:

查看cmd进程。

所以我们可以通过这个特征,使用管道符,也可以绕过。

 

impossible

不可能级别。。之间看源码吧。。

先是通过stripslashes去掉了反斜杠\。

然后通过explode按点拆分ip地址。逐个判断是否为数字。这就防止了打字母来触发错误。并且就算想通过&&或者&来绕过,因为已经通过explode拆分了。所以最后一个肯定不是数字,就无法通过了。

 

猜你喜欢

转载自blog.csdn.net/xiaopan233/article/details/86763607
今日推荐