PHP代码审计(二)审计思路

审计模块:数据验证、身份认证、会话管理、授权、加密、错误处理、日志、安全配置、网络架构

数据验证

数据验证是对输入的数据进行安全验证,大部分的漏洞都是由于对输入的数据未进行安全验证造成的。
常见的数据验证方式为:

  1. 对数据进行精确匹配
  2. 接收白名单的数据
  3. 拒绝黑名单的数据
  4. 对匹配黑名单的数据进行编码

常见的由用户输入的变量:

  • $_SERVER
  • $_GET
  • $_POST
  • $_COOKIE
  • $_REQUEST
  • $_FILES
  • $_ENV
  • $_HTTP_COOKIE_VARS
  • $_HTTP_ENV_VARS
  • $_HTTP_GET_VARS
  • $_HTTP_POST_FILES
  • $_HTTP_POST_VARS
  • $_HTTP_SERVER_VARS

身份认证

对用户身份进行验证,并且:

  • 检查代码进行用户认证的位置,是否能够绕过认证,例如:登录代码可能存在表单注入。
  • 检查登录代码有无使用验证码等,防止暴力破解的手段

会话管理

  1. HTTPOnly设置
    将session.cookie_httponly = ON ,客户端脚本无法访问该cookie,该指令可以有效预防XSS攻击劫持会话ID
  2. domain设置
    检查 session.cookie_domain 是否只包含本域,如果是父域,则其他子域能够获取本域的cookies
  3. path设置
    检查 session.cookie_path,如果网站本身应用在/app,则 path 必须设置为/app/,才能保证安全
  4. cookie持续时间
    检查 session.cookie_lifetime,如果时间设置过程过长,即使用户关闭浏览器,攻击者也会危害到帐户安全
  5. secure设置
    如果使用 HTTPS,那么应该设置 session.cookie_secure=ON,确保使用 HTTPS 来传输
    cookies
  6. session固定
    如果当权限级别改变时(例如核实用户名和密码后,普通用户提升到管理员),我们就应该修改即将重新生成的会话 ID,否则程序会面临会话固定攻击的风险。
  7. CSRF
    跨站请求伪造攻击,是攻击者伪造一个恶意请求链接,通过各种方式让正常用户访问后,会以用户的身份执行这些恶意的请求。我们应该对比较重要的程序模块,比如修改用户密码,添加用户的功能进行审查,检查有无使用一次性令牌防御 csrf 攻击。

授权

对用户访问的颜面进行管理,禁止普通用户访问管理页面等,有时开发者会忘记对这些权限进行验证,某些页面使用参数调用功能,没有经过权限验证。以及有的程序会把数据库链接账号和密码,直接写到数据库链接函数中,同样是未授权导致用户可以连接数据库。

加密

  1. 采用密文存储密码
    采用明文的形式存储密码会严重威胁到用户、应用程序、系统安全。
  2. 密码应当采用强加密
    使用容易破解的加密算法,MD5 加密已经部分可以利用 md5 破解网站来破解
  3. 密码不应该设置在攻击者能够访问的文件
    例如:保存密码在 txt、ini、conf、inc、xml 等文件中,或者直接写在 HTML 注释中,攻击者直接对文件进行访问

安全配置

上一篇笔记中写的配置设置

常见漏洞产生的函数

RCE

  • system
  • exec
  • passthru
  • ``
  • shell_exec
  • popen
  • proc_open
  • pcntl_exec

防范方法:

  1. 使用自定义函数或函数库来替代外部命令的功能
  2. 使用 escapeshellarg 函数来处理命令参数
  3. 使用 safe_mode_exec_dir 指定可执行文件的路径

XSS

  • echo
  • print
  • printf
  • vprintf

防范方法:

  1. 如果输入数据只包含字母和数字,那么任何特殊字符都应当阻止
  2. 对输入的数据经行严格匹配,比如邮件格式,用户名只包含英文或者中文、下划线、连字符
  3. 对输出进行 HTML 编码,编码规范,比如<>等

文件包含

  • include
  • include_once
  • require
  • require_once
  • show_source
  • highlight_file
  • readfile
  • file_get_contents
  • fopen
  • nt>file

防范方法:

  1. 对输入数据进行精确匹配,比如根据变量的值确定语言 en.php、cn.php,那么这两个文件放在同一个目录下’language/’.$_POST[‘lang’].’.php’,那么检查提交的数据是否是 en 或者cn 是最严格的,检查是否只包含字母也不错
  2. 通过过滤参数中的/、..等字符

代码注入

  • eval
  • preg_replace+/e
  • assert
  • call_user_func
  • call_user_func_array
  • create_function

防范方法:

  1. 输入数据精确匹配
  2. 白名单方式过滤可执行的函数

sql注入

  • insert
  • delete
  • update
  • select

防范方法:

  1. 使用参数化查询

HTTP响应拆分

防范方法:

  1. 精确匹配输入数据
  2. 检测输入输入中如果有\r 或\n,直接拒绝

文件上传

  • move_uploaded_file

防范方式:

  1. 使用白名单方式检测文件后缀
  2. 上传之后按时间能算法生成文件名称
  3. 上传目录脚本文件不可执行
  4. 注意%00 截断

变量覆盖

  • parse_str
  • mb_parse_str
  • import_request_variables
  • Register_globals=ON 时,GET 方式提交变量会直接覆盖

防范方法:

  1. 设置 Register_globals=OFF
  2. 不要使用这些函数来获取变量
posted @   crayon's  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示