web安全初探
XSS攻击
XSS攻击全称
跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
分类
- 存储型(读取数据、富文本)
例如:利用图片加载错误,执行脚本;
<!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>
- 反射型(也叫非持久型XSS,是指发生请求时,XSS代码出现在请求URL中,作为参数提交到服务器,服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行)
例如:通过地址栏传输数据
<!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>
hajack页面劫持
通过嵌套iframe,伪造真实网页获取用户信息;
例如:
<!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')
}
CSRF跨站伪造请求
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
例如: 发布诱导链接,通过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验证;
SSRF 服务器伪造请求
是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
例如:
- 可以对外网、内网、本地进行端口扫描,某些情况下端口的Banner会回显出来(比如3306的);
- 攻击运行在内网或本地的有漏洞程序(比如溢出);
- 可以对内网Web应用进行指纹识别,原理是通过请求默认的文件得到特定的指纹
- 攻击内网或外网有漏洞的Web应用
- 使用file:///协议读取本地文件
防范手段:
- 限制域名,不允许提交内网域名;
- 限制内网ip,不允许提交内网ip;
- 限制端口;
- token验证;
- 禁用不需要的协议;(可以防止类似于file:///,gopher://,ftp:// 等引起的问题)
通过第三方验证,修改验证后跳转的地址,窃取用户信息
例如:扫码登陆