十四、PHP安全

1.文件包含漏洞(File Inclusion)

(1)导致文件包含的函数

  1. PHP
    include()、include_once()、require()、require_once()、fopen()、readfile()…
  2. JSP/Servlet
    ava.io.File()、java.io.FileReader()…
  3. ASP
    include file、include virtual…

(2)成功利用FI的两个条件

  1. Include()等函数通过动态变量的方式引入需要包含的文件
  2. 用户能够控制该动态变量

(3)本地文件包含(Local File Inclusion) LFI

  1. 字符串截断(%00) ~web中禁用0字节
  2. 操作系统对目录最大长度限制(windows:256字节;Linux:4096字节)
  • “././”目录遍历(Path Traversal)
  • 不同编码方式绕过服务端逻辑
    %2e -> .
    %2f -> /
    %5c -> \
    以上组合 -> …/
  • 某些Web容器支持的编码
    …%c0%af -> …/
    …%c1%9c -> …\
  • CVE-2008-2938
  1. open_basedir(与safe_mode是否开启无关)
  • /home: test、test1、test2
    open_basedir = home/test/ -> test
    open_basedir = home/test -> test、test1、test2
  • 多个目录
    Windows:分号隔开
    Linux:冒号隔开

(4)远程文件包含(Remote File Inclusion)RFI

PHP allow_url_include=ON,则include/require函数可以加载远程文件

(5)LFI利用技巧

  1. 包含用户上传的文件
  2. 包含data://或php://input等伪协议
  3. 包含session文件
  4. 包含日志文件,如web server的access log ~(Metasploit)
  5. 包含/proc/self/environ文件 ~(UA注入PHP)
  6. 包含其他应用创建的文件,如数据库文件、缓存文件、应用日志…

2.变量覆盖漏洞

  1. 全局变量覆盖
    变量未初始化,且用户能控制,register_globals=ON更严重
    导致XSS、SQL注入、代码执行…
  2. extract()变量覆盖
    extract()能将变量从数组导入当前的符号表
    第二个参数
    EXTR_OVERWRITE (覆盖)
    EXTR_SKIP (跳过)
  3. 遍历初始化变量
    $$k
  4. import_request_variables()变量覆盖
  5. parse_str()变量覆盖
    解析URL的query string,mb_parse_str()类似
  6. 安全建议
  • 确保register_globals = OFF,若不能自定义php.ini,则应在代码中控制
  • 熟悉可能造成变量覆盖的函数和方法,检查用户是否能控制变量的来源
  • 养成初始化变量的习惯

3.代码执行漏洞

(1)“危险函数”执行代码

直接执行系统命令的函数
popen()、system()、passthru()、exec()

PHP 3.4.3.1(CVE-2011-2505)
MyBB 1.4

挖掘漏洞的过程,通常需要先找到危险函数,然后回溯函数的调用过程,最后看在整个调用过程中用户是否有可能控制输入

(2)“文件写入”执行代码

本地文件写入:file_put_contents()、fwrite()、fputs()

(3)其他执行代码方式

  1. 执行执行代码的函数
    eval()、assert()、system()、exec()、shell_exec()、passthru()、escapeshellcmd()、pcntl_exec()
  2. 本地包含
    include()、include_once()
    require()、require_once()
  3. 本地文件写入
    file_put_contents()、fwrite()、fputs()
    审计时,注意组合类:写入文件、文件包含、危险代码执行
  4. preg_replace()代码执行
    第一个参数存在/e模式修饰符,允许代码执行
    如果没有/e,若第一个参数包含变量,用户可控,有可能通过注入/e%00,注入/e
  5. 动态函数执行
    用户自定义的动态函数
    $GET create_function()
  6. Curly Syntax
  7. 回调函数执行代码
    …太多-_-
    ob_start()
  8. unserialize()导致代码执行
    两个条件
    unserialize()参数用户可以控制
    存在_destruct()或_wakeup()

4.定制安全的PHP环境

(1)php.ini

register_globals = OFF
open_basedir = /home/web/html/
allow_url_include = Off
aloww_url_fopen = Off
display_errors = Off(错误回显,用于开发模式)
log_errors = On
magic_quotes_gpc = 0
cgi.fix_pathinfo = 0
session.cookie_httponly = 1
session.cookie_secure = 1

(2)safe_mode

  • 共享环境:(如APP Engine)开启,与disable_functions配合
  • 单独的应用环境:关闭,依赖disable_functions 开启safe_mode影响的函数…(太多 -_-)

开启safe_mode,exec()、system()、passthru()、popen()等并非禁用,而是只能在“safe_mode_exec_dir”指定目录下可执行文件,如果需要允许这些函数,设置safe_mode_exec_dir的值并设置目录不可写

(3)disable_functions

  • 独立web应用,禁用:…(太多)
  • 共享环境,参考新浪的SAE:…(太多)
  • 禁用类

