SQL注入
基本概念
SQL 注入漏洞(SQL Injection)是 Web 开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。
而造成 SQL 注入的原因是因为程序没有有效的转义过滤用户的输入,使攻击者成功的向服务器提交恶意的 SQL 查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码。
很多 Web 开发者没有意识到 SQL 查询是可以被篡改的,从而把 SQL 查询当作可信任的命令。殊不知,SQL 查询是可以绕开访问控制,从而绕过身份验证和权限检查的。更有甚者,有可能通过 SQL 查询去运行主机系统级的命令。
攻击原理
数据和代码未分离,即输入的数据当做了代码来执行。看了栗子就明白了了
<form action="/login" method="POST">
<p>Username: <input type="text" name="username" /></p>
<p>Password: <input type="password" name="password" /></p>
<p><input type="submit" value="登陆" /></p>
</form>
//后端sql可能是
let querySQL = `
SELECT *
FROM user
WHERE username='${username}'
AND psw='${password}'
`;
// 接下来就是执行 sql 语句...
这是我们经常见到的登录页面,但如果有一个恶意攻击者输入的用户名是 admin' --
,密码随意输入,sql语句变成了
SELECT * FROM user WHERE username='admin' --' AND psw='xxxx'
在 SQL 中,' --
是闭合和注释的意思,-- 是注释后面的内容的意思,所以查询语句实际就变成了:
SELECT * FROM user WHERE username='admin'
这时候攻击者拥有了admin权限,内心阴暗的他可能会
获取所有用户信息(姓名、身份证号、银行卡密码)、获取服务器权限、脱库、读取服务器敏感文件........
SQL注入防御
-
严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害
-
后端代码检查输入的数据是否符合预期,严格限制变量的类型,例如使用正则表达式进行一些匹配处理。
-
对进入数据库的特殊字符(
'
,"
,\
,<
,>
,&
,*
,;
等)进行转义处理,或编码转换。基本上所有的后端语言都有对字符串进行转义处理的方法,比如 lodash 的lodash._escapehtmlchar
库。 -
所有的查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中,即不要直接拼接 SQL 语句。例如 Node.js 中的 mysqljs 库的
query
方法中的?
占位参数。 -
在应用发布之前建议使用专业的 SQL 注入检测工具进行检测,以及时修补被发现的 SQL 注入漏洞。网上有很多这方面的开源工具,例如 sqlmap、SQLninja 等。
-
避免网站打印出 SQL 错误信息,比如类型错误、字段不匹配等,把代码里的 SQL 语句暴露出来,以防止攻击者利用这些错误信息进行 SQL 注入。
-
不要过于细化返回的错误信息,如果目的是方便调试,就去使用后端日志,不要在接口上过多的暴露出错信息,毕竟真正的用户不关心太多的技术细节,只要话术合理就行。
总之涉及操作数据库的代码都要慎重,不然你可能会让公司承受巨大经济损失
流量劫持
1.HTTP 流量劫持
介绍:对于web端来说,比较多见的就是http流量劫持,因为 HTTP 属于明文协议,中间链路上的任意设备,都可以篡改内容,没有办法对通信对方的身份进行校验以及对数据完整性进行校验导致流量劫持。
HTTP 劫持主要是当用户访问某个站点的时候会经过运营商网络,而不法运营商和黑产勾结能够截获 HTTP 请求返回内容,并且能够篡改内容,然后再返回给用户,从而实现劫持页面,轻则插入小广告,重则直接篡改成钓鱼网站页面骗用户隐私。
防御:https
2.DNS 劫持
介绍:DNS 的作用是把网络地址域名对应到真实的计算机能够识别的 IP 地址,以便计算机能够进一步通信,传递网址和内容等。如果当用户通过某一个域名访问一个站点的时候,被篡改的 DNS 服务器返回的是一个恶意的钓鱼站点的 IP,用户就被劫持到了恶意钓鱼站点,然后继而会被钓鱼输入各种账号密码信息,泄漏隐私。
这类劫持,要不就是网络运营商搞的鬼,一般小的网络运营商与黑产勾结会劫持 DNS,要不就是电脑中毒,被恶意篡改了路由器的 DNS 配置,基本上做为开发者或站长却是很难察觉的,除非有用户反馈,如果接到有 DNS 劫持的反馈,要做好以下几件事:
- 取证很重要,时间、地点、IP、拨号账户、截屏、URL 地址等一定要有。
- 可以跟劫持区域的电信运营商进行投诉反馈。
- 如果投诉反馈无效,直接去工信部投诉,一般来说会加白你的域名。
具体关于流量劫持这块我也不是很明白,具体可以看下这篇文章《浅谈流量劫持与防治》