parse_str函数导致的变量覆盖问题

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

源码:

    1.<?php

    2.error_reporting(0);

    3.if (empty($_GET['id'])) {

    4.    show_source(__FILE__);

    5.    die();

    6.} else {

    7.    include (‘flag.php’);

    8.    $a = “www.OPENCTF.com”;

    9.    $id = $_GET['id'];

    10.    @parse_str($id);

    11.    if ($a[0] != ‘QNKCDZO’ && md5($a[0]) == md5(‘QNKCDZO’)) {

    12.        echo $flag;

    13.    } else {

    14.        exit(‘其实很简单其实并不难!’);

    15.    }

    16.}

    17.?> 

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哈希字符串的缺陷进行处理。
题目这里给出的QNKCDZO的MD5值为:0e830400451993494058024219903391。经过php处理后会认为0*10^n。所以结果为零。

所以,我们可以找到字符串MD5加密后结果开头为0e的即可。所以我们的payload为
?id=a[]=s878926199a(s878926199a的MD5值为0e开头的字符串)。关于md5的一些加密字符串请看:
MD5值为0e开头的字符串

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值