XSS漏洞挖掘

写在前面

文章内容参考自
https://twosecurity.io/
http://www.4hou.com/web/15212.html

文章主体来自https://twosecurity.io/的付费内容,并根据作者的基础进行了一定的增删,希望获取全部内容的读者可以前去支持。
文章的部分内容搬运自不同的博文,由于这篇文章总结梳理时间较长,遗忘了大部分网络资源的地址,如果你发现文章内容搬运自你的博客,请留言联系我。

一、XSS漏洞

常用测试payload

"'>

二、XSS的分类

反射型 XSS 漏洞的挖掘

(反射型XSS测试PAYLAOD)

a: ?name=

amber&age=1 b: ?name=amber&age=

在网页源码中查找 amber并查看h1<是否被转义

< >符号未被转义则将参数转换成svg

payload的进一步构造

存在源码中再添加内联事件执行语句


onload是指在加载该页面时就执行,然后观察是否有弹窗。

存储型 XSS 漏洞的挖掘

存储型XSS简单分类

存储型XSS分类

操作步骤

在 burpsuite 的 intercepter 模块下,点击「 Intercepter is off 」按钮开启请求拦截 ——>在网站可输入处写入 XXXXX 的字符串——>查看拦截请求,将XXXXX字符串替换为payload

替换的payload

click
Data URI,仅限 Firefox 下可以利用:
click
JS URI:

存储型XSS挖掘总结

存储型XSS挖掘总结

DOM XSS 漏洞的挖掘

与普通XSS不同的是,DOM XSS是在浏览器的解析中改变页面DOM树,且恶意代码并不在返回页面源码中回显,这使我们无法通过特征匹配来检测DOM XSS。


触发XSS的一种方式如下:
http://www.foo.com/xss.html#alert(1)
这个URL显然不会发送到服务端,仅仅是在客户端被接收并解析执行

页面跳转

页面跳转中常用的三种方式:

1)302跳转

2)Meta标签跳转

3)通过JS跳转,使用location.href、location.replace()、location.assign()。

在页面跳转时,如果使用第三种方式跳转,那么就可以通过javascript伪协议执行JS脚本。
注意前两种跳转方式是无法执行的。
所以在页面跳转时针对跳转URL要做检测,否则就容易造成XSS。

例如:


payload:http://192.168.192.120/1.html?url=javascript:alert(1)

取值写入页面或动态执行

接受用户输入,并通过DOM操作写入到当前页面中或者动态执行,也可以触发XSS





    
test
html

DOM XSS输入点

Location 当前网页的URL地址
window.name 当前网页 tab 的名字,它被不同的网站赋值,也就是说这个网页为window.name 赋值后再跳转到其它网站,window.name 的值依然不变
document.title 是当前网页的标题,可以在搜索框输入控制它的内容
document.referer 表示来路,表示从哪个网页URL访问过来的
postMessage 是HTML5 的一种跨域机制,但很多时候开发者没有正确的做来源检测,会导致 DOM XSS 的发生
location 它触发 JS 通常是以跳转到 JS URI 的方式执行
eval 是JS 内置的动态JS执行器
innerHTML 能为一个网页元素赋值
document.write 可以输出一个页面流
Function 能通过函数生成一个函数,可以传入动态JS代码
setTimeout 会延时执行JS代码
setInterval 表示循环执行 JS 代码

闭合问题

引号,尖括号闭合说明

举例

假设输入框源码:

其中value中的[?]是可输入部分

payload1:

value=" "autofocus/onfocus=alert(1)//">

autofocus:对象在加载完成后自动获得焦点
onfocus:事件在对象获得焦点时发生
第一个引号用于和value中的前一个引号闭合,结尾的//用于注释后面的语句,这样使得xss能被浏览器完整的解析
value=" "autofocus/onfocus=alert(1)//" "

payload2:

value=" ">

第一个引号和用于和value中的前一个引号闭合,>用于和input左边的<闭合,<用于和结尾处的>闭合
**

HTML标签下的情况

HTML标签下的XSS是一种最常见的情况,例如:




HTML Context


{{用户输入}}


可以使用以下payloads: