Fork me on GitHub

读《白帽子讲Web安全》——服务端应用安全

​ 本书总共分为四篇,作者的安全世界观,客户端脚本的安全、服务端应用的安全以及以及互联网公司安全运营。

​ 这一篇博客记录的是服务端应用安全的知识,

​ 承接自上一篇客户端安全之后,包括注入攻击、认证与会话管理和访问控制、访问控制、加密算法与随机数、Web框架安全、应用层拒绝服务攻击DDOS、Web Server安全等方面

注入攻击

由于应用违背了“数据与代码分离的原则”。两个条件:1.用户能控制数据的输入;2.代码拼凑了用户输入的数据。

SQL注入

盲注

​ 在服务器没有错误回显的时候完成注入攻击。验证方法:构造简单的条件语句根据页面是否发生变化来判断SQL语句是否执行。

Timing Attack

​ 利用数据库中某些特殊的函数,可以有条件地造成延迟。

​ 例如在MySQL中,利用BENCHMARK()函数,可以让同一个函数执行若干次,使得返回的结果比平均时间要长,通过时间长短的变化,可以判断出注入语句是否执行成功。这是一种 边信道攻击

​ eg:

1
2
3
4
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的账户。
  • 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):基于角色的访问控制。采用最小权限原则。

  • 水平权限管理

    同一种用户相互间的数据不能直接访问,即问题出在同一个角色上,至今仍然是一个难题。

    1
    eg:来伊份购物网站没有对用户进行权限控制,通过变化URL中的id参数即可查看对应id的个人

    姓名、地址等隐私信息。

  • OAuth简介

    不提供用户名和密码的情况下,授权第三方应用访问Web资源的安全协议。OpenID解决认证问题,OAuth解决授权问题。

    1
    有三个角色:
  • 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 C

    E(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
    2
    3
    4
    5
    6
    7
    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的安装情况
    1. 指定Apache进程以单独的用户身份运行,通常需要为Apache单独建立一个user/group;使用root身份运行是一个非常不好的习惯。
    2. Apache有一些配置参数可以优化服务器的性能,提高对抗DDOS的攻击的能力。
    3. 保护好Apache log,攻击者入侵成功后,会修改清除log。
  • Nginx安全:注意软件本身的安全,配置好参数。
  • jBoss远程命令执行:JMX-Console管理后台,提供给管理员很多强大的功能,也方便了黑客入侵。远程加载war包。
  • Tomcat远程命令执行:Tomcat manager后台容易出现漏洞。

互联网公司安全运营

​ 此处对互联网公司安全了解为主,此处摘录一些重要观点,不做详细探讨了。

  • 安全是产品的一个特性。
  • 好的安全方案
    • 良好的用户体验
    • 优秀的性能