Предотвращение атак ColdFusion CSRF XSS - PullRequest
0 голосов
/ 03 февраля 2019

Я реализовал функции csrfGenerateToken и csrfVerifyToken, пытаясь предотвратить атаку CSRF.

Я настроил заголовок веб-страницы следующим образом:

set X-XSS-Protection "1; mode=block"
always set X-Frame-Options SAMEORIGIN
X-Content-Type-Options nosniff
Strict-Transport-Security "max-age=63072000" env=HTTPS

Я провел некоторое исследование и продолжаю в соответствии с рекомендациями Adobe, выполняя что-то вроде этого:

<cfset tokenVar = 't' & lCase( hash( createUUID() & randRange( 1000, 100000 ), 'MD5', 'UTF-8', 250 ) )>
<form action="updateprofile.cfm" method="post">
    <input type="hidden" name="f#hash( 'tokenVar', 'SHA-256', 'UTF-8')#" value="#tokenVar#">
    <input type="hidden" name="f#hash( 'formToken', 'SHA-256', 'UTF-8')#" value="#csrfGenerateToken( tokenVar, true )#">
    <input type="text" name="emailAddress" value="#EmailAddress#">
    <input type="text" name="phoneNumber" value="#PhoneNumber#">
    <input type="submit" name="btnSubmit" value="Change Profile Info">
</form>

Updateprofile.cfm будет иметь:

<cfparam name="FORM[ 'f' & hash( 'tokenVar', 'SHA-256', 'UTF-8')]" default="0">
<cfparam name="FORM[ 'f' & hash( 'formToken', 'SHA-256', 'UTF-8')]" default="0">
<cfif not csrfVerifyToken( FORM[ 'f' & hash( 'formToken', 'SHA-256', 'UTF-8')], FORM[ 'f' & hash( 'tokenVar', 'SHA-256', 'UTF-8')] )>
    <!--- CSRF attack. Clear cookies and kick user out --->
    <cfinclude template="clearcookies.cfm">
    <cflocation url="signin.htm" addToken = "no">
</cfif>

Это будет работать, если в одном и том же браузере вошли 2 учетных записи и одна попытается обновить другую.Однако, когда я просто сохранил копию получившегося html от одного из них и сохранил ее как csrf-attack.htm локально:

<html><body>
<script>history.pushState('', '', '/')</script>
<form action="http://www.exsample.com/updateprofile.cfm" method="post">
    <input type="hidden" name="f41BE6B4E09CBA69BDB76DBB69B493E8D49F5DD9ED230085913397B4C751D4E60" value="t93315a7c3ecb43d4d1b9422da97ffb09">
    <input type="hidden" name="f08DFC2607D4119D7B16B4C01DC5C00F54B044DC937257ABC411F9A7E55BB4191" value="A0EED67C55F5E17683E2E1B21FF3454FE690E0B1">
    <input type="text" name="emailAddress" value="test@test.com">
    <input type="text" name="phoneNumber" value="1-222-3333">
    <input type="submit" name="btnSubmit" value="Change Profile Info">
</form>
</body><html>

, я обработал исходную форму, чтобы обновить номер телефона до 1-333.-4444.Потом я снова вернулся в форму.В это время новый CSRFToken должен был быть создан, потому что ForceNew был установлен в true.

Затем я перехожу на сохраненную статическую HTML-страницу и просто изменяю значение адреса электронной почты на test2@test.com вместо test@test.com со старым токеном, затем нажимаю "«Изменить информацию профиля», я смог обновить ее на сайте !!

Я что-то не так делаю или это так работает?Кажется, что токен бесполезен, если я могу просто скопировать значения токена и манипулировать контентом, а затем опубликовать его.Как я могу смягчить проблему, как это на странице получения?

Заранее спасибо.

1 Ответ

0 голосов
/ 06 февраля 2019

Результат csrfVerifyToken будет по-прежнему проходить до тех пор, пока вы не сгенерируете другой токен CSRF с тем же ключом, после чего он будет признан недействительным.Поэтому, если вы делаете токены одноразового использования, вам нужно сделать недействительным старый токен, вызвав csrfGenerateToken с тем же tokenVar после того, как вы позвоните csrfVerifyToken

. Я написал запись в блоге с примером кода:проиллюстрируем это: https://www.petefreitag.com/item/856.cfm

...