Bugku-web之never_give_up

本文详细介绍了在Bugku平台的never_give_up挑战中,如何通过PHP代码审计找到解决方案。通过base64和URL解密获取关键代码,并解决关于id、a和b三个变量的复杂条件,最终利用PHP的弱类型特性、php://input和%00截断漏洞成功获取flag。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做到此题,深刻感慨,php代码审计还是很重要滴!!!要多学多做多看多练,继续加油!!!
刚打开题目,映入眼帘的就是“never never never give up!”……首先对源代码进行查看,发现了出题者提供的信息1p.html。
在这里插入图片描述
直接访问1p.html,发现又重定向到了bugku的网站……
在这里插入图片描述
发现方向可能有误,于是用burp对访问进行截获,并利用repeater进行send,发现了Response中的一段密文。
在这里插入图片描述
对获取的密文进行解密,首先进行base64解密,后再进行url解密。
在这里插入图片描述
解密后得到的完整代码如下图所示。根据源代码可知,需要通过get获取3个变量,且对于变量的要求前后存在矛盾,分别如下:
(1)id变量:最前面的if要求id变量不能为0(如若为0,则会直接跳转到hello.php文件且id=1,同时会退出源码的继续推进),但后面又要求id=0(在if语句$id==0中得知);
(2)a变量中不能含有字符’.’,且a变量的字符串应该为bugku is a nice plateform!,通过文件只读形式传入到data变量中;
(3)b变量长度大于5,字符串‘111’和b字符串首字符的拼接应该与’1114’相匹配,但是b字符的首字符不能为4。
在这里插入图片描述

只有解决了上述3个变量值的问题,才能如愿获取flag值,相应解决方法如下:

(1)id=0e123。php属于弱类型语言,在php语言中,出现 == 时,会首先将字符串转化为数值进行比较,因此0e123会被看作为0的123次方,结果仍然为零,会使得 $id==0 返回值为true,同时满足最初if的要求,通过get得到的id值并不为0;(此处id=0exxx均可)

(2)a=php://input,并在后续采用burp的repeater时输入bugku is a nice plateform!。因为源码中需要文件访问的形式来实现将a变量传输到data变量中,但是仅靠get是无法实现的。php://input 是个可以访问请求的原始数据的只读流,可以读取到post没有解析的原始数据, 将post请求中的数据作为PHP代码执行。因为它不依赖于特定的 php.ini 指令。 注:enctype=“multipart/form-data” 的时候 php://input 是无效的。

(3)b=%0012345。eregi函数是存在%00截断漏洞的。令$b=%0012345,不仅可以通过截断正则匹配满足了字符串‘111’和b字符串首字符的拼接应该与’1114’相匹配,而且%00作为首字符是不等于4的。
根据上述要求对url的payload进行构造,并采用burp进行截获并发送给Repeater模块,输入bugku is a nice plateform!后进行send,最终得到想要的flag值。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值