七、注入攻击

注入的本质:把用户的数据当代码执行
两个关键条件:

  1. 用户能够控制输入
  2. 原本程序要执行的代码,拼接了用户输入的数据

1.SQL注入

(1)盲注(Blind Injection)

构造简单条件语句,根据返回页面是否变化,判断SQL语句是否得到执行 and 1 = 1 , and 1 = 2

(2)时序攻击(Timing Attack)

边信道攻击的一种
例子里:利用BENCHMARK()函数,让同一个函数执行若干次,使结果返回的时间比平时要长,通过时间长短,判断注入语句是否执行

MySQL BENCHMARK(1000000,md5(1)) or SLEEP(5)
PostgreSQL PG_SLEEP(5) or GENERATE_SERIES(1,10000000)
MS SQL Server WAITFOR DELAY ‘0:0:5’

2.数据库攻击技巧

(1)导出Webshell

MySQL(当前数据库用户具有读写相应系统文件或目录权限)

  • LOAD_FILE() 读取系统文件
  • INTO DUMPFILE 写入本地文件(适用于二进制,将目标文件写入同一行)
  • INTO OUTFILE(适用于文本文件)

(2)命令执行

利用用户自定义函数UDF(User-Defined Function)执行命令
lib_mysqludf_sys.so 上传到数据库能访问到的路径下,创建UDF

  • sys_eval,执行任意命令,并将输出返回
  • sys_exec,执行任意命令,并将退出码返回
  • sys_get,获取一个环境变量
  • sys_set,创建或修改一个环境变量

(3)攻击存储过程(存储过程本身可能存在注入漏洞)

存储过程使用CALL、EXECUTE执行

MS SQL Server
xp_cmdshell:

  • 2000 默认开启,如果禁止可使用sp_addextendproc开启
  • 2005/2008 默认禁止,sysadmin权限,使用sp_configure开启

操作注册表:
xp_regread
xp_regaddmultistring
xp_regdeletekey
xp_regnumkeys
xp_regremovemultistring
xp_regwrite

xp_servicecontrol 允许用户启动,停止服务
xp_availablemedia 显示机器上有用的驱动器
xp_dirtree 允许获得一个目录树
xp_enumdsn 列举服务器上的ODBC数据源
xp_loginconfig 获取服务器安全信息
xp_makecab 允许用户在服务器上创建一个压缩文件
xp_ntsec_enumdomains 列举服务器可以进入的域
xp_terminate_process 提供进程的ID,终止此进程

(4)编码问题

“基于字符集”注入…
统一数据库、操作系统、Web应用字符集 ~UTF-8

(5)SQL Column Truncation

MySQL的sql-mode设置为default,即没有开启STRICT_ALL_TABLES,MySQL对用户插入的超长值只会提示warming,而不是error(error插入不成功),导致发生“截断”问题

3.防御SQL注入

找到所有的SQL注入->修补之(废话)

(1)使用预编译语句,绑定变量

(2)使用存储过程

需先将SQL语句定义数据库中
避免存储过程使用动态SQL语句(如无法避免,应严格输入过滤、使用编码函数)

(3)检查数据类型

检查输入数据的数据类型
数据格式/类型检查:邮箱、时间、日期…

(4)使用安全函数

编码函数
OWASP ESAPI encodeForSQL

(5)数据库自身角度

最小权限原则,避免Web应用直接使用root、dba
同一数据库不同应用,每个应用分配不同账户
Web应用使用的数据库账户,不应有创建自定义函数、操作本地文件的权限

4.其他注入攻击

  1. XML注入,与HTML类似
  2. 代码注入
  • eval() PHP,JSP的动态include(文件包含漏洞)导致代码执行
  • 命令注入 system()
  1. CRLF注入(HTTP头可以看做kv对,value中编码所有 \r\n)
    \r\n -> 0x0d,0x0a
    凡是使用CRLF作为分隔符的地方都可能存在
    log注入,HTTP头注入(Http Response Spliting)

八、文件上传漏洞

1.概述

用户上传一个可执行的脚本文件,通过此脚本文件获得执行服务器端命令的能力 (解析+访问)
文件上传后导致的安全问题:

  1. 代码执行:上传Web脚本语言,服务器的Web容器解释执行
  2. 控制策略文件:flash的crossdomain.xml,控制flash在该域下的行为…
  3. 病毒、木马
  4. 钓鱼欺诈
  5. 溢出服务器后台处理程序,如图片解析模块
  6. 文件包含:文件包含PHP脚本,利用LFI执行

(1)FCKEditor

黑名单限制上传文件类型

(2)绕过文件上传检查功能

  • 文件名:%00、0x00截断 ~x.php[\0].jpg
  • 文件头:伪造一个合法的文件头,将PHP附在文件头后(需要解析)

