十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
Parse_str()函数引起的变量覆盖漏洞
创新互联服务项目包括辰溪网站建设、辰溪网站制作、辰溪网页制作以及辰溪网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,辰溪网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到辰溪省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!parse_str() 函数用于把查询字符串解析到变量中,如果没有array 参数,则由该函数设置的变量将覆盖已存在的同名变量。 极度不建议 在没有 array参数的情况下使用此函数,并且在 PHP 7.2 中将废弃不设置参数的行为。此函数没有返回值
一、分析题目源码:
1、 error_reporting()函数规定不同级别错误,这里为关闭错误报告
2、 show_source()函数,别名highlight_file()高亮显示文件。
3、 empty()函数姜茶一个变量是否为空,所以动我们发送请求的时候一定带有id参数
4、 include(‘flag.php’)调用flag.php文件,应该就是存放flag的文件
5、 @parse_str($id)把查询字符串解析到变量中,没有使用array选项,若有同名变量,将原来的覆盖。这里明显将原来的$a的值给覆盖掉。
6、 $a[0] != 'QNKCDZO' && md5($a[0]) == md5('QNKCDZO')判断$a[0]的值不是QNKCDZO并且$a[0]的MD5值要和QNKCDZO的MD5值相同。我们知道很难找出这样的字符串。
二、构造我们的payload
整体源码已经分析过了,现在唯一要做的就是需要找出字符串不同,但MD5值相同的值。这很难找出。这个时候可以利用php处理MD5哈希字符串的缺陷进行处理。
缺陷的原理:利用php弱语言特性。“10”==“1e1”吗?这样看是不等于的,但是到了php处理的时候,他会将1e1看做科学计数法来计算1e1=1*10^1=10,那这样是不是就相等了。
题目这里给出的QNKCDZO的MD5值为:0e830400451993494058024219903391。经过php处理后会认为0*10^n。所以结果为零。
所以,我们可以找到字符串MD5加密后结果开头为0e的即可。这里有篇文章记录了很多这样的字符串:http://www.cnblogs.com/Primzahl/p/6018158.html
所以我们的payload为
?id=a[]=s878926199a(s878926199a的MD5值为0e开头的字符串)
三、测试结果。
将payload用get方法传输:
得到flag哈。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。