Xss—跨站式脚本攻击

  •      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是寄存在服务器或数据库或网站核心文件中。

扫描二维码关注公众号,回复: 5378949 查看本文章

 这种攻击方式多数会存在于留言板,论坛,或博客中。

浏览器如何区分我们输入的是数据还是代码。这要从浏览器解析原理说起,《计算机网络》这本书中曾解释过,浏览器在进行运算时,读取的是发送过来的数据,而不是代码。这里有一个简单的例子可以说明这个道理。

<?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危害

  1. 通过document.cookie盗取cookie
  2. 使用js或css破坏页面正常的结构与样式
  3. 流量劫持(通过访问某段具有window.location.href定位到其他页面)
  4. Dos攻击:利用合理的客户端请求来占用过多的服务器资源,从而使合法用户无法得到服务器响应。
  5. 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
  6. 利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。

 避免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的发生。

猜你喜欢

转载自www.cnblogs.com/sylover/p/10459573.html