2.Apache、IIS、PHP CGI

  1. Apache 1.x/2.x,对于文件名从后往前,文件类型定义在mime.types中
  2. IIS 6
    ; 截断 ~a.asp;b.jpg
    …/x.asp/下的所有文件都当做asp文件解析
  • Web DAV,IIS PUT
    目录可写,开启WebDAV,PUT,MOVE
    OPTIONS -> PUT -> MOVE
  1. PHP CGI
    PHP 5.1.2, PHP 5.3.1
    cgi.fix_pathinfo = 1
    http://www.test.com/path/tets.jpg/xxx.php (xxx.php不存在)
    解析test.jpg

3.设计安全的文件上传功能(结合业务需求)

  1. 文件上传目录设置为不可执行
  2. 判断文件类型
    MIME,后缀,白名单
    图片,压缩函数/resize函数
  3. 使用随机函数改写文件名或路径
  4. 单独设置文件服务器的域名

九、认证与会话管理

1.Who am I

认证 Authentication,识别用户身份
授权 Authorization,决定用户权限

2.密码

  1. 对抗暴力破解
  • 长度:6+(普通)/8+(重要),且双因素认证
  • 复杂度:区分大小写,大小写、数字、字符两种以上组合,避免连续、重复字符
  1. 防止包含用户隐私
  • 不要使用用户的公开数据
  • 不要使用与个人隐私相关的数据(QQ、身份证、昵称、电话(手机)、生日、英文名、公司名…)
  1. 保存
  • 加密
  • 散列

3.多因素认证

支付宝:支付密码,手机动态口令,数字证书…

4.Session与认证(会话劫持,Session hijacking)

密码与证书等用于登录认证,认证成功后,用SessionID替换
SessionID保存

  • Cookie 加密保存
  • URL(不靠谱)

Session劫持:SessionID在生命周期内被窃取,使用该SessionID登进目标账户,如果SessionID保存在Cookie中,则可以称为Cookie劫持

Session泄露途径:XSS、网络嗅探、本地木马窃取

会话劫持防御:

  • Web层
  1. 更改Session名称
  2. 关闭透明化SessionID
  3. Httponly
  4. 关闭所有phpinfo类的dump request信息页面
  5. 使用User-Agent检测请求的一致性
  6. 加入Token校验
  • 网络层
  1. telnet , rlogin -> openSSH or SSH
  2. FTP -> SFTP
  3. HTTP -> SSL
  4. IP -> IPSec
  5. 任何远程连接 -> VPN
  6. Hub -> Switch

5.会话固定(Session fixation)

(1)概述

用户登录网站过程中,登录前后SessionID没有改变,则称为会话固定,诱骗用户使用攻击者指定的SessionID

(2)步骤

  1. 攻击者重置目标用户的SessionID,监听会话状态
  2. 目标用户携带攻击者设定的SessionID登录
  3. 攻击者通过SessionID获得合法会话

(3)重置SessionID的方法

  1. 使用客户端脚本来设置Cookie到浏览器 ~Httponly
  2. 使用HTML的<META>标签加Set-Cookie属性
  3. 使用Set-Cookie的HTTP响应头设置Cookie

(4)防御

  1. 用户登录时生成新的SessionID
  2. Httponly,关闭透明化SessionID,UA验证,Token校验

6.Session保持攻击

(1)Session生命周期:

  • 用户长时间未活动
  • 用户点击退出
    服务器将销毁Session

(2)方法

刷新页面/修改Cookie中的Expire时间,以保持Session不过期,使Session变成Third-party Cookie

(3)对抗

  1. 规定有效期,过期强制销毁 ~影响用户体验
  2. 当用户客户端发生变化,要求重新登录(IP、UA…)
  3. 每个用户只允许拥有一个Session

7.单点登录(SSO)

Single Sign On,登录一次,访问所有系统
风险集中化,考虑双因素认证,OpenID


十、访问控制

设计方案应满足“最小权限原则”

1.What can I do

权限/访问控制:
某个主体(Subject)对某个客体(Object)需要实施某种操作(Operation),而系统对这种操作的限制就是权限控制

ACL,访问控制列表,主体、客体、操作之间的关系构成ACL

  • 网络中:防火墙ACL
  • 操作系统中:文件ACL
  • Web应用中:
    基于URL的访问控制
    基于方法(method)的访问控制
    基于数据的访问控制(水平)

2.垂直权限管理

基于角色的访问控制(Role-Based Access Control) RBAC

RBAC定义不同角色,不同角色拥有不同权限,一个用户可拥有多个角色,角色有高低之分(权限高低)

Spring security(认证、授权…)
基于URL、方法的访问控制
基于表达式的访问控制

PHP-Zend Framew

高权限角色访问低权限角色的资源,允许
如果低能访问高,则发生“越权访问”

3.水平权限管理

基于数据的访问控制

表现:同一角色的用户,A可以访问B的数据

解决方案参考:用户组(Group)、规则引擎
没有特别完美的解决方案

4.OAuth简介

OpenID解决认证
OAuth解决授权
三个角色:

消费方 服务提供方 用户
1.0 consumer server provider user
client server resource owner

十一、加密算法与随机数

1.加密算法

(1)分组加密算法

DES、3-DES、Blowfish、IDEA、AES…

