前言
书接上回https://wsxk.github.io/web_learn/
前面主要讲的是浏览器的安全问题,这回主要讲服务端应用安全
7. 注入攻击
注入攻击是Web安全领域中一种最为常见的攻击方式
注入攻击的本质,是把用户输入的数据当做代码执行。
这里有两个关键条件,第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据
。
7.1 SQL注入
SQL是经典的用户输入和代码拼接的例子。
在SQL注入的过程中,如果网站的Web服务器开启了错误回显,则会为攻击者提供极大的便利,比如攻击者在参数中输入一个单引号“’”,引起执行查询语句的语法错误,服务器直接返回了错误信息,就能推测是哪种数据库
SQL注入有许多高级技巧可以利用
7.1.1 盲注(Blind Injection)
但很多时候,Web服务器关闭了错误回显,这时就没有办法成功实施SQL注入攻击了吗?攻击者为了应对这种情况,研究出了“盲注”(Blind Injection)的技巧。
所谓盲注
,就是在服务器没有错误回显时完成的注入攻击
。服务器没有
错误回显,对于攻击者来说缺少了非常重要的“调试信息”,所以攻击者必
须找到一个方法来验证注入的SQL语句是否得到执行。
最常见的盲注验证方法是,构造简单的条件语句,根据返回页面是否发生变化,来判断SQL语句是否得到执行
。
7.1.2 Timing Attack
在MySQL中,有一个BENCHMARK()
函数,它是用于测试函数性能的。它有两个参数:
count是指定函数执行的次数,expr是指定函数执行的内容
。
因此,利用BENCHMARK()函数,可以让同一个函数执行若干次,使得结果返回的时间比平时要长;通过时间长短的变化,可以判断出注入语句是否执行成功。
7.2 数据库攻击技巧
SQL注入是基于数据库的一种攻击。不同的数据库有着不同的功能、不同的语法和函数,因此针对不同的数据库,SQL注入的技巧也有所不同。
1. 利用sql注入猜测数据库版本,确认表名、列名是否存在等等(可以用自动化工具 sqlmap.py来执行)
2. 在注入攻击的过程中,常常会用到一些读写文件的技巧。比如在MySQL
中,就可以通过LOAD_FILE()读取系统文件,并通过INTODUMPFILE写入
本地文件。当然这要求当前数据库用户有读写系统相应文件或目录的权限。
3. 以利用“用户自定义函数”的技巧,即UDF(User-Defined Functions)来执行命令。
4. 攻击存储过程: 存储过程为数据库提供了强大的功能,它与UDF很像,但存储过程必须使用CALL或者EXE-CUTE来执行。在MS SQL Server和Oracle数据库中,都
有大量内置的存储过程。在注入攻击的过程中,存储过程将为攻击者提供很大的便利
5. 编码问题 在有些时候,不同的字符编码也可能会导致一些安全问题。在注入的历史上,曾经出现过“基于字符集”的注入攻击技巧。
7.3 正确防御sql攻击
(1)找到所有的SQL注入漏洞;
(2)修补这些漏洞
可以使用的方法有:
1. 使用预编译语句:使用预编译的SQL语句,SQL语句的语义不会发生改变。
2. 使用存储过程:使用存储过程的效果和使用预编语句译类似,其区别就是存储过程需要先将SQL语句定义在数据库中。
但需要注意的是,存储过程中也可能会存在注入问题,因此应该尽量避免在存储过程内使用动态的SQL语句。
3. 检查数据类型
4. 使用安全函数:一般来说,各种Web语言都实现了一些编码函数,可以帮助对抗SQL注
入。
7.4 其他注入
1. XML是一种常用的标记语言,通过标签对数据进行结构化表示。XML与
HTML都是SGML(Standard Generalized Markup Language,标准通用标
记语言)。
当然 XML中也存在注入问题
2. 代码注入:代码注入比较特别一点。代码注入与命令注入往往都是由一些不安全的函数或者方法引起的,其中的典型代表就是eval()。
3. CRLF实际上是两个字符:CR是Carriage Re-turn(ASCII 13, \r),LF是LineFeed(ASCII 10,\n)。
\r\n这两个字符是用于表示换行的,其十六进制编码分别为0x0d、0x0a。
CRLF常被用做不同语义之间的分隔符。因此通过“注入CRLF字符”,就有可能改变原有的语义
8. 文件上传漏洞
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,有时候几乎没有什么技术门槛。
如果文件解析出现问题,就很容易导致文件上传漏洞。
对于文件上传漏洞的保护方式也存在:
1. 设置上传目录为不可执行
2. 判断文件类型
3. 上传后随机命名文件
4. 单独设置文件服务器的域名
9. 认证与会话管理
认证的目的是为了认出用户是谁
为了确保认证的安全性,推出了许多的认证策略:
1. 密码
2. 手机短信
3. 身份证实名认证
4. 指纹、人脸识别
...
9.1 session与认证
密码与证书等认证手段,一般仅仅用于登录(Login)的过程。当登录完成后,用户访问网站的页面,不可能每次浏览器请求页面时都再使用密码认证一次。因此,当认证成功后,就需要替换一个对用户透明的凭证。这个凭证,就是SessionID
。
常见的session attack
包括session fixation(登录前后sessionID不会发生变换)和session 保持攻击(通过定时对服务器交互保证sessionID的持久性)。
9.2 SSO
单点登录的英文全称是Single Sign On,简称SSO。
它希望用户只需要登录一次,就可以访问所有的系统。从用户体验的角度看,SSO无疑让用户的使用更加的方便;从安全的角度看,SSO把风险集中在单点上,这样做是有利有弊的。
现在Session ID 一般都加密保存在cookie里
10. 授权
授权的目的是为了确定用户能做什么
10.1 垂直访问管理
垂直访问管理主要指的是基于角色的访问控制(Role-Based Access Control)”,简称RBAC
不同角色的权限有高低之分。高权限角色访问低权限角色的资源往往是被允许的,而低权限角色访问高权限角色的资源往往则被禁止。如果一个本属于低权限角色的用户通过一些方法能够获得高权限角色的能力,则发生了“越权访问”。
10.2 水平访问管理
水平访问管理解决的是同权限的用户不能访问其他用户的私人数据问题
水平访问管理也叫做基于数据的访问控制
11. 拒绝服务攻击
俗称ddos(Distributed Denial of Service)
,本质原因是占用服务器有限的资源导致正常用户无法访问
11.1 网络层DDOS
常见的DDOS攻击有SYN flood、UDP flood、ICMP flood
等。
11.2 应用层DDOS
应用层DDOS,不同于网络层DDOS,由于发生在应用层,因此TCP三次握手已经完成,连接已经建立,所以发起攻击的IP地址也都是真实的。但应用层DDOS有时甚至比网络层DDOS攻击更为可怕,因为今天几乎所有的商业Anti-DDOS设备,只在对抗网络层DDOS时效果较好,而对应用层DDOS攻击却缺乏有效的对抗手段。
常见的应用层DDOS攻击都是用真实的IP,访问资源耗费较大的服务器业务
应用层DDOS
的缓解措施主要有:限制请求频率:通过IP地址与Cookie 定位一个客户端,如果客户端的请求在一定时间内过于频繁,则对之后来自该客户端的所有请求都重定向到一个出错页面。
这个方案中有两个因素用以定位一个客户端:一个是IP地址,另一个是Cookie
。但用户的IP地址可能会发生改变,而Cookie又可能会被清空,如果IP地址和Cookie同时都发生了变化,那么就无法再定位到同一个客户端了。
当前的措施是组合拳:服务器性能优化、网络架构优化、限制每个IP的请求频率合击技。当然,还可以加上验证码
12. 配置安全
Web服务器安全,考虑的是应用布署时的运行环境安全。这个运行环境包括Web Server、脚本语言解释器、中间件等软件,这些软件所提供的一些配置参数,也可以起到安全保护的作用
首先是1. 不能以root权限启动web server,不然入侵就是root
2. 即使更新软件版本
3. 正确配置web server,不该开的服务别乱开
13. 互联网业务安全
业务安全其实涉及到用户使用便利性问题
13.1 密码问题
其实单因子认证(密码)是最方便的,但是如果密码被爆破了,账户就直接被盗了,所以现在都是双因子认证
但是双因子认证需要每次发送验证码
,使登录更麻烦。
如果用复杂的密码,用户可能记不住密码,也很麻烦
现在流行直接用验证码登录,这是依靠电话号码或者邮箱的安全性,而且是一次一密
13.2 业务逻辑安全
直接说比较重要的一点,以前改密码是不需要输入原密码的,黑客可以直接通过改密码来盗号
现在确实要输入原密码,但是如果用户自己也忘记原密码了,就需要依靠其他凭据来改密码。
13.3 网络钓鱼
做一个很像正规网址的网站,网址也靠神奇的编码修饰的很像正规网址,骗用户登陆输入用户名密码
缓解措施:
1. 浏览器中拦截钓鱼网站
2. 用户教育
3. 打击钓鱼网站!