# SQL注入:原理、入侵过程与防御对照|红蓝对抗演练视角 > 核心一句话:**将用户可控输入直接拼入SQL语句,破坏原有SQL语法结构;攻击者篡改数据库查询逻辑,实现查询数据、读写文件、接管数据库服务器。** ## 一、原理拆解 后端直接拼接用户传入参数,构造SQL语句交给数据库执行。 ❌危险代码示例 ```php $name = $_GET['username']; $sql = "SELECT * FROM user WHERE username = '$name' AND password = '$pwd'"; ``` 攻击者传入 payload:`username=admin' or '1'='1'--` 拼接后SQL变成: ```sql SELECT * FROM user WHERE username = 'admin' or '1'='1'--' AND password = '$pwd' ``` `--` 代表SQL注释,后面语句全部忽略;`or '1'='1'`恒成立,直接查询全部用户,可实现登录绕过。 ### 注入分类(演练常考) 1. **联合查询注入 union select**:有回显,把额外查询结果拼在页面输出,直接拖库。 2. **布尔盲注**:页面只有两种状态(正常/报错),没有直接数据回显,逐字符猜数据。 3. **时间盲注**:页面无任何差异,使用`sleep()`延时,根据响应时间判断条件真假。 4. **报错注入**:利用数据库报错机制,将查询数据在错误信息中输出。 5. **堆叠注入**:执行多条SQL语句(`;`分隔),新增/删除数据、创建账户。 ## 二、完整入侵链路 1. 探测:寻找GET/POST参数、Cookie参数,输入单引号`'`,观察页面是否报错/异常,判断是否存在SQL注入。 2. 确定注入点类型:判断是否有回显,区分联合/布尔/时间盲注。 3. 信息搜集:查询数据库版本、库名、表名、字段名。 4. 数据拖取:读取表内敏感数据(手机号、账号密码),也就是拖库。 5. 权限提升: - 高权限数据库账号,可读写服务器本地文件(`load_file`、`into outfile`写入webshell) - 数据库开启`xp_cmdshell`(MSSQL)直接执行系统命令RCE 6. 获取服务器立足点,本机提权、抓取凭据,进入内网横向渗透。 ### 基础Payload示例 ``` # 测试单引号 ?user=admin' # union联合查询,获取版本 ?user=-1' union select 1,version(),database()-- - # 布尔盲注 ?user=admin' and substr(database(),1,1)='a'-- - # 时间盲注 ?user=admin' and sleep(5)-- - ``` ## 三、蓝队审计 & 检测 ### 白盒审计重点 1. 查找直接拼接用户输入到SQL语句的代码。 2. 优先检查:JDBC拼接字符串、PHP字符串拼接SQL。 3. 安全写法:**预编译语句(参数化查询,PreparedStatement)** ### 流量&日志特征 - 请求参数携带 `' " or and union select sleep() -- #` 等SQL关键字与注释符 - 数据库大量异常报错日志、大量时间延迟请求(时间盲注) - 批量遍历查询表/字段,大量union查询特征请求 ## 四、防御对照(优先级由高到低) ✅【首选:参数化预编译查询】 SQL语句结构固定,外部输入仅作为**参数值**,不会被数据库解析为SQL语法。从根源杜绝注入。 > Java JDBC、PHP PDO、Python pymysql都支持预编译。 ✅【输入校验(白名单)】 例如ID只允许数字;对输入格式做校验,黑名单容易被编码、大小写绕过,不作为主防护。 ✅【最小权限原则】 Web连接数据库账号只分配查询业务表权限;**禁止file、xp_cmdshell等高权限**。就算注入成功,限制危害范围。 ✅【关闭数据库报错回显】 页面不要输出原始数据库报错信息,防止报错注入泄露库表信息(仅辅助防护,不能阻止注入) ✅【WAF】 拦截注入特征流量,属于外层防护,可以被编码、变形绕过,**不能单独依靠WAF**。 ## 五、高频易混考点 1. SQL注入属于**数据库层面漏洞**;越权属于业务逻辑漏洞,二者分开。 2. 预编译是根治手段;**黑名单过滤、转义都属于辅助,存在绕过风险**。 3. 堆叠注入依靠分号`;`,部分数据库/驱动不支持多条语句执行。 4. 时间盲注没有页面回显,依靠响应延时判断,隐蔽性更强。 一句话速记: SQL注入根源是外部输入直接拼接SQL语句;分为联合、布尔、时间、报错注入;根治方案是**预编译参数化查询,数据库账号最小权限**。