; B6 g! J5 F8 O7 x4 V5 t j" c2 n4 {
! Q& u/ ]- m8 l) |4 D3 x; s3 V
5 p' V4 ?: y h9 L0 ~本文中提供的例子均来自网络已公开测试的例子,仅供参考。
# i8 `1 I" ^% \' [& h3 ?- {
/ I: \ a4 }$ i5 Y( e& h/ \5 Y本期带来绕过验证漏洞。为了保障业务系统的安全,几乎每个系统都会存在各种各样的验证功能。常见的几种验证功能就包括账号密码验证、验证码验证、JavaScript数据验证及服务端数据验证等等,但程序员在涉及验证方法时可能存在缺陷导致被绕过,于是斗哥总结了以下几种绕过验证的姿势和大家一起讨论讨论~
) T$ r" u: V) Y
4 ^4 H& g1 g! K6 T- p 4 h* z9 p6 U4 S. ]9 l/ k; h/ w
! p& x* N$ o, X+ f5 \& r5 | + {6 L, f O* U! D# }6 s
8 D) U7 w9 U5 x3 C
* R g! j2 O$ L( o2 B& Q S / U! B/ M& O( p$ ~6 B2 q# S9 c$ I
% z# ]1 W$ A% h- ?客户端校验绕过
; R% Y( p* j9 `& N# g( Z/ `, |
0 d" x2 T7 I2 X" W4 c+ V) K! S客户端校验是常见的一种校验方式,也就是在客户端校验用户的输入,将校验结果作为参数发送至服务端,或利用前端语言限制用户的非法输入和操作。面对此类的校验方法可以通过修改前端语言或者在传输中对参数进行篡改来绕过验证。
2 Z+ A6 {6 M% N7 I" S1 S
, G1 D" X- R# y3 O
举个栗子:
1 W. U+ U! V+ e% N- b
3 V2 p* R/ G& [8 U4 Da). 某系统需要购买才能观看视频,不同的课程以ID划分。
4 M- h2 Y* O% l: B. a
( P& _" c! H" z/ y/ g; P* y5 S
' ?4 s/ k* f% F# @) O. U- d
. a0 [7 Q, P1 L1 b; w
3 ]# s% ~" A9 D) o% V ]3 W G
% ~4 n7 l+ t* [. y) W
0 u, Z9 M- C0 E) i . x! e2 a9 H) U3 v- t3 ]
) m: O; Q j1 `/ j4 u4 |, eb). 发现是否付费只靠前端js控制,更改courseID就可以看到不同的课程,recordURL就是视频播放的链接,无需登录即可播放。
: O* b8 X$ ?+ A; s2 o) v; \) [
; X) u' W' y a0 p1 }6 i 2 W1 T7 k# O/ L$ f) R
7 x' A# u* N, A* x
7 H F5 Z" N) c( B$ q
- A- X/ D6 g0 E( e
0 m2 @( c! ^3 R$ t5 f$ U
$ @( w6 X7 v ~6 S! k; A
6 F; A M3 B$ @: ]& k: O: Sc). 根据播放地址中的videoCode,可获取视频下载地址:
, X: A- o: i+ }: |
9 L4 \) m8 _) X6 X
http://*.*.*.*/v3/resource/video/queryurl?jsoncallback=cb&quality=3&audioIndex=0&types=1&videoCode={videoCode}
2 l3 z, w5 p1 z$ E
. F u5 w4 s8 x5 M: @6 ]所得urls为视频下载地址。
* e7 o: ^5 m0 ]+ ~4 |
$ A1 o7 W2 [1 L$ b
4 Z% d$ o$ m, g/ P' R) j
0 M L1 Z/ O" w
- O- X+ l5 m* R& e, C' a- N2 X" f. r
. C/ @7 S. i. B% D
8 {* r+ F4 S" q8 i* T: p! s ' c7 e4 ^" I% F9 G7 G% n' Z& p. e# V% F
, R: w4 J4 Q1 W2 J' o1 H3 o# g
d). 通过脚本,可将全站视频下载下来。
5 _+ {: c7 f1 w" I& H) a+ h4 P3 M
* ?7 D: I+ ?* R0 A& R& B
1 Y% g6 u/ d k2 a+ f, E* F. h
: P* i/ y! R5 W# f. f ; U7 j! U- @/ b5 n( l
$ D+ p3 T3 w4 s
2 N/ y, q, D2 ]7 Y2 J
/ u& J1 I- e, h7 D; k& ~ l9 D. s& G4 A
, l! |; u/ m4 P4 V
客户端验证信息泄露
9 X8 \. K3 P" U1 y3 M6 a U7 n
1 [$ Y# a( M; Y8 N, Q程序员在编写验证程序时有可能会将验证信息直接泄露到客户端,攻击者就可以通过分析服务端的返回数据直接获得关键的验证信息从而完成验证。
% z. v# V$ Z9 M$ C: Y, x" X- \" x
$ F+ {, Z* I" M5 m
举个栗子:
- o; m9 C1 y# V3 L2 M
H/ P+ H% |# Q! R) A/ M某免费wifi连接时需要使用发送到手机的密码进行验证,抓取发送密码的数据包时,发现密码返回客户端,导致任意全网账号可以登录联网。
) z! ]1 `4 O7 C4 s; _/ I6 B
3 R7 L+ P$ ]- ]8 L# I
8 r; X) l3 Z* Z w, C% y- [
7 v# Y: j2 \2 N7 _
4 [* @6 H( h7 P1 X* x0 O
" x* \/ Z9 C2 V5 N6 n7 k, ^1 \
8 t! w3 N: n4 L; D9 O. p, X . U9 M9 ]$ @2 _
" E2 \& _! V/ V5 |5 @) F1 U: n$ A
客户端流程控制绕过
( Q/ R0 x! P; v' d2 z
+ t3 q7 B2 w! b程序员在编写验证程序时有可能会验证结果返回到客户端,由客户端根据服务端提供的验证结果进行下一步操作,攻击者可以通过篡改验证结果或直接执行下一步操作实现绕过。
& L6 ^ P! r9 Q% e
8 G! }! `3 v9 o" Q* j& [举个栗子:
, m/ R0 G% V( v# Z( X, U
* T; E$ O# @, [, ?9 F" G3 va). 某系统重置密码需要三个步骤,首先要输入图片验证码。
0 \2 Z J0 @6 G
4 f2 B n- h8 V7 E; W
6 D" Z4 u- \ d$ _2 p
/ J" Y( s0 L( C9 e! O
3 i D' g4 z) ^" u1 q2 k
6 n: D: ~9 ]! [' v
. v* K) t7 c! |& Q2 [+ y, T
$ X! |) @* G3 X8 ?: o5 u
- S. \( X% T' [8 j k
b). 然后需要通过短信验证码验证身份。
9 T! B! Y# f) b8 {$ s
% Y4 {* [9 b3 D1 s( k$ b" Y% b
- E, q" e1 Z; a m+ ~" b( }: ~: U
6 `+ m) g& Y9 b0 b; V
9 Q7 n6 l, |, `
! D! m2 |4 a* \
% Z+ `4 h1 F5 m6 H4 O0 W7 _( w 4 A6 |- Y) T# ^
3 h3 i1 _( y4 }% X, Kc).访问http://*.*.*.*/a/user/findPasswordSetp 直接跳到重置密码的页面。
/ [7 }$ u4 ]1 _
# v3 h: }4 W( J& a; N2 }7 v- x
8 o h; X T; z$ Y0 e, T) j. ^" F
# R/ W2 D0 F; S9 w( d% E & U7 J3 G# m* b
, B+ ?9 l( E. y- Z7 W# p
8 A: r$ g7 Y+ Q! S9 p3 m
+ r1 D; Z& l" F0 k, e/ x$ J, m p
& {6 ]- w7 m7 z0 Nd). 可成功修改密码密码。
p- ^( e; n1 A5 e8 W2 z
9 t6 U( R9 ] f H) n4 M* o
- w! a f0 _: I7 q4 l3 y
& N8 e3 @& z) T. g: \ 3 y) p+ N4 ^0 s, f* ] E* |+ Q, R7 ^ S
: a& [" \. F6 [) Y* j
. v/ |2 g0 P( L# k7 R$ S! ]" D 0 ^) A* y, R1 T) a* v
# E! m4 q; g% E8 N7 K操作目标篡改绕过
9 f8 a# n% T, O2 P7 X7 n
2 I8 C9 C, P7 a3 ]8 D/ t# }
如果某操作采用了连续身份校验机制或身份校验过程与操作过程分离,可以尝试在身份验证过程中替换身份校验对象或操作对象实现绕过验证。
% i. u2 \1 L# T k5 p
5 k/ _2 w9 @' e' Z6 Y: i
举个栗子:
( U+ w0 w9 u9 A5 @$ _- r! r
& [) ?: c* g3 Z" {
a). 修改某系统的绑定手机。
6 J; A& }" g, u0 r% {& c' U7 z% ?1 c
& ^4 X( I2 P( f x5 }+ e 6 D- ?; `* d7 F' b. C
$ i6 a9 ^, M4 u6 P0 `" T3 d+ o " k$ i8 j3 P9 u
' \2 v9 K8 M% [7 K( l
/ s( m5 _1 z! U* R( y 6 L/ K. B9 G) c; V' q5 n
7 M4 x& L& S& u0 ~
b). 选择免费接收短信校验码修改。
5 e) g8 k) h9 I6 g! Q; ^; i
% n( I, A5 E$ N; [+ r; S( h( r5 q
1 ?7 C2 B0 @% {- @
* x. \1 o( G( C B3 L; e1 z
# C1 k8 o' h4 X, ]% w8 Z+ l
- F# G/ ?( e4 [: {$ D2 J
8 {2 Q# P, I' N# S, y* U
4 [: V! E' y L% S* K' a
( S" h, b, Q/ E4 k# ?; Sc). 将修改的手机号改为自己的手机号码。
2 o; e# k7 T D0 {8 q# ?4 C1 }1 N
) Z7 |1 r1 E+ z( b O
+ f0 h# z) g: K" \% _
! y3 ~6 w N. b3 x* Z
( J0 T) `4 `5 n5 p; ^
# \1 @$ c5 C8 Y8 D3 q1 M0 W5 Z& o
& Q2 F" k/ n1 e! v # @* f# s* o( q1 o' j
& Y* P" ~, N) E, `$ Td). 通过修改的手机号码收到的校验码修改手机号。
. `- b4 R2 [! m' Y$ r
' U* \; J3 {9 \5 K 5 J1 U* ^6 J6 t1 X, L: F# H
; x! B. S% z, Q+ Q * T- ]6 K& G' l0 l
D' O' G& ~8 G8 a$ ?5 Y$ g# @3 R
# J" q+ ^( `; x0 N/ o/ D' L/ E
) Z# T. ]# F% R W2 r+ A. _. ^
$ X4 N' y0 W$ q
6 b& k" M% l6 s' o2 b% L
e). 发现可以成功修改成新的手机号。
7 y* ?+ j) i5 m# J
$ [/ H$ M' c( V- K7 l+ a8 B
: _% k' l# m* l( N- e
5 `/ c( H+ W! o( U5 k
4 D5 x( l4 F' C7 D! r* c- p; D
7 y3 N; ]5 e5 Y* Z0 w- a
7 @! n' C5 O. f3 {/ f . R6 A$ D! {9 G& c
5 u, g! h# w4 R
参数篡改
]& t+ c4 r; ?" I. @- y
; U+ ~! z- \3 O% C( l, H
程序猿小哥哥在编写验证程序时有可能会对验证码字段进行正确性校验,但当验证码字段不存在或为空时就直接通过校验。
& ~/ `, P! i, v0 r$ y1 w
% E8 k7 X# r$ u2 e/ Z举个栗子:
( t1 ?9 I' v8 v# Z* h+ i* k
4 W8 J! D0 O7 B( i8 @a).某系统存在绕过验证漏洞,抓取登录的数据包。
% O5 X0 H: G! S' f
$ ?: W C' H9 q , ~, J3 z! U, {
' K& { e( F& W3 y
. p; y, O2 B7 a# T. Q! j `' A
. k6 Q( y Q; P4 P: x) [
) [# c% ~, n3 v4 m- s) C
: j& n" u& q5 [ @% [3 ]6 y
$ T! \# c+ |0 t, h2 r" }& |+ eb).删除验证码字段(securityCode)进行爆破。
5 s$ A1 ]. M% K& z; [9 D
1 n, m) ~ @% a9 J
! o9 D2 p* E3 [9 M
5 C: O& r% _3 R' y 5 S, l0 |1 K5 w% l4 k2 M, |% ]
$ m$ Y Q& i" }% `7 Z8 m6 ]$ s
# K3 R* G8 C* q( C3 c: K1 E& J6 y
8 `! m9 y9 A* `) s1 A
9 r7 \! y* G) u9 l/ P
c). 爆破成功,并可以使用爆破出来的账号密码进行登录。
/ V7 l% x6 X- f( o: s
( l9 o! S) Y) Q8 C. y
% E% ^/ f, Z0 X' A9 m! e8 g6 P
" Z I- x& B3 c) V$ f
) J n2 M5 y/ c; N4 Q7 `
8 ]" C& O0 ~$ P
' r& b, s& Z" T' v4 ]# X9 e- P0 d, N
2 x2 o/ g E8 B% H+ o
+ p6 d0 B3 g# Q) R3 b: h
4 v1 [4 }0 C) e; | 4 x& y/ F9 h. R2 W% z! e
/ t o; e7 s5 k/ Y( A
- P% v1 P4 a; D' _: T ]
7 ^/ p" [0 t8 l- d& b7 ~
& C) E) A2 n4 m辅助验证功能绕过
3 x+ V4 x! q( k" R% ?8 E5 \) Z/ I, b% v. ]
7 c- d- e; u7 e5 v4 K5 ]. ~9 S
为了验证用户身份或者避免攻击者使用自动化工具进行批量操作,应用程序可能会采用辅助验证功能,常见的辅助验证功能包括图片验证码、短信验证码、邮箱验证,这些功能在设计时如果存在缺陷则可以被绕过,导致辅助验证功能失效。
# }7 h3 p$ T/ C5 m5 H' c$ g
( u& x! R2 N* N. b) U
举个栗子:
) Z) W" q% Q6 Y& y& B: z
1 [0 S% q& }$ e' U; d/ Z, @4 W
a). 访问某系统,一开始页面无验证码。
& @( ]! t# |2 y$ A4 t
$ H' q, I5 h' D/ Z0 x' \* P Q3 J \- V3 H: r* c& R+ f+ y
0 |3 o' w+ c( b% |1 R" C9 A
& D+ [4 ~5 h: s# \# E
. r! Y+ }( c- o
- i; x- }% y' L, z
1 ^' [, C' W# g; I
+ c( D* P0 Q; }/ {. h; ]! }: ^" E9 db). 输错一次之后,出现验证码。
1 E) J7 _. f" ]1 Y6 R" o3 L
2 V3 u% U+ y3 Z6 k2 c6 p
1 b% h5 J1 T. M! o+ d
3 L/ `9 U5 F$ D2 E6 t, s+ R . G( Q6 \$ b1 f& M. S
& X. L) B, d/ T ?$ [& z; B
* P/ G9 O2 N. n7 g1 o 7 }! u( h$ I: t( W8 y$ @) @% @) n
( Z$ x8 L. j* Z! ~8 b0 ~! U! T" x* a ^
c). 尝试进行爆破,抓取第一次无验证码的数据包,发现会提示需要验证码。
6 ^2 B7 v5 v/ T
1 n' M. P7 p) w3 k; J$ p
+ _1 c2 _, S7 R1 i* f1 G4 y
, k: ?! J& @6 g+ P
4 Y: U' n% ?; U: Z
1 b# L `+ O/ G7 Z
' ^2 N5 f( h, d4 J
. H6 P3 t. i" q/ R7 X% }
. Z: j# n* U0 F+ |
d). 多次尝试之后发现,验证码是通过cookie中的PHPSESSID来判断的。
# P+ A# ]( y/ T; b& a6 h
8 W4 G; q& m2 F, q7 u2 A/ C9 M
$ E! g* r7 y% o' v
3 U5 G3 C- U' \0 r- Q( w; s ; F& k$ p. n b9 p r9 F8 y4 [5 `
* u6 C5 }# Z% N% m7 t
& G- k2 e3 s; M3 h5 d ( o+ Y8 x3 }2 h1 g9 Y+ m. `: {
- b( M- X$ Z: D0 E: c% E
e). 修改PHPSESSID后成功绕过验证码限制。
/ V9 D9 x+ U9 I4 {3 r
; v4 M1 P1 ]) |, a$ u
4 c2 `* M/ Q0 x6 @: |/ i
6 Q9 P0 y& _: d : Q, l0 h3 Q1 H" J/ k
& l5 Y: Y" o+ x$ A( r9 C
% l a3 X w- D5 z, j+ a, t. t! U, Q) U
# V) v) a; d! U- X
. ~" y8 A/ T$ q( k" k, ?
" n" ?& @9 o- t5 t, `# n j6 ~
f). 成功爆出账号。
4 ^3 a# u) ^ B
$ o2 ]5 g' s" |: R7 c" z3 S & J/ G$ o' n9 r$ m' f% x
* e) ?; M; B5 t8 I4 q' S5 j# a : Z8 P5 @/ j% \& m6 R4 ~
1 X& s' F2 [9 N# [
0 B& q7 j9 k0 ?6 Y# @
& E6 l" w" s! q; a L3 _: {* W
9 o0 A5 ^: B# H+ f% h x
- @ W0 a$ t2 R" l, S
好啦,斗哥对于绕过验证的总结就到这里啦,对于绕过验证的修复斗哥有一点点建议:
0 B- e- i3 D2 j9 a
- D6 v: L: {4 j1 O1.所有验证在服务端进行,验证问题的答案不能以任何形式返回客户端中(如图片验证码答案、短信验证码、验证问题答案等)。
% D% a u5 p$ R3 V4 d8 _
^* P p: J& ]0 k) I
2.验证结果及下一步跳转操作由服务端直接进行。
# B6 R8 _" j9 n( G0 s
9 r% ? C0 A- J: I
3.应尽可能避免采用连续身份验证机制,无论采用何种验证机制,只有当所有的数据输入以后,才进行身份验证数据的验证。
% n) s( `, g0 X/ P# q& w6 d1 N3 L
2 Q' {6 c( Q2 G7 p' n$ [$ I# W