常见 WEB 安全漏洞原理及防御措施详解
一、背景概述
在网络攻防体系中,Web 系统通常是攻击者的首选目标。攻击者往往通过 Web 打点的方式,先获取边界 Web 服务器的权限,再以此为跳板实施内网横向渗透。由于 Web 系统通常涉及大量的用户数据和敏感信息,一旦受到攻击或破坏,可能造成数据泄露、服务中断等严重影响。
相较于攻击方,Web 系统也是防守方的重点防护对象。作为安全开发或安全运营人员,及早发现和修复潜在的 Web 安全漏洞,不仅有助于提高互联网业务系统的稳定性,也能降低后期安全运营工作的压力和成本。
二、Web 漏洞详解
1. SQL 注入 (SQL Injection)
1.1 漏洞简介
SQL 注入漏洞的本质是应用程序未能充分验证和过滤用户提供的输入数据,导致攻击者能够将恶意 SQL 代码注入到应用程序的 SQL 查询中,从而执行未经授权的数据库操作。
- 根本成因:后台对用户输入参数未进行任何处理,直接代入 SQL 语句执行。
- 常见危害:数据库的信息泄露、添加系统账号、读/写文件获取 Webshell 等。
1.2 漏洞分类
针对 SQL 注入的分类没有固定的规范,可从不同的维度分为不同的类型,如:基于注入参数类型、基于请求提交方式、基于获取信息方式等。
- 基于注入参数类型:数字型注入、字符型注入。
- 基于请求提交方式:GET 注入、POST 注入等类别。
- 基于获取信息方式:有回显的注入、无回显的注入。
1. 有回显的注入
(1) 基于联合查询的注入 攻击者利用 UNION 操作符,将恶意查询与应用程序原始查询合并,从而获取额外的数据库信息。攻击者通过不断尝试联合查询,可逐步获取数据库内容。
常规步骤是:首先通过 order by 或 select null 获取返回数据的列数和位置,其次从 information_schema 表中查询当前数据库的表信息、表的字段信息、以及字段对应的数据。
-- 查数据库中的表
SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema=database();
-- 查指定表的字段,如:students
SELECT group_concat(column_name) FROM information_schema.columns WHERE table_name='students';
-- 查指定字段的值,如:username
SELECT username FROM students;
(2) 基于报错的注入 利用应用程序返回的错误消息来获取数据库信息。攻击者通过构造恶意输入,触发 SQL 错误,进而从错误消息中收集敏感信息,如表名、列名等。
2. 无回显的注入
(1) 基于时间的盲注 该类型的注入不会直接返回数据,而是利用延迟函数(如:SLEEP)判断 SQL 查询是否成功执行。攻击者通过观察响应时间来推断注入是否成功,从而逐步获取数据。
核心语句逻辑:逐个遍历返回的字符串,如果匹配了目标字符,则整个查询会 sleep 五秒,否则直接返回。


