zoukankan      html  css  js  c++  java
  • BugKu之备份是个好习惯

    题目:备份是个好习惯

    思路分析

    打开题目,看到一个字符串。

    联系到题目,就猜到肯定是源代码泄露,用工具扫一下,发现了index.php.bak,验证了我的猜想,下载下来看看。

    <?php
    /**
     * Created by PhpStorm.
     * User: Norse
     * Date: 2017/8/6
     * Time: 20:22
    */
    
    include_once "flag.php";
    ini_set("display_errors", 0);
    $str = strstr($_SERVER['REQUEST_URI'], '?');
    $str = substr($str,1);
    $str = str_replace('key','',$str);
    parse_str($str);
    echo md5($key1);
    
    echo md5($key2);
    if(md5($key1) == md5($key2) && $key1 !== $key2){
        echo $flag."取得flag";
    }
    ?>
    

    源码审计

    关注到parse_str函数。

    parse_str — 将字符串解析成多个变量

    如果 string 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域(如果提供了 result 则会设置到该数组里 )。

    str_replace — 子字符串替换

    str_replace(
    mixed $search,
    mixed $replace,
    mixed $subject,
    int &$count = ?
    ): [mixed]

    该函数返回一个字符串或者数组。该字符串或数组是将 subject 中全部的 search 都被 replace 替换之后的结果。

    代码逻辑分析

    程序逻辑比较简单:

    1. 提取query string,并去掉?,保存为$str

    2. 使用str_replace$str中的key字符串替换成空格

    3. 使用parse_str$str中的变量解析出来

    4. 判断变量$key1$key2的md5,需要同时满足:

    • md5($key1) == md5($key2)

    • $key1 !== $key2

    所以做题思路也很简单,第一步,绕过str_replace。第二步,构造字符串绕过md5值比较。

    payload构造

    第一步payload:?kekeyy1=a&kekeyy2=a

    第二步payload:?kkeyey1=QNKCDZO&kkeyey2=240610708

    字符串不相等时如何构造md5相等?

    PHP中==是判断值是否相等,若两个变量的类型不相等,则会转化为相同类型后再进行比较。PHP在处理哈希字符串的时候,它把每一个以0e开头的哈希值都解析为0。

    在md5加密后以0E开头

    • QNKCDZO
    • 240610708
    • s878926199a
    • s155964671a

    在sha1加密后以0E开头

    • aaroZmOk
    • aaK1STfY

    获取flag

  • 相关阅读:
    Android虚拟、实体键盘不能同时使用?
    libwebsockets 运行问题
    Qt TabWidget QTabBar 宽高设置
    I.MX6 recovery mode hacking
    libwebsockets libwebsockets-webserver.c hacking
    MySQL(六)常用语法和数据类型
    MySQL(五)汇总和分组数据
    MySQL(四)字段及常用函数
    MySQL(三)用正则表达式搜索
    MySQL(二)数据的检索和过滤
  • 原文地址:https://www.cnblogs.com/zhuangshq/p/15512172.html
Copyright © 2011-2022 走看看