php过滤函数缺陷绕过

和=的缺陷绕过

=:赋值

==:对比值不对比值类型

===:对比值也对比值类型

举个例子:==的时候访问文件

传入1或者+1,1.0 ,1admin都可以获得flag


===的时候

就只有传参为1的时候才能输出flag

常见函数

1,md5:

使用==

传参?name=QNKCDZO&password=240610708,因为两个值MD5加密之后开头都是0e


使用===

传参?name[]=1&password[]=2  ,因为MD5使用===的时候判断不了数组,两个参数的值就会都为:null,成功相同

2,intval:获取变量的整数值


我们可以将666进行16进制转换:29a,在字符串前面加上0x:0x29a。或者小数绕过,因为参数只取整数值。

传参:?n=0x29a

3,strpos:查找字符串在另一字符串中第一次出现的位置。

传参:?h=%0a666

4,in_array:可以判断一个值是否在数组中

因为strict参数为false所以传递的参数可以不为同类型


5,preg_match:用于执行一个正则表达式匹配。


preg_match只能处理字符串,如果不按规定传一个字符串,通常是传一个数组进去,这样preg_match就会失效,产生报错。

6,str_replae:以其他字符替换字符串中的一些字符(区分大小写)


str_replace无法迭代过滤,传参:?s=sselectelect


只能过滤一次,双写绕过。

代码审计

源码内全局搜索函数str_replace,找到过滤代码,发现过滤../和./ 而且dir参数的值里需要有http。

只能过滤一次,双写绕过。

代码审计

源码内全局搜索函数str_replace,找到过滤代码,发现过滤../和./ 而且dir参数的值里需要有http。

确认过滤情况后,绕过过滤代码,遍历出数据库配置文件


抓包成功遍历出数据库配置文件

免责声明

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本平台和发布者不为此承担任何责任。