CTF-代码审计(3)..实验吧——你真的会PHP吗

连接:http://ctf5.shiyanbar.com/web/PHP/index.php

根据题目应该就是代码审计得题,进去就是

日常工具扫一下,御剑和dirsearch.py 无果

抓包,发现返回得响应头里面有提示

访问则拿到源码。。

有次听培训有个学长说,做代码审计看代码顺序,先去找flag在哪儿,快速找到直接从那儿开始看。

intval()     返回变量得整数值

strrev()  这个函数让字符串反序.

然后再来看代码里is_palindrome_number()得功能,函数得功能

就是看看这个输入这个字符是不是回文数,是就返回ture。(有时候如果看不懂函数得内容可以直接翻译函数得名字,一般是对得,哈哈哈) //    回文数就是   12321 1112111 这样的第i个和n-i个字符要相等。

ok,接下来说解题思路

四个限制条件

不得不说,CTF里得代码审计老是出这种矛盾得题,其实就是想让我们利用函数得漏洞绕过

第一个 is_numeric() 可以用%00绕过,可以输入数字,所以这里第一个条件和第二个条件通过。%00可以放在开头或结尾,%20只能放在最后。

三四个条件绕过得方法很多种

1.intval() 处理浮点数得时候直接返回整数,所以我们直接构造 number=0.00%00

 这样得话就可以满足第三个条件满足,因为0得反序也是0

但是代码里那个函数处理number得时候,是从第一位和最后一位相等,倒数第二位和第二位相等一次类推,所以我们直接构造0.00,0是不是回文数我不知道,但是第二位 '.'和倒数第二位’0‘是不同得,所以检测函数会判断它不是回文数,所以条件4也绕过,拿到flag。

类似这个0.00%00 得原理还有  ’-0%00‘

2.number=0e00%00

这个原理和上面一样,只是把0.00 换成科学记数法而已。

3.构造法3,这个构造法我去测试了发现不行,出处  https://blog.csdn.net/he_and/article/details/80615920

但是看了别人得wp发现以前是可以得。

能想出这个方法得人真是棒棒哦,也许题目就是想这么考得,因为32位最大就是 2147483647 ,value2得过程就是,先将2147483647反序,得到7463847412,而这个数字是大于2147483647这个数字得,所以intval()这个函数又会返回 2147483647,这样就使得value1和value2得值都相等了,而2147483647这个数又不是回文数,所以绕过四个条件。

但是这个方法不行了,我也不知道为什么.

如果服务器是64位操作系统这个方法则不行,因为9223372036854775807这个数反序后比最大小。

原文地址:https://www.cnblogs.com/tlbjiayou/p/11032388.html