十五、Web server配置安全

  1. Apache
  • 减少不必要的module,对于使用的module,检查是否有漏洞
  • 单独的用户、用户组
  • access log发送到远程服务器
  1. Nignx
  2. jBoss
    JMX_Console,通过DevelopmentScanner远程加载一个war包
  3. Tomcat Tomcat Manager,~war (配置文件中定义Manager的权限)
  4. HTTP Parameter Pollution
  • HPP通过GET/POST向服务器发送请求时,提交两个相同的参数
  • 绕过服务器端逻辑判断

十六、互联网业务安全

  1. 安全是产品的一个特性
  2. 业务逻辑安全
  3. 密码取回
  4. 垃圾注册(~机器识别)
  • 分析垃圾行为:
    内容:自然语言分析,关键词匹配
    行为:业务逻辑规则
    客户端识别:人机识别,让客户端解析JavaScript
  1. 网络钓鱼(金融)
  • 网站、邮件
  • 识别发件人邮箱
    SPF(Sender Policy Framework)
    Yahoo的DomainKeys
    微软的SenderID
  • 钓鱼网站的防控
    控制传播途径
    关停
    用户教育
    自动化识别
  1. 用户隐私保护
  • 限制数据使用(PCI-DSS)支付卡行业数据与安全标准
  • 保护
    用户应有知情权和选择权
    网站应妥善保管收集到的用户数据,不得用于规定范围之外
  • Do-Not-Track

十七、安全开发流程(SDL)

1.SDL

Secure Development Lifecycle,安全开发生命周期,微软
Secure at the source

十六个步骤(优化后) ~瀑布法开发

  1. 培训
  • 对象:开发人员、测试人员、项目经理、产品经理
  • 知识:安全设计、威胁建模、安全编码、安全测试、隐私等
  1. 安全要求
  2. 质量门/bug栏
  3. 安全和隐私风险评估
  • SRA PRA
  • 威胁模式、安全设计评析、渗透测试、模糊测试范围、隐私评级
  1. 设计要求
  2. 减小攻击面
  3. 威胁建模
  4. 使用指定工具(编译器、链接器)
  5. 弃用不安全函数/API
  6. 静态分析
  7. 动态程序分析
  8. 模糊测试(Fuzzing Test)
  9. 威胁模型和攻击面评析
  10. 事件响应计划
  11. 最终安全评析(FSR)
  12. 发布/存档

SDL -> 软件开发商
SAMM -> 自主软件开发者(OWASP )

2.敏捷SDL

3.SDL实战经验

六条准则:

  1. 与项目经理进行充分沟通,排出足够的时间
  2. 规范公司的立项流程,确保所有项目都能通知到安全部门
  3. 树立安全部门的权威,项目必须由安全部门审核完成后才能发布
  4. 将技术方案写入开发、测试的工作手册
  5. 给工程师培训安全方案
  6. 记录所有的安全bug,激励程序员编写安全的代码

4.需求分析与设计阶段

论证项目的目标、可行性、实现方向等,~checklist

5.开发阶段

  1. 提供安全的函数(OWASP ESAPI、微软)
  2. 将安全方案写入开发规范中,就真正将安全方案落地
  3. 代码审计工具
  • 常见:BOON、Bugscam、Bugscan、CodeAssure、CodeSonar、CodeSpy、CovertyPrevent、Cqual、DevPartner SecurityChecker、flawfinder、Fortify Tools、inForce、its4、MOPS、PrexisEngine、Pscan、RATS、smatch、slint
  1. 甲方可以根据开发规范来定制代码审计工具,检查开发者是否遵守了开发规范,而不是代码是否安全

6.测试阶段

自动、手动
Web安全扫描器:
Appscan、WVS、w3af、skipfish、openvas、arachni…


十八、安全运营

Find and fix, Defend and defer, Secure at the source.

  1. 漏洞修补流程
  • 建立类似bugtracker的漏洞跟踪机制,并为漏洞紧急程度选择优先级
  • 建立漏洞分析机制,并与程序员一起制定修补方案,同时review补丁的代码实现
  • 对曾经出现过漏洞进行归档,并定期统计漏洞修补状况
  1. 安全监控
    Nagios…
  2. 入侵检测
    IDS/IPS,WAF
    ModSecurity,PHPIDS
  3. 紧急响应
  • 报警:邮件、IM、短信
  • 紧急响应组:技术负责人、产品负责人、最了解技术架构的资深开发工程师、资深网络工程师、资深运维系统工程师、资深DBA、资深安全专家、监控工程师、公司公关
  • 保护安全事件现场(下线机器,分析入侵行为、损失…)
  • 以最快速度处理问题

PDF,link

发表评论

电子邮件地址不会被公开。 必填项已用*标注