这一篇博客记录的是服务端安全应用安全的知识,学习内容来自《白帽子讲Web安全》。
承接自上一篇客户端安全之后,包括注入攻击、认证与会话管理和访问控制、访问控制、加密算法与随机数、Web框架安全、应用层拒绝服务攻击DDOS、Web Server安全等方面。
@
- 注入攻击
- SQL注入
- 盲注
- Timing Attack
- 数据库攻击技巧
- 常见的攻击机巧
- 命令执行
- 攻击存储过程
- 编码问题
- SQL Column Truncation
- 正确地防御SQL注入
- 其他注入攻击
- SQL注入
- 文件上传漏洞
- 文件上传漏洞概述
- 功能还是漏洞
- 设计安全的文件上传功能
- 认证与会话管理
- 访问控制
- 加密算法与随机数
- 概述
- Stream Cipher Attack
- WEP破解
- ECB模式的缺陷
- Padding Oracle Attack
- 密钥管理
- 伪随机数问题
- Web框架安全
- 应用层拒绝服务攻击DDOS
- 应用层DDOS
- 验证码
- 防御应用层DDOS
- 资源耗尽攻击
- ReDOS正则引起的问题
- PHP安全
- Web Server安全
- 互联网公司安全运营
注入攻击
由于应用违背了“数据与代码分离的原则”。两个条件:1.用户能控制数据的输入;2.代码拼凑了用户输入的数据。
SQL注入
盲注
在服务器没有错误回显的时候完成注入攻击。验证方法:构造简单的条件语句根据页面是否发生变化来判断SQL语句是否执行。
Timing Attack
利用数据库中某些特殊的函数,可以有条件地造成延迟。
例如在MySQL中,利用BENCHMARK()函数,可以让同一个函数执行若干次,使得返回的结果比平均时间要长,通过时间长短的变化,可以判断出注入语句是否执行成功。这是一种 边信道攻击 。
eg:
1170 UNION SELECT IF(SUBSTRING(current,1,1) =
CHAR(119),BENCHMARK(5000000,ENCODE('MSG','by
5 seconds')),null) FROM (Select Database()
as current) as tbl;
这段Payload判断库名的第一个字母是否为CHAR(119),即小写的w。如果判断结果为真,
则会通过BENCHMARK()函数造成较长延时;如果不为真,则该语句将很快执行完。攻击者
遍历所有字母,直到将整个数据库名全部验证完成为止。
此外,例如如此的手段还可以获得很多有关数据库的信息。
数据库攻击技巧
常见的攻击机巧
SQL注入可以猜解数据库的版本。有自动化工具完成猜解username和password。。(猜解。。暴力),可以获取到当前用户的身份,从而进行进一步的文件操作,通过LOAD_FILE读出,然后INTODUMOFILE写入系统,最后通过LOAD DATA INFILE将文件导入表中。这种技巧可以导出Web-shell,为进一步攻击做好准备。
自动化注入工具:sqlmap
命令执行
在MySQL中,除了直接导出Web-shell间接执行命令之外,还可以利用UDF(USER-Defined-Functions)来执行命令。若当前用户是root,则可以直接获取到root权限。
攻击存储过程
存储过程为数据库提供了强大的功能,但必须用CALL或者EXECUTE执行。在注入过程中,存储过后才能为攻击者提供很大便利。例如MS SQL Server中,“xp_cmd-shell”执行系统命令。
编码问题
注入攻击中常常用到的单引号和双引号等特殊字符。当数据集采用了“宽字符集”的时候,就会产生一些漏洞,比如几个编码代表一个字符,例如。
0xbf27 or 1=1 经过转义之后 成为 经过转义后,会变成0xbf5c27(“\”的ASCII码为0x5c),但0xbf5c又是一个字符。故原有的转义字符 \ 就会“吃掉”。
统一设置为UTF-8是一个很好的办法,也就是,设置页面meta标签的charset属性。
SQL Column Truncation
MySQL数据库中,strict模式不开启会导致重复数据插入或其他非法数据插入,从而有可能获得越权访问。
正确地防御SQL注入
-
找到所有SQL注入漏洞
-
修补这些漏洞
使用预编译语句:最佳方式是使用预编译语句,绑定变量,用户的输入无法改变语句的结构和语义。
使用存储过程:将SQL语句定义在数据库中,避免使用动态的SQL语句。
检查数据类型, 使用安全函数
从数据库角度来说,应该使用最小权限原则。
其他注入攻击
- XML注入:和HTML注入很相似
- 代码注入: 通过一些执行命令的函数间接执行命令,如eval(), system()
- CRLF注入: 两个字符 \n \t 表示换行,注入换行符改变语义。eg:log日志文件的改写,注入HTTP头(Http Response Splitting),因为HTTP头是\n\t换行的,可能导致安全隐患,可形成XSS攻击。
文件上传漏洞
文件上传漏洞概述
文件上传漏洞指用户上传了一个可执行的脚本文件,并通过这个脚本文件获得了执行服务器端命令的能力。
常见安全漏洞
-
上传文件是Web脚本语言
-
上传文件是Flash的策略稳健crossdo-main.xml,黑客可以控制Flash在这个域下面的行为
-
上传文件是病毒,木马文件,诱导用户或者管理员下载执行
-
上传文件是钓鱼图片或为包含了脚本的图片,用于钓鱼和欺诈
形成条件:1.上传的文件能被Web容器解释执行。2.用户能从Web上访问这个文件。3.用户上传的文件并未被安全检查和格式化
eg:开源富文本编辑器的文件上传功能。
绕过文件上传检查功能 :
1.攻击者手动修改上传过程中的POST包,添加%00字符,可以截断某些函数对文件名的判断。
2.伪造一个合法的文件头,将真实的脚本文件放置在其后。
功能还是漏洞
- Apache文件解析问题: Apache对文件名的解析式从后往前解析的,直到遇到Apache认识的文件类型为止。定义在Apache的mime.types文件中。
- IIS文件解析问题:1. ;成为截断字符,如文件名是 evil.asp;xx.jpg 时,IIS 6 会将此文件解析为 evil.asp来执行。2. 处理文件夹拓展名出错,在/*.asp/文件夹的文件都当做asp来处理
- PHP CGI路径解析问题: PHP在Nginx作为Web Server时,一般使用fastcgi作为脚本解释器,而fastcgi模式下,PHP获取环境变量的方式有关,若解析不了,则会路径向前一步寻求环境解析。
- 利用上传文件漏洞钓鱼: 从正常域名跳转到钓鱼网站,通过不同文件类型的解析,在域名上看上去仍然是可信任的域名,但是html文件通过*.html.jpg解析运行。
设计安全的文件上传功能
- 文件上传的目录设置为不可执行
- 判断文件类型,使用白名单策略,不要使用黑名单策略
- 使用随机数改写文件名和文件路径
- 单独设置文件服务器的域名
认证与会话管理
- “认证”和“授权”的概念,单因素认证与多因素认证
- 密码:最基础的认证手段。OWASP有推荐的最佳实践。
OWASP:The Open Web Application Security Project (OWASP), an online community, produces freely-available articles, methodologies, documentation, tools, and technologies in the field of web application security.
使用弱口令攻击比暴力破解有效得多。密码的保存不要明文保存,采用不可逆的加密算法或者是单项散列函数算法。
-
多因素认证:提高攻击门槛
-
Session与认证:将Session ID加密后保存在Cookie中,Cookie收到浏览器同源策略保护,Session劫持就是Session ID在生命周期内被窃取,相当于账户失窃;如果Session ID 保存在Cookie中,则可以称作Cookie劫持。
- Session泄漏途径:XSS攻击、网络sniff以及本地木马窃取。
-
Session Fixation攻击: 在用户登录网站的过程中,如果登录前后用户的Session ID没有发生变化,则会存在Session Fixation问题。
- 具体攻击的过程是,用户X(攻击者)先获取到一个未经认证的SessionID,然后将这个SessionID
交给用户Y去认证,Y完成认证后,服务器并未更新此SessionID的值(注意是未改变
SessionID,而不是未改变Session),所以X可以直接凭借此SessionID登录进Y的账户。
- 具体攻击的过程是,用户X(攻击者)先获取到一个未经认证的SessionID,然后将这个SessionID
-
Session保持攻击: 用户长时间未活动或者用户点击退出后,服务器将销毁session,如果Session一直未失效,则会导致Session劫持攻击。
有的网站访问量大,则服务端不维护Session,把Session放到Cookie中加密保存,发送时带上Cookie,利用Cookie的Expire标签控制Session的失效时间,这就可以通过XSS攻击客户端Cookie失效时间来劫持Session了。
- 定期强制销毁Cookie,一个用户可以同时拥有几个Session的问题
-
SSO 单点登录: 用户登录一次就可以访问所有系统。将风险集中了。使用最多的是OpenID,使用URL进行用户认证,同时在验证成功后重定向回网站。
访问控制
-
What Can I Do?
授权问题: 权限控制,访问控制。某个主体对某个客体需要实施某种操作,而系统对这种操作的限制就是权限控制。网络请求收到防火墙ACL策略的限制。加上基于页面的访问控制可以解决页面未授权访问的问题。
-
垂直权限管理
RBAC(Role-Based Access Control):基于角色的访问控制。采用最小权限原则。
-
水平权限管理
同一种用户相互间的数据不能直接访问,即问题出在同一个角色上,至今仍然是一个难题。
eg:来伊份购物网站没有对用户进行权限控制,通过变化URL中的id参数即可查看对应id的个人
姓名、地址等隐私信息。
-
OAuth简介
不提供用户名和密码的情况下,授权第三方应用访问Web资源的安全协议。OpenID解决认证问题,OAuth解决授权问题。
有三个角色:
-
User:用户
-
Resource Owner:资源提供方,用户访问其他的网页应用需要资源提供方的数据支持
-
Client:消费方,用户正在访问的网页应用
过程步骤不赘述,理解。
加密算法与随机数
概述
加密算法分为 分组加密算法和流密码加密算法。
分组加密法: DES、3-DES、Blowfish、IDEA、AES等。
流密码加密算法: RC4、ORYX、SEAL。
根据攻击者可以获得的信息,可以分为:唯密文攻击、已知明文攻击、选择明文攻击、选择密文攻击。
Stream Cipher Attack
流密码常用的一种加密算法,基于异或操作,每次都只操作一个字节,但是性能非常好。
-
Reused Key Attack: 使用同一个密钥加密多次,因为基于异或操作,所以只要知道四个数据只要知道三个就可以推导出剩下的一个了。
E(A) = A xor C
E(B) = B xor CE(A) xor E(B) = A xor B;
-
Bit-flipping Attack: 在密码学中,攻击者在不知道明文的情况下,通过改变密文,使得明文按其需要的方式发生改变的攻击方式。也就是当知道A、B的明文,A的密文时,就可以推导出B 的密文。
解决Bit-flipping攻击,验证密文的完整性。
-
弱随机IV问题: 在authcode()函数中,它默认使用了4字节的IV(就是函数中的keyc),使得破解难度增
大。但其实4字节的IV是很脆弱的,它不够随机,我们完全可以通过“暴力破解”的方式找到重复的IV。
WEP破解
WEP是一种无线加密传输协议,破解了WEP的密钥,就可以连接Access Point。
两个关键因素:
- 初始化向量IV:明文发送,在较短时间内会出现重复,就可以利用Reused Key Attack。同时,找到相同的IV,就可以构造出相同的CRC-32校验值,可以成功实施Bit-flipping。
- 对消息的CRC-32校验
Security of the WEP algorithm 提出了破解WEP破解的理论。
ECB模式的缺陷
分组独立加密,调换任意分组的密文,那么解密后的明文也是对调位置的。所以应该使用链式加密。
Padding Oracle Attack
分组加密过程中,不够位数的用padding进行填充。Padding Oracle Attack的关键在于攻击者能够获知解密的结果是否符合padding。在实现和使用CBC模式的分组加密算法时,注意这一点即可。
密钥管理
密码学一个原则:密码系统的安全性应该依赖于密钥的复杂性,而不应该依赖于
算法的保密性。
防止密钥从非正常的途径泄露。不要把私钥硬编码在代码中,应该采用公私钥管理或者改善密钥管理。密钥集中管理,降低系统对密钥的耦合性,也利于定期更换密钥。
伪随机数问题
伪随机数不够随机。
- 时间戳不够随机,不能直接用做随机数的生成。
- 破解伪随机数种子即可破解,eg:PHP的rand()函数,mt_rand()函数。
- 采用安全的随机数算法,JAVA中的用java.security.SecureRandom等。
Web框架安全
-
MVC框架安全
现代开发中的MVC框架。从数据流入的方向看,数据先后经过了View层、Controller层、Model层,设计安全方案的时候要掌握住数据这个关键因素。在每一层解决相关的问题,不要把不属于该层的问题留给那一层。
模板引擎与XSS防御
在View层解决XSS问题。在现在View层用模板引擎对页面进行渲染,模板引擎可能会提供一些编码方法
eg:Django中auto-escape采用了htmlEncode(),从而可以保证安全,有时关闭则可能导致问题。
-
Web框架与CSRF防御
可以使用security token来解决CSRF攻击,对读写操作分开,对所有的“写操作”使用POST提交,同时,要保证security token的私密性,自动在POST中增加Token。
1.在Session中绑定Token。 2.在form表单中自动添加token字段。 3.在Ajax请求中自动添加token。 4.在服务端对比POST中提交的Token和Session中绑定的Token是否一致。
-
HTTP Headers管理
在框架中,对HTTP头进行全局化的处理。eg:针对HTTP头的CSRF攻击。针对30X返回的HTTP Response的跳转——提供统一跳转函数(白名单)。
-
数据持久层与SQL注入
使用ORM框架对防止SQL注入有好处。
应用层拒绝服务攻击DDOS
DDOS:分布式拒绝服务 ,将正常服务放大了若干倍,通过若干个网络节点同时发起攻击,以达规模效应。
常见的DDOS攻击:SYN flood, UDP flood, ICMP flood。
在很多对抗DDOS的产品中,一般会综合使用各种算法,结合一些DDOS攻击的特征,对流
量进行清洗。对抗DDOS的网络设备可以串联或者并联在网络出口处。
应用层DDOS
发生在应用层,TCP三次握手已经完成,连接已经建立,发起攻击的IP地址真实。这种攻击是对服务器性能的一种攻击,优化服务器性能的方法能够缓解这种攻击。
- CC攻击 :对消耗资源较大的应用页面不断发起正常的请求,以达到消耗服务端资源的目的。
- 限制请求频率: 针对每个客户端做一个请求频率的限制。
验证码
CAPTCHA:全自动区别计算机和人类的图灵测试。
可能漏洞: 1. 直接利用图像相关算法识别验证码 2.验证码消耗掉后SessionID未更新,导致使用原有的SessionID可以一直重复提交同一个验证码 3. 提前将所有的验证码图片生成好,以哈希过的字符串作为验证码
图片的文件名——采用枚举的方式即可破解。
防御应用层DDOS
验证码的核心是识别人与机器。一般情况下,判断HTTP头中的User-Agent字段来识别客户端。
另外一种比较可信的办法是让客户端解析一段JS,并给出正确的运行结果,因为大部分自动化过程是直接构造HTTP包来完成的,并没有在浏览器环境中。
Web Server也可以用来进行防御。
资源耗尽攻击
- Slow Loris攻击:以极低的速度向服务器发送HTTP请求,由于Web Server并发的连接数都有一定的上限,故最终导致所有连接都被恶意占用。
- HTTP POST DOS : 原理是在发送HTTP POST包时,指定一个非常大的Content-Length值,然后以很低的速
度发包,比如10~100s发一个字节,保持住这个连接不断开。 - Server Limit DOS:Cookie造成一种拒绝服务。Web Server对HTTP包头的大小都有长度限制,如果攻击者通过XSS攻击,恶意地往客户端写入了一个超长的Cookie,则该客户端在清空Cookie之前,将无法再访问该Cookie所在域的任何页面。
ReDOS正则引起的问题
当正则表达式写得不好时,就有可能被恶意输入利用,消耗大量资源,从而造成DOS。这种攻击被称为Re-DOS。这是一种代码缺陷上的漏洞。
eg: ^(a+)+$, 正常时候输入 aaaax 时,16条可能路径,但是输入 aaaaaaaaaaaaaaaaX 时,有65536条路径,极大增加正则引擎解析的速度,用户恶意构造输入的时候,有缺陷的正则表达式效率大大降低。
PHP安全
暂时跳过这个章节,等到具体去写POC的时候回过头来再看。
Web Server安全
- Apache安全:1. Apache的Module模块最容易出现安全漏洞,所以要检车Module的安装情况
- 指定Apache进程以单独的用户身份运行,通常需要为Apache单独建立一个user/group;使用root身份运行是一个非常不好的习惯。
- Apache有一些配置参数可以优化服务器的性能,提高对抗DDOS的攻击的能力。
- 保护好Apache log,攻击者入侵成功后,会修改清除log。
- Nginx安全:注意软件本身的安全,配置好参数。
- jBoss远程命令执行:JMX-Console管理后台,提供给管理员很多强大的功能,也方便了黑客入侵。远程加载war包。
- Tomcat远程命令执行:Tomcat manager后台容易出现漏洞。
互联网公司安全运营
此处对互联网公司安全了解为主,此处摘录一些重要观点,不做详细探讨了。
- 安全是产品的一个特性。
- 好的安全方案
- 良好的用户体验
- 优秀的性能