打开题目
注意中说,我们需要买flag,首先必须是cuit的学生,其次必须输对正确的密码
查看源代码得到
代码审计
-
首先,检查是否存在名为 'password' 的POST请求。
-
如果 'password' 存在,将其存储在变量
$password
中。 -
然后,检查
$password
是否为数字。如果是数字,会输出 "password can't be number"。 -
否则,如果
$password
的值等于 404,将输出 "Password Right!"。
is_numberic()是检测变量是否为数字或者数字字符串
我们用bp抓包
说明user=0不是学生
那我们试试user=1
成功登录,但是还是需要输入正确的密码
我们发现我们不仅仅要是学生,我们还要password正确且要有10800000000去买flag
100000000表示为1E+08
但是提示我们数字长度太长了
那我们试试money=1e9
或者使用数组绕过money[]=1
payload:
password=404a&money=1e9
password=404a&money[]=1
password=404%20&money[]=1
知识点:
这里猜测money长度太大是用了strcmp函数
- strcmp函数
两个字符串自左向右逐个字符相比(按 ASCII 值大小相比较)
strcmp(const char *s1,const char * s2) 这里面只能比较字符串,即可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数,返回值为正数,负数,0,字符串小返回-1,字符串大返回+1
正确会返回0
而我们传入money[]=1
因为strcmp函数无法处理数组,所以会报错返回值为0,从而实现绕过
- is_numberic()
是检测变量是否为数字或者数字字符串
- 计算机表达科学计数法
计算机表达10的幂是一般是用E或e,即
1.03乘10的9次方,可简写为“1.03E+09”的形式
-1.03乘10的9次方,可简写为“-1.03E+09”的形式
1.03乘10的-9次方,可简写为“1.03E-09”的形式
-1.03乘10的-9次方,可简写为“-1.03E-09”的形式
1.03e+09相当于小数点向右?移动了9位 1.0310^(9)
1.03e-09相当于小数点向左?移动了9位 1.0310^(-9)
相关文章链接:
科学计数法e/E?计算机?表示?_计算机 科学计数法 比较-CSDN博客
BUU[极客大挑战 2019]BuyFlag - 哔哩哔哩