SQL注入的基础

张开发
2026/4/7 8:33:20 15 分钟阅读

分享文章

SQL注入的基础
SQL注入介绍SQL注入就是指web应用程序对用户输入数据的合法性没有判断前端传入后端的参数是攻击者可控的并且参数传入数据库查询攻击者可以通过构造不同的sql语句来实现对数据库的任意操作。sql注入的原理1.参数用户可控前端传入后端的参数内容是用户可以控制的2.参数带入数据库查询传入的参数拼接到SQL语句且带入数据库查询mysql查询语句在不知道任何条件时语句如下所示。SELECT 要查询的字段名 FROM 库名 .表名在知道一条已知条件时语句如下所示。SELECT 要查询的字段名 FROM 库名 .表名 WHERE 已知条件的字段名已知条件的值在知道两条已知条件时语句如下所示。SELECT 要查询的字段名 FROM 库名 .表名 WHERE 已知条件1的字段名已知条件1的值 AND 已知条件2的字段名已知条件2的值SQL注入解题技巧1.找注入点判断注入类型(单引号永远是第一步)一、快速判断是否存在注入点1. 单引号测试在参数后加 - 页面报错如 MySQL syntax error → 大概率存在注入- 无报错、正常显示 → 可能无注入或过滤严格2. 逻辑真假判断- 真 and 11- 假 and 12现象- 11 正常、12 无数据 → 存在数字型注入- 都正常 → 可能是字符型、或被过滤二、判断注入类型数字型 / 字符型1. 数字型注入- 原 URL ?id1- 测试 ?id1 and 11 正常- 测试 ?id1 and 12 无数据→ 数字型注入无需闭合引号2. 字符型注入- 原 URL ?id1- 测试 ?id1 and 11-- 正常- 测试 ?id1 and 12-- 无数据→ 字符型注入需要用 闭合再注释掉后面内容常见注释符- -- 后面必须有空格- #- -- URL 编码空格- /*xxx*/找到注入点?id1,测试输入?id11,返回界面任是?id1, 说明11是以字符11形式传入而非是以计算后?id2传入这是字符型注入2.猜字段数(order by )3.找显示位(union select 1,2,3~~)无回显用报错/盲注显错注入直接报 SQL 错误能看到字段、库名→ 用 union select 脱库最快盲注无回显、无报错- 布尔盲注页面只分“有/无数据”用 and length(database())5 猜长度- 时间盲注页面无任何变化MySQL and sleep(5)页面延迟 5 秒 → 时间盲注-堆叠注入可执行多条语句 ;show databases;多见于 PHPMySQL 宽松环境4.测试过滤(大小写双写编码注释挨个试)可用bp的爆破模块对url插入爆破点使用simple list加载函数字符数字等组成的payload字典根据响应快速进行测试过滤的检测5.脱库顺序数据库名→表名→字段名→数据盲注无回显、无报错- 布尔盲注页面只分“有/无数据”用 and length(database())5 猜长度判断带单引号显示报错无论是正确的输入还是错误的输入都只显示两种情况 使用布尔盲注判断列数判断数据库库名的长度用substr截取database()的值用bp的爆破模块把库名按照位置依次爆出来手动布尔盲注顺序1.爆数据库名长度2.根据库名长度爆库名3.爆数据表数量4.爆数据表名长度5.根据长度爆表名6.根据flag表爆数据列数量7.爆数据列名长度8.根据列名长度爆列名9.根据列名爆数据值报错注入利用函数updatexml()获取数据库库名接着用select语句继续获取数据库中的库名表名字段名limit n,m ,其中m是指记录开始的位置从0开始表示第一条记录;n是指取n条数据

更多文章