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

这篇博客介绍了如何通过代码审计解决一个CTF挑战。作者分析了利用intval()和strrev()函数的特性来绕过输入验证限制,特别是通过构造特定数字格式如0.00%00、-0%00和0e00%00来满足题目条件,从而获取flag。博客还提到了一种失效的解题方法,可能因服务器位数不同而无效。
摘要由CSDN通过智能技术生成

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

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

8b297cc419fb6daa1cfa72a90c6f137e.png

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

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

6ae5d27af153f35ca2b8864c57b01b00.png

访问则拿到源码。。

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

8b4cac1aea22b121956ac5a3cdb7051b.png

intval()     返回变量得整数值

02eea766047a10a710962eb83119616f.png

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

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

90fb37b775c965485a29623665f9c542.png

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

ok,接下来说解题思路

四个限制条件

dc6ae6dc986dac9532c15870b65b09ad.png

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

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

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

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

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

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

4277511215c08489ef662061aa5d0fd9.png

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

2.number=0e00%00

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

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

6af813cb81382e1ad7933c644315b259.png

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值