2025-08-25-每日一题

[SEETF 2022]Sourceless Guessy Web
payload虽然简单,但是我没遇到的类型

题目给了附件源码index.php

点击查看代码
<?php
    ini_set('display_errors', 0);
    
    $flag =  "NSSCTF{FAKE_FLAG}"; // Oops, my dog ate my flag...

    if (isset($_GET['flag']) && preg_match("/^NSSCTF{.*}$/", $_GET['flag'])) {
        $flag = $_GET['flag'];

        if (isset($_GET['debug']) && isset($_GET['config'])) {
            foreach ($_GET['config'] as $key => $value) {
                ini_set($key, $value);
            }
        }
    }
    
    assert(preg_match("/^NSSCTF{.*}$/", $flag), NULL);
?>
这段 PHP 代码做了以下几件事: 检查 $_GET['flag'] 是否符合 NSSCTF{...} 的格式 如果符合,就把 $flag 变量设置为用户传入的值 最后用 assert() 断言 $flag 仍然符合这个格式

如果GET参数flag存在且匹配正则表达式/^NSSCTF{.*}$/,则将$flag设置为参数值。
如果同时设置了debug和config参数,则遍历config数组并通过ini_set设置PHP配置选项。

断言检查:assert(preg_match("/^NSSCTF{.*}$/", $flag), NULL); 使用断言验证$flag是否匹配正则表达式。如果preg_match返回false(0),断言失败。

那么对于preg_match可以通过设置pcre.backtrack_limit的回溯次数来进行绕过,如果设置为0,那么就说明不会进行匹配,将返回0,触发assert错误
通过设置assert.callback string断言失败后要调用的回调函数。
断言失败后,PHP调用设置的assert.callback函数,即readfile
通过设置assert.callback string断言失败后要调用的回调函数。

payload:

点击查看代码
?flag=NSSCTF{...}&debug=1&config[pcre.backtrack_limit]=0&config[assert.callback]=readfile

图片
图片

参考
https://gudiffany.github.io/2023/08/18/13-21-58/

posted @ 2025-08-25 15:24  xinghe123*  阅读(6)  评论(0)    收藏  举报