Web 漏洞代码评审检查清单
admin
2026-10-27 08:16
151人看过
免费
# Web漏洞代码评审检查清单(OWASP Top10+白盒审计专用)
> 使用方法:先梳理**所有入口点(GET/POST/Cookie/Header/上传文件/JSON参数)**,再追踪数据流到危险函数(Sink);严格遵循**白名单校验+上下文输出编码+最小权限**三大原则。
## 一、通用审计前置项(必查)
### 1. 入口点梳理(所有不可信来源)
- [ ] GET、POST、JSON Body、Cookie、HTTP Header(Referer、User-Agent、X-*自定义头)
- [ ] 文件上传、URL参数、路由变量、表单隐藏域、前端传回的JSON数据
- [ ] 第三方接口回调、异步请求、定时任务外部入参
- [ ] 仅做前端校验,无后端二次校验(高危缺陷)
### 2. 数据流追踪规则
- [ ] 用户输入直接拼入语句、命令、文件路径、XML解析 → 重点标记
- [ ] 黑名单过滤(过滤`< > ' ; | &`)→ 极易被编码、换行、大小写绕过,一律视为不安全
- [ ] 校验只做长度、正则,未做类型与格式白名单
### 3. 全局配置检查
- [ ] 调试模式关闭:禁止打印堆栈、SQL报错、服务版本信息
- [ ] 响应头:配置`X-Content-Type-Options、X-Frame-Options、Content-Security-Policy`
- [ ] 禁止硬编码密钥、数据库账号、密码、API Key(明文写死=高危)
- [ ] 第三方组件:排查依赖包漏洞(Log4j、Fastjson、Shiro、Spring4Shell)
---
## 二、OWASP Top10 漏洞逐项代码检查清单(含危险函数+安全写法)
### (一)注入类漏洞(最高危:SQL注入、命令注入、代码注入、LDAP/XPath注入)
#### 1)SQL注入(SQLi)
**危险代码特征**:字符串拼接SQL、直接把变量拼进语句;未使用预编译
- 危险函数:
- Java:`Statement.execute()` 字符串拼接;Mybatis `${}` 直接取值(`#{}`才安全)
- PHP:`mysql_query、mysqli_query、PDO->query` + 字符串拼接
- Python:f-string拼接SQL、字符串格式化拼接
- 检查项
- [ ] 所有SQL是否使用**参数化预编译(PreparedStatement)**,使用占位符,杜绝字符串拼接
- [ ] Mybatis:禁止使用`${param}`接收外部参数;仅允许`#{param}`
- [ ] 数据库账号最小权限:禁止FILE、执行存储过程等高权限
- [ ] 禁止使用字符串转义(addslashes、mysql_real_escape_string)作为唯一防护,存在宽字符绕过风险
#### 2)命令注入(命令执行 RCE)
**危险函数(重点检索关键字)**
- PHP:`system()、exec()、shell_exec()、passthru()、popen()、proc_open()、反引号 ``
- Java:`Runtime.exec()、ProcessBuilder`(拼接字符串)
- Python:`os.system、subprocess.call(shell=True)`
- 检查项
- [ ] 用户可控参数直接拼入系统命令字符串
- [ ] 未做白名单,仅过滤`; | & $`等符号(极易绕过)
- [ ] 安全写法:采用数组传参(不开启shell),仅允许字母数字白名单
#### 3)代码注入(远程代码执行)
危险函数:
- PHP:`eval()、assert()、preg_replace(/e)、create_function、call_user_func`
- Java:脚本引擎`ScriptEngine`执行外部输入;反序列化漏洞
- Python:`eval()、exec()`
- 检查项:外部输入直接进入代码执行函数,无严格白名单限制
#### 4)LDAP / XPath / NoSQL注入
- [ ] LDAP查询直接拼接用户输入,未做转义
- [ ] MongoDB等NoSQL直接拼接JSON,未使用参数化查询,存在注入
---
### (二)文件类漏洞:文件包含 + 路径遍历 + 文件上传(WebShell落地)
#### 1)路径遍历(目录穿越)
危险函数:`file_get_contents、fopen、readfile、file_put_contents`
- 检查项
- [ ] 用户输入直接拼接文件路径,未过滤`../ ..\ ./ %00`
- [ ] 仅做黑名单过滤,未固定基础目录(chroot/限定根目录)
- [ ] 未校验文件名后缀,可读取任意系统文件
- 安全控制:先把路径规范化,再校验是否在指定目录内;白名单限定文件名
#### 2)文件包含(LFI/RFI)
危险函数:`include、include_once、require、require_once`
- [ ] 文件名由外部参数控制,未做严格白名单
- [ ] 允许远程文件(http://、ftp://)引入 → RFI远程包含
- [ ] 存在零字节截断`%00`漏洞(旧版本PHP)
#### 3)文件上传漏洞(重点)
- [ ] 仅前端校验后缀,后端无校验
- [ ] 仅校验文件扩展名,未校验文件头(MIME类型)
- [ ] 文件名可控,可修改后缀、添加双后缀(xxx.jpg.php)
- [ ] 上传目录允许执行脚本(无`.htaccess`限制)
- [ ] 文件名未过滤特殊字符,可写入任意目录
- [ ] 上传文件路径可控,可覆盖配置文件
---
### (三)XSS跨站脚本
#### 三类XSS审计要点
1. **存储型XSS(最高危)**:用户输入存入数据库,页面直接输出
2. **反射型XSS**:URL参数直接输出到HTML页面
3. **DOM型XSS**:JS直接把输入赋值给`innerHTML、document.write、eval`
- 检查项
- [ ] 输出到HTML上下文:未做HTML实体编码(& < > " ')
- [ ] 输出到JS上下文:未做JS转义;直接拼接字符串
- [ ] 输出到URL/Style上下文:缺少对应上下文编码
- [ ] 直接使用`innerHTML、dangerouslySetInnerHTML`渲染未净化内容
- [ ] 只靠前端过滤,后端无输出编码
- 安全规则:**输出编码必须和上下文匹配;禁止直接输出原始用户数据**
---
### (四)不安全反序列化(高危RCE)
- 危险点:接收用户可控数据直接调用反序列化函数
- Java:`readObject()`;反序列化JSON(Fastjson、Jackson)
- PHP:`unserialize()`
- Python:`pickle.loads()`
- Node:`yaml.load()`(未使用safe_load)
- 检查项
- [ ] 未校验数据来源,直接反序列化外部POST/JSON数据
- [ ] 没有类型白名单,可注入恶意对象触发命令执行
- [ ] 第三方序列化组件存在漏洞(Fastjson、Shiro RememberMe)
---
### (五)XXE XML外部实体
- 危险点:解析不可信XML,未关闭外部实体、网络访问
- 检查项
- [ ] XML解析器未禁用外部实体(DTD)
- [ ] 未关闭HTTP/FTP网络请求,可读取本地文件、内网探测
- 安全写法:设置`LIBXML_NONET`,禁用外部实体与外部DTD
---
### (六)SSRF 服务端请求伪造
危险函数:`curl_exec、file_get_contents、fopen`读取URL地址
- 检查项
- [ ] 用户可控URL,可访问内网IP(127.0.0.1、10/172/192网段)
- [ ] 未禁止访问本地回环、内网地址、端口(Redis、Memcached)
- [ ] 未校验协议,允许file://、gopher://等协议读取本地文件
- 防御:白名单域名+IP段;禁止内网地址;只允许http/https协议
---
### (七)访问控制缺陷(权限类漏洞)
#### 1)垂直越权(功能越权)
- [ ] 未校验角色身份,普通用户可以直接调用管理员接口(删除用户、修改配置)
- [ ] 仅依靠前端隐藏按钮,后端无接口权限校验
#### 2)水平越权(IDOR,未授权访问)
- [ ] 资源ID(user_id、order_id)由用户可控,可直接修改ID查看他人数据
- [ ] 只校验登录状态,不校验“资源归属者是否为当前登录用户”
> 口诀:**所有带ID的查询、删除、修改接口,必须校验归属权限**
#### 3)会话与认证漏洞
- [ ] 弱口令策略,无复杂度、无锁定机制;存在默认账号密码
- [ ] 会话固定:登录前后SessionID不变
- [ ] Cookie未设置`HttpOnly、Secure、SameSite`,易被XSS窃取Cookie
- [ ] 退出登录没有销毁Session,会话可复用
- [ ] 验证码可复用、无时效;短信验证码无频率限制(短信轰炸)
#### 4)CSRF跨站请求伪造
- [ ] 所有POST修改类接口(改密码、下单、删除)没有CSRF Token
- [ ] 仅依靠Cookie校验,未使用随机令牌
---
### (八)业务逻辑漏洞(代码审计高频漏项)
- [ ] 支付金额、订单价格由前端传入,后端未二次校验(金额篡改)
- [ ] 优惠券、积分兑换无次数限制,可无限刷取
- [ ] 并发竞争条件:多线程同时操作余额、库存,未加锁导致超卖、金额异常
- [ ] 任意用户密码重置:重置链接的唯一凭证可被遍历
- [ ] 接口无调用频率限制,可暴力枚举账号、验证码
---
### (九)加密与敏感数据(密码与密钥安全)
- [ ] 密码明文存储;使用MD5、SHA1等弱哈希,无盐值
- [ ] 安全要求:必须使用 bcrypt / Argon2id 加盐哈希存储密码
- [ ] 密钥、数据库密码硬编码在代码、配置文件中;配置文件可直接被下载
- [ ] 敏感数据(手机号、身份证)在日志中明文打印
- [ ] HTTP明文传输,全站未启用HTTPS
---
### (十)信息泄露 & 错误处理
- [ ] 异常页面直接输出堆栈、SQL语句、路径、服务器版本
- [ ] 源码备份文件(.bak、.swp、.git、.svn)可直接访问
- [ ] 接口返回过多字段,泄露手机号、身份证、订单信息
- [ ] 调试接口、测试页面未下线,对外开放
---
## 三、分语言高危函数检索清单(直接全局搜索关键字)
### 1)Java
- RCE:`Runtime.exec、ProcessBuilder、ScriptEngine、readObject`
- SQL注入:`Statement、+字符串拼接、Mybatis ${}`
- 文件操作:`FileInputStream、FileOutputStream`(路径可控)
- SSRF:`URLConnection、HttpClient`
- XXE:`DocumentBuilderFactory`未关闭外部实体
### 2)PHP(审计重点)
- 命令执行:`system、exec、shell_exec、passthru、popen、``反引号`
- 代码执行:`eval、assert、preg_replace(/e)、call_user_func`
- 文件包含:`include、require`
- SQL注入:`mysql_query、mysqli_query、PDO->query`字符串拼接
- 危险配置:`register_globals=On、allow_url_include=On`
### 3)Python
- 命令执行:`os.system、subprocess.call(shell=True)`
- 代码执行:`eval、exec`
- 反序列化:`pickle.loads、yaml.load()`
- SQL注入:f-string、字符串拼接SQL
---
## 四、评审输出模板(直接落地)
1. 漏洞编号 + 漏洞类型(对应OWASP)
2. 代码位置(文件+行号)+ 危险代码片段
3. 漏洞成因(数据流:输入→可控变量→危险函数)
4. 可利用POC
5. 修复方案(给出安全代码示例)
6. 风险等级:严重/高危/中危/低危
---
## 五、审计效率提升技巧
1. 先全局检索危险函数关键字,快速定位Sink点;再回溯变量来源(Source)
2. 优先审计对外暴露的接口、文件上传、查询接口、后台管理模块
3. 排除第三方框架源码,只审计业务代码,减少误报
4. 工具辅助:SAST静态扫描(SonarQube、Semgrep)+人工数据流追踪
版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载或以其他方式使用本站原创内容。