axiejundong 2019-07-01
例如:利用图片加载错误,执行脚本;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>xss存储型攻击</title>
</head>
<body>
<div id='test'></div>
<script>
var text = "<img src='404.html' onerror='alert(1)'>" // 从后台读取的数据
var $test = document.querySelector('#test');
$test.innerHTML = text;
</script>
</body>
</html>防范: 对html经行编码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>防范xss攻击(html-encode)</title>
</head>
<body>
<div id='test'></div>
<script>
// 1. 富文本;白名单
// 2. 纯文本;html encode , js encode
var htmlEscape = function (str) { // 在展示的时候转义
return String(str)
.replace(/&/g,'&')
.replace(/"/g,'"')
.replace(/'/g,''')
.replace(/</g,'<')
.replace(/>/g,'>')
}
var htmlUnescape = function (str){
return String(str)
.replace(/&/g,'&')
.replace(/"/g,'"')
.replace(/'/g,"'")
.replace(/</g,'<')
.replace(/>/g,'>')
}
var text = "<img src='404.html' onerror='alert(1)'>" // 从后台读取的数据
var $test = document.querySelector('#test');
$test.innerHTML = htmlEscape(text);
</script>
</body>
</html>例如:通过地址栏传输数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>xss反射性攻击</title>
</head>
<body>
<div id='test'></div>
<script>
// <img src='404.html' onerror='alert(1)'>
var $test = document.querySelector('#test');
$test.innerHTML = decodeURIComponent(window.location.hash);
</script>
</body>
</html>例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>页面劫持</title>
</head>
<body>
<div style="position: absolute;left: 16px;top:16px;opacity: 0;background: red">
账号:<input id='haha' oninput="changValue()" type="text"><br/>
密码:<input type="text"><br/>
</div>
<iframe id="iframe" src="./hikjack.html" frameborder="0"></iframe>
<script>
function changValue(a) {
console.log(a);
}
window.onload = function(){
let oiframe = document.querySelector('#iframe').contentWindow;
let ohaha = document.querySelector('#haha');
let _ipt = oiframe.document.querySelector('input');
window.changValue = function(){
_ipt.value = ohaha.value;
}
}
</script>
</body>
</html>防范: 可以通过检测是否被嵌套来预防
if(window.parent != window){
alert('hikjack')
}例如: 发布诱导链接,通过iframe提交表单;(注意:发送时会带上你请求域名下的cookie)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>csrf攻击</title>
</head>
<body>
<iframe src="" name="csrf-from"></iframe>
<form target="csrf-from" action="http://127.0.0.1:3001/csrf" method="post">
<input type="text" name="name" value="111">
<input type="submit" value="提交">
</form>
</body>
</html>防范:1. 尽量使用POST,限制GET;get的Referer Check维护成本高;
2. 加验证码; 3. 通过token验证;
例如:
防范手段:
例如:扫码登陆