BUUCTF——[极客大挑战2019]BuyFlag1

相关过程:

上面说只有成信大的学生才可以购买这个flag,老样子,还是先查看一下源代码

在末尾处发现了被注释掉的PHP代码,这段这段代码的主要实现的功能如下:传参名为password,传参方式为post,password不能传入数字或数字字符串,当password为404时则密码正确,此时结合前面的信息可能才能pay money来获得flag,那么这里password里其实就是一个php弱相等。

这里想到前面的只有成信大的学生才可以购买flag,所以应该是要我们先获得一个学生的身份,那么这最有可能获得学生身份的可能就是通过更改cookie来越权。

可以看到在此网站的cookie里确实有一个user字段,接下来就是尝试修改它的值。

这里没有提示传参名和传参方式,但结合前面的来看,应该传参名是money传参方式是post,然后需要支付的金额为100000000(一亿)

结合回显来看,后端应该是使用了字符串比较的函数,而比较字符串大小的函数最可能的就是strcmp(),当然这里我也是后面看了别人的WP才学到的。总之,现在就有两种处理方式:

  1. 利用PHP5.3版本以前的strcmp()函数漏洞
  2. 科学计数法

方法一:

方法二:

相关知识点:

1.strcmp()函数缺陷

-影响版本:

  • PHP < 5.3

-漏洞表现:

  • strcmp()期望接收的两个参数的数据类型都是字符串类型,当接受到了其它数据类型的数据时就会报错并返回0使判断成立

-漏洞利用示例:

  • 当通过POST或GET进行传参时,PHP为了可以上传数组,会将变量名末尾以[]结尾的变量,例如abc[]=xxx,当作成一个以abc为名称的数组。所以对于 $_POST['password'] 当我提交的是 password[]=aaa 时,PHP就会接收到一个以password为名字,其中包含一个值aaa的数组。从而引发 PHP5.3 以前的 strcmp() 函数报错并返回0。

-PHP允许上传数组验证示例:

        //服务端代码

        $a = $_GET['cmd'];

        var_dump($a);

2.科学计数法:

对于1000,科学计数法可以写成1x10^3,可以用e来代替10,即写成1e3

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寄居动物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值