Low
stristr(string,search,before_search)
stristr函数搜索字符串在另外一字符串中的第一次出现,返回字符串的剩余部分(从匹配点),若是未找到所搜索的字符串,则返回 FALSE。参数string规定被搜索的字符串,参数search规定要搜索的字符串(若是该参数是数字,则搜索匹配该数字对应的 ASCII 值的字符),可选参数before_true为布尔型,默认为“false” ,若是设置为 “true”,函数将返回 search 参数第一次出现以前的字符串部分。
php_uname(mode)
这个函数会返回运行php的操做系统的相关描述,参数mode可取值”a” (此为默认,包含序列”s n r v m”里的全部模式),”s ”(返回操做系统名称),”n”(返回主机名),” r”(返回版本名称),”v”(返回版本信息), ”m”(返回机器类型)。
能够看到,
服务器经过判断操做系统执行不一样ping命令,可是对ip参数并未作任何的过滤,致使了严重的命令注入漏洞。
漏洞利用
window和linux系统均可以用&&来执行多条命令
先试试127.0.0.1&&dir
127.0.0.1&&net user (不知道为啥,我这net user命令不会执行,cmd都挺正常的)
ps
:在这里有必要说一下逻辑运算符“&”
和“|”
都是什么意思
&&
:表明首先执行命令a
再执行命令b
,可是前提条件是命令a
执行正确才会执行命令b
,在a
执行失败的状况下不会执行b
命令。因此又被称为短路运算符。
&
:表明首先执行命令a
再执行命令b
,若是a
执行失败,仍是会继续执行命令b
。也就是说命令b
的执行不会受到命令a
的干扰,在执行效率上来讲“&&”
更加高效。
||
:表明首先执行a
命令再执行b
命令,若是a
命令执行成功,就不会执行b
命令,相反,若是a
命令执行不成功,就会执行b
命令。
|
:表明首先执行a
命令,再执行b
命令,无论a
命令成功与否,都会去执行b
命令。
二、medium等级命令行注入
服务器端对ip参数作了必定过滤,即把”&&” 、”;”删除,本质上采用的是黑名单机制,所以依旧存在安全问题。
可是他并无过滤“|”
,因此咱们依然能够进行注入。
127.0.0.1|net user
127.0.0.1 &dir
127.0.0.1&;&ipconfig
High
黑名单看似过滤了全部的非法字符,但仔细观察到是把”| ”(注意这里|后有一个空格)替换为空字符,因而 ”|”成了“漏网之鱼”。
Command 1 | Command 2
“|”是管道符,表示将Command 1的输出做为Command 2的输入,而且只打印Command 2执行的结果。
127.0.0.1|net user
Impossible
stripslashes(string)
stripslashes函数会删除字符串string中的反斜杠,返回已剥离反斜杠的字符串。
explode(separator,string,limit)
把字符串打散为数组,返回字符串的数组。参数separator规定在哪里分割字符串,参数string是要分割的字符串,可选参数limit规定所返回的数组元素的数目。
is_numeric(string)
检测string是否为数字或数字字符串,若是是返回TRUE,不然返回FALSE。
能够看到,Impossible级别的代码加入了Anti-CSRF token,同时对参数ip进行了严格的限制,只有诸如“数字.数字.数字.数字”的输入才会被接收执行,所以不存在命令注入漏洞。