PHP安全
一,文件包含
原理:实际就是代码注入,对用户的输入过滤的不够严格,过分相信。
PHP包含函数: incllude(),include_once(),require(),require_once()。这几个函数把包含进来的文件的内容当作php代码来执行,不管后缀名
本地包含:被包含的文件在目标服务器上
远程包含:被包含的文件在其他主机上
本地包含的利用技巧:
- 包含本地文件*
- 包含data:和php;//等伪协议
- 包含日志,access_log(请求信息)和error_log(出错请求)
- 包含session文件
- 包含/proc/self/environ 文件。
- 包含上传的临时文件
- 包含其他应用创建的文件,比如数据库文件、缓存文件、应用日志等,需要具体情况具体分析。
注意:
- 当设置了open_basedir,那么就不能包含web目录之外的文件了
- php://input和data伪协议,远程包含要求 allow_url_include 设置为 ON
二,变量覆盖漏洞
全局变量覆盖:
注意:register_globals在PHP 5.3.0废弃了,所以这个方法现在应该不能用了
extract()变量覆盖
- extract()函数能将变量从数组导入当前的符号表
- 当extract()第二个参数为EⅩTR_SKIP,则不会覆盖已有变量的值
- 注意:extract( G E T ) 不 能 写 成 e x t r a c t ( _GET)不能写成extract( GET)不能写成extract(_GET[‘a’])
$$变量覆盖
$a='b'; $b='c'; echo $$a;//相当于echo &b
import_request_variables 变量覆盖
- GET/POST/Cookie 变量导入到全局作用域中
- PHP 4 >= 4.1.0, PHP 5 < 5.4.0
parse_str()
定制安全的php环境
- open_basedir,限制php只能操作特定目录文件,注意/a和/a/的不同
- allow_url_fopen = Off
- allow_url_include = Off,远程文件包含
- display_errors = Off,防止泄露信息
- log_errors = On,记录错误信息,关闭回显
- magic_quotes_gpc = OFF,能被绕过,同时会有新的安全问题
- session.cookie_httponly = 1,防止跨站脚本
- disable_functions
- 。。。。。。。。
文件上传漏洞
问题:
- 上传文件是 Web 脚本语言,服务器的 Web 容器解释并执行了用户上传的脚本,导致代 码执行;
- 上传文件是 Flash的策略文件 crossdomain.xml,黑客用以控制 Flash 在该域下的行为(其 他通过类似方式控制策略文件的情况类似);
- 上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行
- 上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执 行,被用于钓鱼和欺诈。
条件:
- 上传的文件能被容器解释执行=>上传文件所在目录能把web覆盖到
- 用户能访问到=>要知道路径
- 文件的核心内容没有被改变=>恶意代码没有被过滤掉
解决办法:
- 上传目录设置不可执行
- 对文件名进行重命名,对文件路径重写
- 白名单过滤
- 单独设置文件服务器的域名
认证与会话管理
密码与登录
- 明文密码经过哈希后(比如 MD5 或者 SHA-1)再保存到数据库中
- 登录时判断用户提交的“密码”哈希值,与保存在数据库中的“密码”哈希值是否一致
- MD5(Username+Password+Salt),俗称‘加盐’。加的salt是个随机数,这样即使密码相同,最后的哈希值也不一样,杜绝了彩虹表。
Session 与认证
- 当用户登录完成后,在服务器端就会创建一个新的会话(Session),服务器端维护所有在线用户的 Session。有些服务器会把Session加密储存在Cookie中,让客户端保存
- 浏览器需要把当前用户持有的 SessionID 告知服务器。
- 把 SessionID 加密后保存在 Cookie 中跟随http请求发到服务器
单点登录
- 一次登录就可访问所有的业务
- 但是对于某些敏感的业务会要求额外认证
访问控制
Web框架安全
MVC架构
- Ⅴiew 层负责用户视图、页面展示等工作
- Controller 负责应用的逻辑实现,接收 Ⅴiew 层传入的用户请求,并转发给对应的 Model 做处理;
- Model 层则负责实现模型,完成数据的处理
防御
- 在 Ⅴiew 层,可以解决 ⅩSS 问题
- 使用 security token 解决 CSRF 攻击
浏览器安全
同源策略
- 同协议,同域名(ip),同端口
- <script>、<img>等标签不受同源策略限制,但是浏览器限制了 JavaScript 的权限,使其不能读、写返回的内容。
- 跨域 访问的基础““JavaScript 无法控制该HTTP 头”
- DOM、Cookie、ⅩMLHttpRequest ,浏览器加载的一些第三方插件也有各自的同源策略
沙箱
- 多进程
安全世界观
- 黑白名单
- 最小权限
- 纵深防御
- 数据与代码分离
- 不可预测性