21.[极客大挑战 2019]BuyFlag

环境界面
一个简单的页面,看了下源码,发现了index.php和pay.php,发现在pay.php源码里有一段注释掉的源码:
代码片段
要求用post方法传参money和password,这里要求password等于404,并且password不能为数字,这里可以使用弱类型
令 password=404a
这里参考一篇我自己整理的关于php弱类型的总结文章:
然后通过HackBar提交参数:money=100000000&password=0,但是并没有任何我想看到的回显,这里再看看页面,发现自己漏掉了一句话:You must be a student from CUIT!!!
但是我没有找到相关的修改参数可能,于是直接用Burp抓包看下
post提交参数返回结果
发现有一个关键参数来自cookie:user=0,思考片刻,如果0代表False,那么1就是True,改一下参数试试看:
回显
这次说我是Cuiter并且密码也对了,但是又说我数字长度太长了,那就只剩下money这一个参数值了,再改改看。
说数字太长了,那我们我们就可以用科学计数法:1e10,测试得到了flag:
方法1
但是这里只是一个脑洞,其实还有一个比较靠谱的办法。
PHP=5.3.3
对字符处理的函数在PHP漏洞中非常常见,使用数组进行传参发现即可跳过判断。
money[]=1
方法2

知识点:
PHP中的strcmp漏洞
说明:

int strcmp ( string $str1 , string $str2 )

参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
可知,传入的期望类型是字符串类型的数据,但是如果我们传入非字符串类型的数据的时候,这个函数将会有怎么样的行为呢?实际上,当这个函数接受到了不符合的类型,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0

也就是说虽然报了错,但却判定其相等
PHP中的is_numeric()漏洞:

is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。所以,查看函数发现该函数对对于第一个空格字符会跳过空格字符判断,接着后面的判断!

最后修改:2022 年 03 月 08 日 05 : 32 PM
如果觉得这篇文章不错,不妨赏我碎银几两。