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);
?>
如果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