科学计数法 [极客大挑战 2019]BuyFlag1

打开题目

科学计数法 [极客大挑战 2019]BuyFlag1_第1张图片

注意中说,我们需要买flag,首先必须是cuit的学生,其次必须输对正确的密码

查看源代码得到

科学计数法 [极客大挑战 2019]BuyFlag1_第2张图片

代码审计

  1. 首先,检查是否存在名为 'password' 的POST请求。

  2. 如果 'password' 存在,将其存储在变量 $password 中。

  3. 然后,检查 $password 是否为数字。如果是数字,会输出 "password can't be number"。

  4. 否则,如果 $password 的值等于 404,将输出 "Password Right!"。

is_numberic()是检测变量是否为数字或者数字字符串

我们用bp抓包

科学计数法 [极客大挑战 2019]BuyFlag1_第3张图片

说明user=0不是学生

那我们试试user=1

成功登录,但是还是需要输入正确的密码

科学计数法 [极客大挑战 2019]BuyFlag1_第4张图片

我们发现我们不仅仅要是学生,我们还要password正确且要有10800000000去买flag

100000000表示为1E+08

但是提示我们数字长度太长了

科学计数法 [极客大挑战 2019]BuyFlag1_第5张图片

那我们试试money=1e9

或者使用数组绕过money[]=1

 

payload:

password=404a&money=1e9

password=404a&money[]=1

password=404%20&money[]=1

科学计数法 [极客大挑战 2019]BuyFlag1_第6张图片

知识点:

这里猜测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 - 哔哩哔哩

你可能感兴趣的:(java,前端,开发语言)