html注入 绕过域名检查,HTML注入:利用HTML标签绕过CSP

先让我们看看如下这个web应用示例:

content="script−src 'nonce−...' 'unsafe−eval'">

Hello World! 1 + 1 = {{ 1 + 1 }}

Your search is <?php echo $_GET['q']; ?>

let template = document.getElementById('template');

template_target.innerHTML = template.innerText.replace(/{{(.∗)}}/g,eval)

以上这段简单的HTML代码可能反映了现在渗透测试人员经常碰到的模板化Web应用。某些模板内容存储在Web页面中,然后再转换为HTML代码的一部分。上段代码中含有id为template的HTML元素内容先被读取,然后再执行{{}}括号内的内容,最后在某个单独HTML元素中呈现出来。

Hello World! 1 + 1 = 2

Your search is ...........

其次,这段代码应用程序会在页面上打印URL中的参数值。这显而易见是一个XSS漏洞,但由于CSP(内容安全策略)的存在,攻击者并不能直接执行javascript。虽然直接运行javascript的路被堵死,但是我们可以找到其他绕过方法。

乍一看,貌似eval函数是一个可以利用的点,我们或许可以直接插入某些特制代码,让eval函数去执行。

为了实现这点,我们必须插入HTML元素中id为template的代码。但在我们插入语句的前面已有id为template的HTML元素,而document.getElementById('template')只会去获取第一个HTML元素,并不是我们所输入的语句。

此刻,我们需要换个角度,看看浏览器是否能出现“意外”,以前就出现过很多浏览器的异常解析所导致的XSS攻击。我把所有能使用的tag都收集起来进行测试,看看是否有惊喜。测试代码如下:

First Tag

{% for tag in tag_list %}

{{tag}}{{tag}}>

{% endfor %}

当程序运行完毕时,我得到一个奇怪的结果:当轮到时,页面结构似乎发生了大变,此时已不再是

排在前面。让我们看下当插入时的变化:

14b37f5c3bdd

此时已排在文档顶部(在我所测试的所有浏览器中都是如此!),现在getElementById('template')将获取中的恶意数据,而不是

的内容。

只需简单的?q={{ alert("xss") }}就可进行攻击

最终,由于浏览器这个“莫名其妙”的特性,我们绕过了CSP成功进行了XSS攻击!

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场

来源:https://pagedout.institute/download/PagedOut_001_beta1.pdf(该PDF文档的第62页)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值