PHP代码审计01之in_array()函数缺陷 (2)

用上面代码我们在本地将环境搭建好。然后开始分析,先看index.php文件代码。再第16行通过$_GET方法接收用户的输入,并用stop_hack()来过滤用户的输入,然后下方直接拼接到sql语句中进行查询。然后再向下看,这里这里用in_array()来进行一个简单的检查,我们发现它没有设置第三个参数,进行弱类型检查。现在我们来验证一下,眼见为实。根据我们上方白名单规则,我们现在id只能输入1~5。现在我们输入3来看一下,发现查询到了信息。

PHP代码审计01之in_array()函数缺陷


现在我们输入8,它不在白名单中,看看返回什么。

PHP代码审计01之in_array()函数缺陷


上面是正常的输入,所以白名单是有效的,下面我们构造payload,比如我们输入:1',发现程序报错,绕过了白名单的检查。可以直接报错注入。

PHP代码审计01之in_array()函数缺陷


而关于报错注入的函数,大约有四个,分别是:floor()、extractvalue()、updatexml()、exp()。
虽然绕过了白名单,但是还有过滤函数stop_hack()现在我们定位到这个函数看看:

PHP代码审计01之in_array()函数缺陷


发现过滤了一些危险函数,我们查看后发现,这里没有过滤updatexml()函数,可以用它,但是concat函数被过滤了,我们需要找到可以替换得函数了。这里我们使用make_set()函数,它的用法是make_set()函数是先将x转化成二进制,例如: 11的二进制为1011,将二进制顺序颠倒变成1101,每一位数再与后面的字符串相对应,为1的截取,为0的丢弃。如下图:

PHP代码审计01之in_array()函数缺陷


所以我们构造payload,获取数据,为了避免占用篇幅这里直接是获取到flag的payload。

and updatexml(1,make_set(3,'~',(select flag from flag limit 1)),1)

PHP代码审计01之in_array()函数缺陷

小结

通过这篇文章的讲解,是不是对in_array()理解更深了一些呢?下一篇文章会对filter_var函数缺陷导致的漏洞进行学习和分析,一起努力吧!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyzzg.html