File inc/token.inc.php changed (mode: 100644) (index 8283ef5..5e18f4a) |
... |
... |
function rg_token_get_master($db) |
101 |
101 |
function rg_token_valid($db, $rg, $tag, $double_allowed) |
function rg_token_valid($db, $rg, $tag, $double_allowed) |
102 |
102 |
{ |
{ |
103 |
103 |
rg_prof_start("token_valid"); |
rg_prof_start("token_valid"); |
104 |
|
rg_log_enter("token_valid: sid=" . $rg['sid'] . " token=" . $rg['token'] |
|
105 |
|
. " ua=" . $rg['ua'] . ' tag=' . $tag); |
|
|
104 |
|
rg_log_enter('token_valid: sid=' . $rg['sid'] . ' token=' . $rg['token'] |
|
105 |
|
. ' tag=' . $tag); |
106 |
106 |
|
|
107 |
107 |
$ret = FALSE; |
$ret = FALSE; |
108 |
108 |
while (1) { |
while (1) { |
|
... |
... |
function rg_token_valid($db, $rg, $tag, $double_allowed) |
114 |
114 |
} |
} |
115 |
115 |
$rg['token'] = substr($rg['token'], 0, 32); |
$rg['token'] = substr($rg['token'], 0, 32); |
116 |
116 |
|
|
117 |
|
// We have to check first because of ua |
|
118 |
117 |
$key = rg_token_get_master($db); |
$key = rg_token_get_master($db); |
119 |
118 |
if ($key === FALSE) |
if ($key === FALSE) |
120 |
119 |
break; |
break; |
|
... |
... |
function rg_token_valid($db, $rg, $tag, $double_allowed) |
122 |
121 |
$rand = substr($rg['token'], 0, 16); |
$rand = substr($rg['token'], 0, 16); |
123 |
122 |
$sign = substr($rg['token'], 16, 16); |
$sign = substr($rg['token'], 16, 16); |
124 |
123 |
|
|
125 |
|
$data = $rand . $rg['sid'] . $rg['ua'] . $tag; |
|
|
124 |
|
$data = $rand . $rg['sid'] . $tag; |
126 |
125 |
$hash = hash_hmac('sha512', $data, $key); |
$hash = hash_hmac('sha512', $data, $key); |
127 |
126 |
if ($hash === FALSE) { |
if ($hash === FALSE) { |
128 |
127 |
rg_token_set_error("cannot compute hmac"); |
rg_token_set_error("cannot compute hmac"); |
|
... |
... |
function rg_token_valid($db, $rg, $tag, $double_allowed) |
213 |
212 |
*/ |
*/ |
214 |
213 |
function rg_token_get($db, $rg, $tag) |
function rg_token_get($db, $rg, $tag) |
215 |
214 |
{ |
{ |
216 |
|
rg_log_enter('token_get: sid=' . $rg['sid'] . ' tag=' . $tag |
|
217 |
|
. ' ua=' . $rg['ua']); |
|
|
215 |
|
rg_log_enter('token_get: sid=' . $rg['sid'] . ' tag=' . $tag); |
218 |
216 |
|
|
219 |
217 |
$ret = FALSE; |
$ret = FALSE; |
220 |
218 |
while (1) { |
while (1) { |
|
... |
... |
function rg_token_get($db, $rg, $tag) |
234 |
232 |
|
|
235 |
233 |
// Add a random string to protect against BREACH attack |
// Add a random string to protect against BREACH attack |
236 |
234 |
$rand = rg_id(16); |
$rand = rg_id(16); |
237 |
|
$data = $rand . $rg['sid'] . $rg['ua'] . $tag; |
|
|
235 |
|
$data = $rand . $rg['sid'] . $tag; |
238 |
236 |
$sign = hash_hmac('sha512', $data, $sign_key); |
$sign = hash_hmac('sha512', $data, $sign_key); |
239 |
237 |
if ($sign === FALSE) { |
if ($sign === FALSE) { |
240 |
238 |
rg_token_set_error("cannot compute hmac"); |
rg_token_set_error("cannot compute hmac"); |
File tests/http_csrf.php changed (mode: 100644) (index ea73956..4c5f046) |
... |
... |
if ($r === FALSE) { |
30 |
30 |
exit(1); |
exit(1); |
31 |
31 |
} |
} |
32 |
32 |
|
|
33 |
|
rg_log_enter("Loading suggestion form (ua test)"); |
|
34 |
|
test_set_ua("user-agent-1"); |
|
35 |
|
test_set_referer($test_url); |
|
36 |
|
$data = array(); |
|
37 |
|
$headers = array("Cookie: sid=" . $good_sid); |
|
38 |
|
$r = do_req($test_url . "/op/suggestion?t=load_suggestion_form_ua", $data, $headers); |
|
39 |
|
if (!stristr($r['body'], "action=\"/op/suggestion\"")) { |
|
40 |
|
rg_log("Cannot load form! See above."); |
|
41 |
|
exit(1); |
|
42 |
|
} |
|
43 |
|
$good_token = $r['tokens']['suggestion']; |
|
44 |
|
rg_log_exit(); |
|
45 |
|
|
|
46 |
|
rg_log_enter("Try posting with different user-agent: should not work"); |
|
47 |
|
test_set_ua("user-agent-2"); |
|
48 |
|
$data = array( |
|
49 |
|
"doit" => 1, |
|
50 |
|
"token" => $good_token, |
|
51 |
|
"suggestion" => "bla bla bla<xss>" |
|
52 |
|
); |
|
53 |
|
$headers = array("Cookie: sid=" . $good_sid); |
|
54 |
|
$r = do_req($test_url . "/op/suggestion?t=post_suggestion_form_diff_ua", $data, $headers); |
|
55 |
|
if (!stristr($r['body'], "invalid token")) { |
|
56 |
|
rg_log("Seems I could add a suggestion bypassing CSRF" |
|
57 |
|
. " protection based on user-agent! See above."); |
|
58 |
|
exit(1); |
|
59 |
|
} |
|
60 |
|
rg_log_exit(); |
|
61 |
|
|
|
62 |
|
|
|
63 |
33 |
rg_log_enter("Loading suggestion form (referer test)"); |
rg_log_enter("Loading suggestion form (referer test)"); |
64 |
34 |
test_set_ua("user-agent-1"); |
test_set_ua("user-agent-1"); |
65 |
35 |
test_set_referer($test_url); |
test_set_referer($test_url); |