做到此题,深刻感慨,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值。