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拆分了。所以最后一个肯定不是数字,就无法通过了。