这几天通过在csdn大佬的blog上的学习,我也对我学习的内容做出以下总结和记录
关于php上的缺陷对比函数,关键在于对php语言的理解和对函数的理解,只有了解了这个函数的特性才能对该函数做出对应的操作。
首先,是==和===,在我看来也是很重要的一部分。==会对数据进行比较,但是不会对数据的类型进行比较,我的学习理解是,既然==只会是从左到右筛选数字,那么非数字部分(如字符)就会被筛选掉,从而达成绕过,因为比较简单所以显得不是很严谨。而===除了会对数据进行比较,还会对其类型进行比较,这就显得它比前者更为严谨,稍微更难绕过。而在MD5函数缺陷绕过时,二者的区别也显得更大,前者可以通过0e绕过来进行,而后者对MD5加密后的值比较,在比较数据的是同时还比较类型。这就需要我们从类型上也统一来进行绕过。
其次就是
1.intval函数:它会默认会将里面的数据转换成十进制整数,当base等于0时就根据数据的前缀进行进制转换。
2.strpos函数:第一个参数为搜索的字符串。第二个参数为要查找的字符串。第三个参数为从哪个位置开始查找。
3.in_array:第一个参数代表要在数组中搜索的值。第二个参数代表要搜索的数组。第三个参数如果不是true就代表不会监测数据类型,就等于是==,容易绕过。如果不判断数据类型,那么1.0 +1 1e 1x等皆==1
4.preg_match:只能处理字符串,如果不按规定传一个字符串,通常是传一个数组进去,这样就会报错。当输入正常数据时被正常过滤,这时就要进行输入数组进行绕过。(这个也出现在了开学考试中)
5.str_replace:第一个参数为要被替换字符。第二个参数被替换成的数据。第三个参数为被搜索的字符串。因为只能过滤一次,那就可以多写点被过滤的字符,也就是说如果参数为多个过滤字符的叠加,那么只会被过滤其中一个。
以web中的题目为例,通过robots协议,得到了网页的其他部分,通过提示,访问页面,得到了php代码
通过注释可知,这可能是一个包含的题目,并且有无法迭代过滤str_replace,那么也就是说,base为要被替换字符,被替换成的数据是“???”,被搜索的字符串是flie。那么也就是说在我们使用伪协议来构造payload时,base会被过滤。明白了这一点,我们就可以提前采取措施(绕过),来防止base被过滤导致的代码无效。
最终得到了flag
顺便记录下,php伪协议的代码
php://filter/read=convert.base64-encode/resource=index.php
php://filter/resource=index.php
纯小白,如有错误欢迎指正。