跳至内容

常见 Web 漏洞

这篇归纳常见的 Web 漏洞:暴力破解、命令注入、CSRF、文件包含、文件上传、SQL 注入、XSS。每类漏洞都从原理 → 利用思路 → 防御修复三个角度说明,重点放在如何修复。

以下内容用于授权测试与安全教育。理解攻击是为了更好地防御,落地时请以"防御与修复"小节为准。

暴力破解

原理:使用枚举法(穷举法)对登录密码进行猜解。没有任何安全措施的网站很容易被破解。

防护强度递进:

  • 程序员对登录错误做限制(如两次输入密码的间隔时间),暴力破解就需要很长时间。
  • 每次登录都动态生成 user_token,破解会更困难——需要编写脚本:访问首页获取 user_token、带 token 发送登录数据包、循环重复,直到破解出密码。
  • 最安全:设置动态验证码,并对每天用户输入错误的次数进行限制,可大幅提升安全等级。

防御修复:动态验证码 + 登录失败次数限制(账号锁定/IP 限速)+ 动态 token + 强密码策略。

命令注入

原理:命令即操作系统命令。命令注入是通过 Web 程序在服务器上拼接系统命令,从而执行攻击者想要的操作。

利用流程

  1. 检测网站是否调用了系统命令,函数或函数参数是否可控。
  2. 确定命令中哪一部分可以被控制。
  3. 确定要注入的命令,用命令连接符进行拼接。

命令连接符:

符号含义
&两个命令无约束关系,仅简单拼接
&&前一个命令执行成功后才执行下一条
|管道:前一个命令的输出作为下一个命令的输入
||前一条命令执行失败后才执行下一条

在 Windows 下可用 &/&&/| 拼接;Linux 下同样支持,且支持单引号。命令注入通常有回显,若无输出结果,可通过延时注入远程请求自己的 Web 服务器等方式判断是否成功。

防御修复

  • 限制文本框输入的字符数,过滤特殊符号。
  • 不推荐使用黑名单——容易被绕过,例如 whoamiwho""ami 执行结果相同。
  • 优先使用白名单校验,避免直接拼接系统命令(用语言提供的安全 API 代替 shell 拼接)。

CSRF 跨站请求伪造

CSRF(Cross-Site Request Forgery,跨站请求伪造),也称 “One Click Attack” 或 “Session Riding”。受害者在当前已登录的 Web 应用上执行了非本意的操作——攻击者欺骗浏览器,让其以受害者的名义执行攻击者想要的操作。

利用思路:截取网站修改密码的数据包,分析其提交的参数,重新构造网页,诱使受害者点击。

防御修复

  • 校验 Referer 值,对于不是本站点的 Referer,提交的参数不生效。
  • 使用 token 值(CSRF Token)。
  • 关键操作要求输入原密码、验证码等二次确认。

文件包含

原理:一句话概括就是"偷梁换柱"——设法把程序真正要包含的文件掉包,换成攻击者想让它包含的文件。文件包含本质是一种代码处理方式,相关函数如 includerequire,参数是文件名。文件包含不仅能读取文件,还可以执行远程文件

防御修复:避免用用户可控参数作为包含路径;关闭远程文件包含(如 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。
最后更新于