变量覆盖漏洞——parse_str()函数

  函

<>强作用是:将字串符数引起的变量覆盖漏洞

  函
 <代码>作用是:将字串符数用于把查询字符串解析到变量中,如果没有数组参数,则由该函数设置的变量将覆盖已存在的同名变量。极度不建议在没有数组参数的情况下使用此函数,并且在PHP 7.2中将废弃不设置参数的行为。此函数没有返回值 
  

<强>一、分析题目源码:

  

变量覆盖漏洞——parse_str()函数

  

1, error_reporting()函数规定不同级别错误,这里为关闭错误报告

  

2中将()函数,别名中将()高亮显示文件。

  

3,空()函数姜茶一个变量是否为空,所以动我们发送请求的时候一定带有id参数

  

4,包括(flag.php)调用flag.php文件,应该就是存放国旗的文件

  

5, @parse_str ($ id)把查询字符串解析到变量中,没有使用数组选项,若有同名变量,将原来的覆盖。这里明显将原来的美元一个的值给覆盖掉。

  

6美元[0]!=甉NKCDZO’,,md5(美元[0])==md5 (QNKCDZO)判断一个美元[0]的值不是QNKCDZO并且一美元[0]的md5值要和QNKCDZO的md5值相同。我们知道很难找出这样的字符串。

  

<强>二、构造我们的有效载荷

  

整体源码已经分析过了,现在唯一要做的就是需要找出字符串不同,但MD5值相同的值。这很难找出。这个时候可以利用php处理MD5哈希字符串的缺陷进行处理。

  
 <代码>缺陷的原理:利用php弱语言特性。“10”==? e1”吗?这样看是不等于的,但是到了php处理的时候,他会将1 e1看做科学计数法来计算1 e1=1 * 10 ^ 1=10,那这样是不是就相等了。 
  

题目这里给出的QNKCDZO的MD5值为:0 e830400451993494058024219903391。经过php处理后会认为0 * 10 ^ n。所以结果为零。

  

所以,我们可以找到字符串MD5加密后结果开头为0 e的即可。这里有篇文章记录了很多这样的字符串:http://www.cnblogs.com/Primzahl/p/6018158.html
所以我们的有效载荷为
? id=[]=s878926199a (s878926199a的MD5值为0 e开头的字符串)
<强>三、测试结果。

  

将负载用得到方法传输:

  

变量覆盖漏洞——parse_str()函数

  

得到国旗哈。

变量覆盖漏洞——parse_str()函数