CTF学习笔记——[极客大挑战 2019]BuyFlag

一、[极客大挑战 2019]BuyFlag

1.题目

在这里插入图片描述

2.解题步骤

在这里插入图片描述
MENU界面下有buyflag的界面,按F12看看
在这里插入图片描述
查了一下is_numeric()这个函数,他的作用是判断输入是否是数字的。如果是纯数字返回true,如果不是返回false。这道题注释的代码逻辑是要输入一个非纯数字的字符串且等于404,密码才能正确。

然后顺手百度了一下这个函数的漏洞,在这里贴出来:

这个函数和mysql结合起来就容易出问题,那是因为is_numeric判断的时候,当碰到16进制数的时候,也会判断成数字

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

根据第二条的特性可以构造一个payload,404空格 这样的话is_numeric会判断成非数值,然后执行判断语句==404 ,进而得到flag。

但是试了半天没什么卵用…
发现题目提示我必须是CUIT的学生。这里有什么说法呢?
这里实在是不会了,看wp后发现cookie里设置了一个USER变量,他是0
在这里插入图片描述
这里随便改成1
在这里插入图片描述
他提示我是cuiter了。但是密码不对…对照了一下payload感觉一样嘞~仔细看了半天,原来是要post提交 大意了。
在这里插入图片描述
提示要交钱…再次提交money参数
在这里插入图片描述
money过长。师傅们提示是strcmp函数的锅。于是查一下这个函数的漏洞。
发现只有在PHP5.3之前才有的漏洞。这个函数在数据类型不匹配的时候会返回0,也就是和比较成功的结果是一样的。因此只要传入非字符串类型就可以了。师傅这里是传的数组。
在这里插入图片描述

3.总结
  1. burp的post提交真难用,还是火狐yyds!
  2. 了解了is_numeric()和strcmp()两个函数的漏洞。同时了解了通过判断PHP的版本和输入数据的长度来判断是否使用的strcmp。
  3. 学会了题到手看看cookie的“习惯”,同时还有把0改成1的“灵感”。
4.参考资料

猜你喜欢

转载自blog.csdn.net/Obs_cure/article/details/113820888