常见 Web 漏洞
这篇归纳常见的 Web 漏洞:暴力破解、命令注入、CSRF、文件包含、文件上传、SQL 注入、XSS。每类漏洞都从原理 → 利用思路 → 防御修复三个角度说明,重点放在如何修复。
暴力破解
原理:使用枚举法(穷举法)对登录密码进行猜解。没有任何安全措施的网站很容易被破解。
防护强度递进:
- 程序员对登录错误做限制(如两次输入密码的间隔时间),暴力破解就需要很长时间。
- 每次登录都动态生成
user_token,破解会更困难——需要编写脚本:访问首页获取user_token、带 token 发送登录数据包、循环重复,直到破解出密码。 - 最安全:设置动态验证码,并对每天用户输入错误的次数进行限制,可大幅提升安全等级。
防御修复:动态验证码 + 登录失败次数限制(账号锁定/IP 限速)+ 动态 token + 强密码策略。
命令注入
原理:命令即操作系统命令。命令注入是通过 Web 程序在服务器上拼接系统命令,从而执行攻击者想要的操作。
利用流程:
- 检测网站是否调用了系统命令,函数或函数参数是否可控。
- 确定命令中哪一部分可以被控制。
- 确定要注入的命令,用命令连接符进行拼接。
命令连接符:
| 符号 | 含义 |
|---|---|
& | 两个命令无约束关系,仅简单拼接 |
&& | 前一个命令执行成功后才执行下一条 |
| | 管道:前一个命令的输出作为下一个命令的输入 |
|| | 前一条命令执行失败后才执行下一条 |
在 Windows 下可用
&/&&/|拼接;Linux 下同样支持,且支持单引号。命令注入通常有回显,若无输出结果,可通过延时注入、远程请求自己的 Web 服务器等方式判断是否成功。
防御修复:
- 限制文本框输入的字符数,过滤特殊符号。
- 不推荐使用黑名单——容易被绕过,例如
whoami与who""ami执行结果相同。 - 优先使用白名单校验,避免直接拼接系统命令(用语言提供的安全 API 代替 shell 拼接)。
CSRF 跨站请求伪造
CSRF(Cross-Site Request Forgery,跨站请求伪造),也称 “One Click Attack” 或 “Session Riding”。受害者在当前已登录的 Web 应用上执行了非本意的操作——攻击者欺骗浏览器,让其以受害者的名义执行攻击者想要的操作。
利用思路:截取网站修改密码的数据包,分析其提交的参数,重新构造网页,诱使受害者点击。
防御修复:
- 校验 Referer 值,对于不是本站点的 Referer,提交的参数不生效。
- 使用 token 值(CSRF Token)。
- 关键操作要求输入原密码、验证码等二次确认。
文件包含
原理:一句话概括就是"偷梁换柱"——设法把程序真正要包含的文件掉包,换成攻击者想让它包含的文件。文件包含本质是一种代码处理方式,相关函数如 include、require,参数是文件名。文件包含不仅能读取文件,还可以执行远程文件。
防御修复:避免用用户可控参数作为包含路径;关闭远程文件包含(如 PHP 的 allow_url_include);对包含路径做白名单。
文件上传
原理:文件上传是 Web 常见功能。文件上传漏洞指 Web 允许用户上传恶意代码文件,并能在服务器上运行。
利用思路按服务器限制强度递进:
- 服务器未限制类型:直接上传 PHP 脚本(webshell)。
- 服务器限制了类型:通过代理抓包对比正常上传和错误上传的区别,修改后再上传(如改
Content-Type、后缀绕过)。 - 服务器仅允许图片:自制"图片马",并结合文件包含漏洞执行 PHP 脚本。
制作图片马(Windows):
copy 1.jpg/b + 1.txt/a 2.jpg
/b表示二进制文件,/a表示文本文件;用copy /?可查看详细参数。
防御修复:
- 阻止非法文件上传:文件后缀名白名单、文件类型匹配、文件内容头部(魔数)判断。
- 阻止非法文件执行:文件重命名、文件压缩重生成、存储目录去掉执行权限、存储目录与 Web 目录分离。
- 服务端对上传的图片重新生成,则"图片马"方法失效。
SQL 注入
原理:把恶意 SQL 拼接进后端查询,从而读取/篡改数据库。按结果是否回显分两类。
回显注入
将数据库执行的结果直接输出到页面,可据此构造数据查询。
三种 MySQL 注释符:
| 注释符 | 说明 |
|---|---|
# | 单行注释,注意与 URL 中的 # 区分,常编码成 %23 |
-- (短线短线空格) | 单行注释,注意末尾有空格 |
/* 内容 */ | 多行注释;/**/ 在注入中常用来当空格使用(绕过) |
常用函数与对象:
| 用法 | 作用 |
|---|---|
UNION | 合并两个或多个 SELECT 的结果集 |
@@version | 查看系统版本信息 |
@@datadir | 查看数据库物理路径 |
user() | 查看当前系统用户名 |
database() | 查看当前数据库名 |
information_schema.tables | 系统表,配合 table_schema="dvwa" 指定库名查表名 |
load_file() | 调用本地文件 |
示例(教学环境 DVWA):
id=1' union select @@version,@@datadir #SQL 盲注
数据的执行结果不会直接显示在页面上,页面只显示"真/假"两种状态,需要通过布尔判断或时间延时逐位推断数据。
防御修复:使用参数化查询/预编译语句、最小权限数据库账号、输入校验与白名单、关闭详细报错回显。
XSS 跨站脚本
XSS 把恶意脚本注入到页面,在其他用户浏览器中执行。常用弹窗函数用于验证:alert(/xss/)、confirm(/xss/)、prompt(/xss/)。
| 类型 | 攻击代码位置 | 输出位置 |
|---|---|---|
| 反射型 | URL 中 | HTTP 响应中 |
| 存储型 | 数据库中 | HTTP 响应中 |
| DOM 型 | URL 中 | DOM 节点中 |
反射型攻击流程:攻击者发送包含攻击脚本的 URL,诱使用户访问;用户浏览器对攻击代码进行响应,把信息发送到攻击者的 Web 服务器;攻击者据此获取会话信息并劫持用户会话。
防御修复:
- 输入过滤:在服务端设置白名单。
- 输出过滤:根据输出位置做编码——输出到 HTML 标签时进行 HTML 编码,输出到 JavaScript 时进行 JavaScript 转义。
- 重要 Cookie 设置 HttpOnly,使 XSS 无法读取该 Cookie。