web
安全问题
安全问题是web
应用很容易忽视的部分,而其产生的后果对于企业而言往往是灾难性的.此处尝试分析攻击者常见攻击手段以及防御办法.
前端漏洞
前端一般需要关注三种漏洞:
Cross Site Scripting
简称XSS
(CSS容易与Cascading Style Sheets
混淆)Cross Site Request Forgery
简称CSRF
Server Side Request Forgery
简称SSRF
1. XSS
跨站脚本攻击
产生条件:
用户在输入框或地址栏输入内容后,前端直接当做DOM
渲染,或是提交到服务器,服务器未做处理,直接渲染到HTML
模板内.
示例:
// Frontend const content = document.querySelector('#input').value; document.body.innerHTML = value; // Backend const value = req.body.userInput; res.render(`<body>${value}</body>`);
场景:
<script src="hack.com/hack.js"></script>
<img href="hack.com/hack" onload="hack..." onerror="hack..." />
<div style="background:url(hack.com/hack)"></div>
- ...
分析:
用户输入攻击者提供的脚本代码被直接执行,当前用户权限即被窃取.若服务器将输入内容开放给其他用户访问,则所有访问者同样会被窃取信息.
防御方法:
- 拒绝在
eval
,setTimeout
,setInterval
,new Function
中用字符串作为参数执行. - 前端渲染所有不可信数据,服务器渲染模板时特殊字符
<
>
&
'
"
分别转码为<
>
&
'
"
. - 服务器对
cookie
设置httpOnly
,使cookie
在window
中不可见.
2. CSRF
跨站请求伪造
产生条件:
用户已登录A站点,攻击者诱导用户访问B站点,从B站点向A站点发出请求,伪造用户行为.
示例:
// b.com/page <form action="a.com" method="POST"> <input type="text" name="bank_id" /> <input type="text" name="money" value="9999" /> <button type="submit">Ok</button> </form>
分析:
攻击者直接向正常网站发送请求,模拟用户行为,攻击过程甚至可对用户完全隐匿.
防御方法:
- 服务器渲染页面时隐藏随机值(表单或
URL
),以此判断请求来源是否正常. - 敏感操作验证用户身份,比如输验证码(非常影响用户体验).
- 服务器判断请求的
referer
地址是否正常.
3. SSRF
服务端请求伪造
产生条件:
服务端接收URL
参数,并直接向此URL
发送请求.
示例:
const resourceURL = req.query.url; request(url, function(data) { // handler... res.send(data); });
场景:
a.com@192.168.100.100
(@使域名解析为账户名绕过检测)http://t.cn/abcde
->http://192.168.100.100
(短链接302
跳转内网)- ...
分析:
攻击者传入内网地址,服务端直接作为跳板访问敏感数据.
防御方法:
- 添加白名单域名.
- 禁止使用
IP
. - 只允许访问
http
https
协议及80
443
端口. - 禁止
302
跳转.
后端漏洞
以下简单列出几种后端攻击方式:
SQL
注入- 伪造域名解析
- 目录穿越
- 文件上传
- 命令注入
- 短信接口/邮件接口频次控制
- 开发者/运维权限控制
1. SQL
注入
介绍: 服务器接收客户端传入的值作为SQL
参数,绝对不能直接使用字符串拼接的方式,否则攻击者可以执行危险SQL
语句.
示例:
// body: { username: "smith AND pwd='123456'" } const username = req.body.username; mysql.exec('SELECT uid FROM user WHERE name=' + username);
防御: 通用解决方法是参数化查询,参数用?
作为占位符,替换?
的值将自动被检查.
数据库连接工具一般默认支持此方式.
2. 伪造域名解析
介绍: 攻击者购买相似域名,解析到正常ip
地址,服务正常使用,当攻击者修改DNS
解析到攻击者服务器之后,可获取用户浏览器发送的cookie
.
防御:
- 使用
https
,由于两个域名SSL
证书不匹配,用户访问时浏览器会警告用户. - 正常服务每次收到请求后检测
URL
域名是否与本站一致,如果不一致则301
跳转到正常域名.
3. 目录穿越
介绍: 服务器接收资源名读写资源,没有检测文件名安全性,攻击者可以访问,修改其它目录的文件内容.
示例:
// body: { filename: "../../file" } const filename = req.body.filename; fs.readFile(path + filename, function(data) { res.send(data); });
防御: 接收资源名后检测是否包含..
/
等目录跳转字符.
4. 文件上传
介绍: 上传资源时,服务器应限制文件大小,检测同名文件,避免内存溢出,硬盘占满,业务出现漏洞等问题.
5. 命令注入
介绍: 用户输入内容不可以直接用作shell
调用,应屏蔽敏感命令.比如rm
,addUser
等.
6. 短信接口/邮件接口频次控制
介绍: 对IP
限制敏感接口调用频次,防止被攻击者用作短信炸弹,邮件炸弹.
7. 开发者/运维权限控制
介绍: 企业级项目应当对生产环境操作权限严格控制,完整记录操作日志,开发人员不应该拥有生产环境控制权限.应当保证灾备系统稳定可靠,数据丢失能快速找回.