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

打开题目

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

查看源代码得到

代码审计

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

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

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

  4. 否则,如果 $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 - 哔哩哔哩

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值