[学习笔记]Python模拟PHP弱比较

前言

最近在出题的时候,不知道为啥,做的php题目本地跑很正常,但是到平台上就跑不起来,后来我决定用python模拟了php弱比较漏洞,然后把代码分享给大家看看


代码

from flask import Flask, request
import hashlib
import os

app = Flask(__name__)
FLAG = os.environ.get('GZCTF_FLAG') //这是平台的Flag环境变量,大家可以根据自己的需求更改
st = """
<?php

$a = $_GET['a'];
$b = $_GET['b'];

if ($a !== null && $b !== null && $a != $b) {
    if (md5($a) == md5($b)) {
        echo $flag;
    }
} 
highlight_string($code);
?>
    """


def is_php_md5_collision(val):
    """检测是否符合 PHP 弱比较漏洞"""
    md5_hash = hashlib.md5(val.encode()).hexdigest()
    return md5_hash.startswith("0e") and md5_hash[2:].isdigit()


@app.route("/")
def challenge():
    a = request.args.get("a", "")
    b = request.args.get("b", "")

    if a and b and a != b:
        if is_php_md5_collision(a) and is_php_md5_collision(b):  # 模拟 PHP 的漏洞
            return f"代码在哪里?\n{st}\n{FLAG}"

    return f"代码在哪里?\n{st}\nERROR"


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

哈哈,这个问题很有趣。想象一下,当我期望返回的是php代码,实际上返回的是python代码,这种情况很有意思,简单的说一下PHP弱比较漏洞吧

漏洞讲解

获取两个变量a和b,然后判断他们是否是同一个值,如果是,就返回错误,否则就进行md5加密,然后就是著名的0e漏洞

因为处理hash字符串时,PHP会将每一个以 0E开头的哈希值解释为0,那么只要传入的不同字符串经过哈希以后是以 0E开头的,那么PHP会认为它们相同

参考链接:

1:【PHP】MD5比较漏洞 弱比较、强比较、强碰撞

2: PHP md5 相等绕过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值