- Xss是一种针对网站应用程序的安全漏洞攻击技术。它允许恶意用户将代码注入网页,其他用户在浏览网页时就会受到恶意代码的影响。恶意代码执行后,恶意用户就可以拿到一些优先级较高的权限。主要的攻击目标就是内网渗透。xss在当今仍然是攻击内网的主要手段。
- Xss分类:反射型 Xss 存储型Xss DOM型Xss
反射型XSS,也叫非持久型XSS,是指发生请求时,XSS代码出现在请求URL中,作为参数提交到服务器,服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行。从概念上可以看出,反射型XSS代码是首先出现在URL中的,然后需要服务端解析,最后需要浏览器解析之后XSS代码才能够攻击。
这是一段可以提交到服务器端的Ajax代码。
html <textarea name="txt" id="txt" cols="80" rows="10"> <button type="button" id="test">测试</button> js var test = document.querySelector('#test') test.addEventListener('click', function () { var url = `/test?test=${txt.value}` // 1. 发送一个GET请求 var xhr = new XMLHttpRequest() xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) { // 3. 客户端解析JSON,并执行 var str = JSON.parse(xhr.responseText).test var node = `${str}` document.body.insertAdjacentHTML('beforeend', node) } else { console.log('error', xhr.responseText) } } } xhr.open('GET', url, true) xhr.send(null) }, false) express var express = require('express'); var router = express.Router(); router.get('/test', function (req, res, next) { // 2. 服务端解析成JSON后响应 res.json({ test: req.query.test }) })
现在在textarea区域内添加一段javascript代码。这个textare是发送给某一用户的。
<img src="null" onerror='alert(document.cookie)' />
下面就获取了触发xss漏洞的用户部分的信息
ip,cookie,访问端口,浏览记录,如果你在网上登陆过你的支付宝,这些个人信息都会呈现在这个页面中。
事实上真正黑客在运用xss漏洞时一定会注入一个第三方链接,以连接到他们的服务器,这样黑客就可以利用用户的cookie凭证做违法的事情了。
存储型Xss
之前反射型Xss只是对于单一用户的攻击,存储型Xss的危害要比前一种大很多,它是对于批量用户的攻击,假如一个论坛网站常驻用户为10万,那么一旦触发存储型Xss,这10万用户的个人信息都很容易被暴露。因为反射型Xss注入的代码只是存在于某一触发此漏洞用户的电脑中,而存储型Xss是寄存在服务器或数据库或网站核心文件中。
这种攻击方式多数会存在于留言板,论坛,或博客中。
浏览器如何区分我们输入的是数据还是代码。这要从浏览器解析原理说起,《计算机网络》这本书中曾解释过,浏览器在进行运算时,读取的是发送过来的数据,而不是代码。这里有一个简单的例子可以说明这个道理。
<?php $name=$_GET['name']; echo "welcome $name"; ?>
给name变量赋一个值,它会把这个值当做数据处理,但是假如注入一段代码。
系统就会把用户输入的这个数据当做代码去执行。自动解析为了一段js代码。因此Xss存在的原因就在于浏览器解析的数据而不是代码。
Xss漏洞不仅仅可以表现在弹窗上,当触发一个xss漏洞时,代码也会发生变化。
<html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <title>Xss利用环境构造代码</title> </head> <body> <center> <form action="" method="get"> <input type="text" name="xss_input_value" value="输入"> <br /> <input type="submit"> </form> <hr> <?php /** * Created by PhpStorm. * User: Administrator * Date: 2019/3/2 * Time: 2:17 */ if(isset($_GET['xss_input_value'])){ echo '<input type="text" value="'.$_GET['xss_input_value'].'">'; } else { echo '<input type=text value="输出">'; } ?> </center> </body> </html>
在输入框中输入正常数据时
后台代码
value值会做出相应改变,但是注入一段xss代码时
此时的xss会被解析为一段代码在程序中运行,因此也就发挥了触发攻击的作用。
XSS危害
- 通过document.cookie盗取cookie
- 使用js或css破坏页面正常的结构与样式
- 流量劫持(通过访问某段具有window.location.href定位到其他页面)
- Dos攻击:利用合理的客户端请求来占用过多的服务器资源,从而使合法用户无法得到服务器响应。
- 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
- 利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
避免xss攻击最有效的方式就是规范用户在输入框中输入的内容,例如过滤特殊字符 <> "" 过滤敏感字母 <script> <img> onerror 类似这样的代码。
这是用javascript写的一个简单的过滤器
<script src='/javascripts/htmlparse.js'></script> <script src='/javascripts/he.js'></script> function parse (str) { let result = '' let decode = he.unescape(str, { strict: true }) HTMLParser(decode, { start (tag, attrs, unary) { if (tag === 'script' || tag === 'img' || tag === 'link' || tag === 'style' || tag === 'iframe' || tag === 'frame') return result += `<${tag}` for (let i = 0; i < attrs.length; i++) { let name = (attrs[i].name).toLowerCase() let value = attrs[i].escaped if (name === 'style' || name === 'href' || name === 'src' || ~name.indexOf('on')) continue result += ` ${name}=${value}` } result += `${unary ? ' /' : ''} >` }, chars (text) { result += text }, comment (text) { result += `<!-- ${text} -->` }, end (tag) { result += `</${tag}>` } }) return result }
上述代码中parse函数就起到过滤的作用。例如把所有输入的字符全部转化为小写字母 然后过滤其中有没有敏感字符。这样的过滤器在一定程度上可以有效的避免xss的发生。