网站首页 > 技术文章 正文
先让我们看看如下这个web应用示例:
<html>
 <meta http?equiv="Content?Security?Policy"
 content="script?src 'nonce?...' 'unsafe?eval'">
 <div id="template_target"></div>
 <script type="application/template" id="template">
 Hello World! 1 + 1 = {{ 1 + 1 }}
 </script>
 Your search is <?php echo $_GET['q']; ?>
 <script nonce="...">
 let template = document.getElementById('template');
 template_target.innerHTML = template.innerText.replace(/{{(.?)}}/g,eval)
 </script>
</html>
以上这段简单的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都收集起来进行测试,看看是否有惊喜。测试代码如下:
<div id="template">First Tag</div>
 {% for tag in tag_list %}
 <{{tag}} id="template">{{tag}}</{{tag}}>
 {% endfor %}
<script>console.log(document.getElementById('template'));</script>
当程序运行完毕时,我得到一个奇怪的结果:当轮到<html>时,页面结构似乎发生了大变,此时已不再是<div>排在前面。让我们看下当插入<html id="template">时的变化:
此时<html>已排在文档顶部(在我所测试的所有浏览器中都是如此!),现在getElementById('template')将获取<html>中的恶意数据,而不是<div>的内容。
只需简单的?q=<html id="template">{{ alert("xss") }}</html>就可进行攻击
最终,由于浏览器这个“莫名其妙”的特性,我们绕过了CSP成功进行了XSS攻击!
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://nosec.org/home/detail/2860.html
原文:https://pagedout.institute/download/PagedOut_001_beta1.pdf(该PDF文档的第62页
白帽汇从事信息安全,专注于安全大数据、企业威胁情报。
公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-安全讯息平台。
为您提供:网络空间测绘、企业资产收集、企业威胁情报、应急响应服务。
猜你喜欢
- 2024-10-21 HTML制作网页先熟悉CSS(用html和css做网页教程)
 - 2024-10-21 HTML简单介绍及常见元素(html的元素组成部分有哪些?)
 - 2024-10-21 Go Web 框架 Gin 学习2 - 模板渲染的2种方式
 - 2024-10-21 HTML自定义组件(html 组件)
 - 2024-10-21 Html小知识总结(html基础总结)
 - 2024-10-21 你的HTML页面书写规范吗?必须知道的HTML书写规范
 - 2024-10-21 用C++写出HTML,使用web服务,可以免费搭建个人博客
 - 2024-10-21 【JavaScript】将执行上下文、作用域、闭包串联起来
 - 2024-10-21 7.HTML中的列表、引用和代码的使用
 - 2024-10-21 小白必看!Django 模板语言基础来啦
 
- 最近发表
 - 
- 聊一下 gRPC 的 C++ 异步编程_grpc 异步流模式
 - [原创首发]安全日志管理中心实战(3)——开源NIDS之suricata部署
 - 超详细手把手搭建在ubuntu系统的FFmpeg环境
 - Nginx运维之路(Docker多段构建新版本并增加第三方模
 - 92.1K小星星,一款开源免费的远程桌面,让你告别付费远程控制!
 - Go 人脸识别教程_piwigo人脸识别
 - 安卓手机安装Termux——搭建移动服务器
 - ubuntu 安装开发环境(c/c++ 15)_ubuntu安装c++编译器
 - Rust开发环境搭建指南:从安装到镜像配置的零坑实践
 - Windows系统安装VirtualBox构造本地Linux开发环境
 
 
- 标签列表
 - 
- cmd/c (90)
 - c++中::是什么意思 (84)
 - 标签用于 (71)
 - 主键只能有一个吗 (77)
 - c#console.writeline不显示 (95)
 - pythoncase语句 (88)
 - es6includes (74)
 - sqlset (76)
 - apt-getinstall-y (100)
 - node_modules怎么生成 (87)
 - chromepost (71)
 - flexdirection (73)
 - c++int转char (80)
 - mysqlany_value (79)
 - static函数和普通函数 (84)
 - el-date-picker开始日期早于结束日期 (76)
 - js判断是否是json字符串 (75)
 - c语言min函数头文件 (77)
 - asynccallback (87)
 - localstorage.removeitem (77)
 - vector线程安全吗 (73)
 - java (73)
 - js数组插入 (83)
 - mac安装java (72)
 - 无效的列索引 (74)
 
 