(2)加密模式

ECB、CBC、CFB、OFB、CTR

(3)流加密算法

RC4、ORXY、SEAL

(4)针对加密算法的攻击

  1. 唯密文攻击
  2. 已知明文攻击
  3. 选择明文攻击
  4. 选择密文攻击(CBC模式的Padding Oracle Attack)

2.针对流加密攻击

  1. Reuse Key Attack(使用同一个秘钥进行多次加/解密)
  2. Bit-fipping attack ~加MAC(消息验证码)
  3. 弱随机IV问题

3.WEP破解

WEP使用RC4加密:

  • 初始向量IV
  • CRC-32检验

Aircrack

4.秘钥管理

避免秘钥硬编码
Web常见做法:
将秘钥(包括密码)保存在配置文件或数据库中

5.伪随机问题

避免弱伪随机算法
时间函数不等于随机数
Seed

6.实践与建议

(1)最佳实践

  1. 不要使用ECB模式
  2. 不要使用流密码(如RC4)
  3. 使用HMAC-SHA1替代MD5(甚至是SHA1)
  4. 不要使用相同的key做不同的事
  5. salts和IV需要随机产生
  6. 不要自己实现加密算法,尽量使用安全专家实现好的库
  7. 不要依赖系统的保密性

(2)建议

  1. 使用CBC模式的AES256用于加密
  2. 使用HMAC-SHA512用于完整性检查
  3. 使用带salt的SHA-256或SHA-512用于hashing

十二、Web框架安全

1.MVC框架安全

MVC(Model View Controller)

  • View 用户视图,页面展示
  • Controller 应用的逻辑实现,接受View层传入的用户请求,并转发给对应的Model做处理
  • Model 实现模型,数据处理

MVC可以解决的安全威胁(不涉及业务逻辑)
XSS、CSRF、SQL注入、访问控制、认证、URL跳转

2.模本引擎与XSS防御

XSS发生在view层,输出编码,针对不同上下文的XSS,使用不同的编码方式
Django templates使用filter中的escape作为HTMLENcode的方法
Velocity

3.Web框架与CSRF防御

Web应用开发中区分“读操作”和“写操作”(写用POST)
Security token的私密性(不可预测性原则),是防御CSRF的基础
对于Web框架,自动在涉及POST的代码中添加token,包括:所有的form表单,所有的Ajax POST请求
Rails , Django

防御CSRF,Web框架改动

  1. 在Session中绑定token,如果不能保存到服务端session中,可以替代为保存到cookie里
  2. 在form表单中自动填入token字段
  3. 在Ajax请求中自动添加token
  4. 在服务器端对比POST提交参数的token与session中绑定的token是否一致,以验证CSRF攻击

4.HTTP Headers管理

管理跳转目的地址:

  1. 如果web框架提供统一的跳转函数,跳转函数内使用白名单
  2. 控制HTTP的Location字段,~白名单

5.数据持久层与SQL注入

使用对象关系映射ORM(Object/Relational Mapping)框架对抗SQL注入

6.Web框架自身安全

Struts 2(CVE-2010-1870)
Spring MVC(CVE-2010-1622)
Django 0.95


十三、拒绝服务攻击

CC(Challenge Collapasar)、ReDoS(正则表达式DoS)

1.分类

(1)攻击网络宽带资源

  1. 直接
  • ICMP/IGMP洪水攻击
  • UDP洪水攻击
  1. 反射和放大
  • ACK反射攻击
  • DNS放大攻击
  • NTP放大攻击
  • SNMP放大攻击
  1. 攻击链路
  • Coremelt攻击

(2)攻击系统资源

  1. 攻击TCP连接
  • TCP连接洪水攻击
  • SYN洪水攻击
  • PSH+ACK洪水攻击
  • RST洪水攻击
  • Sockstress攻击
  1. 攻击SSL连接
  • THC SSL DoS攻击
  • SSL洪水攻击

(3)攻击应用资源

  1. 攻击DNS服务
  • DNS QUERY洪水攻击
  • DNS NXDOMAIN洪水攻击
  1. 攻击Web服务
  • HTTP洪水攻击
  • Slowloris攻击
  • 慢速POST请求攻击
  • 数据处理过程攻击

(4)混合攻击

攻击分类 洪水 慢速
网络层攻击 ICMP/IGMP
传输层攻击 UDP、TCP连接、SYN、PSH+ACK、ACK反射攻击、RST、SSL Sockstress、THC SSL DoS
应用层攻击 DNS QUERY、 DNS NXDOMAIN、DNS放大攻击、HTTP、SNMP放大攻击、NTP放大攻击 Slowloris、慢速POST请求、数据处理过程

(5)一些防御措施

  1. 应用代码做好性能优化 ~memcache
  2. 网络架构优化(CDN、负载均衡、反向代理、集群、缓存、HA)
  3. 限制每个IP的请求频率
  4. 验证码
  5. Yahoo(Detecting system abuse)

PDF,link

Leave a Reply

Your email address will not be published. Required fields are marked *