僞造的POST請求可以由不受信任的網站通過創建表單並將其張貼到目標網站來構建。然而,這個帖子的原始內容將被瀏覽器編碼爲格式:CSRF - 僞造的POST可以包含任意數據嗎?
param1=value1¶m2=value2
是否有可能爲不可信網站構建包含任意原始內容僞造出帖子 - 如串化JSON?
{param1: value1, param2: value2}
換句話說:網站可以使瀏覽器POST 任意內容,第三方域?
僞造的POST請求可以由不受信任的網站通過創建表單並將其張貼到目標網站來構建。然而,這個帖子的原始內容將被瀏覽器編碼爲格式:CSRF - 僞造的POST可以包含任意數據嗎?
param1=value1¶m2=value2
是否有可能爲不可信網站構建包含任意原始內容僞造出帖子 - 如串化JSON?
{param1: value1, param2: value2}
換句話說:網站可以使瀏覽器POST 任意內容,第三方域?
HTML表單的POST正文始終爲application/x-www-form-urlencoded,multipart/form-data或text/plain,因爲它們反映了enctype
attribute的有效值。尤其是text/plain
one can be used to form valid JSON data。所以在這裏可以使用基於表單的CSRF,但是它需要服務器接受它爲text/plain
。
此外,基於XHR的CSRF可以用作XMLHttpRequest API allows so send arbitrary POST data。唯一剩下的障礙是同源策略:只有當兩者具有相同的起源或您的服務器支持Cross-Origin Request Sharing並且允許資源共享時,可以僞造這種有效的POST請求。
是的,一個POST請求只不過是一個發送給Web服務器的特定格式的文本。您可以使用IE或Chrome開發人員工具查看每個請求的外觀。
所以是的,你可以創建一個僞造的POST請求並且改變你想要的任何東西,但是如果請求格式不正確,大多數Web服務器都會拒絕它。
對不起 - 我特別提到不可信的網站創造這些職位,而不是客戶。我已經更新了這個問題。 –
在純粹的HTML表單的情況下,是它總是會根據spec編碼。但是有諸如MIME multipart的other encoding schemes。還有Javascript和XMLHttpRequest的問題。僅在一種情況下特別提及編碼。這強烈暗示在其他情況下沒有應用編碼。
網站的客戶端代碼將難以僞造這樣的請求,但服務器端代碼可以很容易地做到這一點。
由於您的網站無法分辨請求是來自瀏覽器還是服務器,其行爲與瀏覽器類似,因此瀏覽器的限制無法保護。
只有當請求中還包含用戶的身份時,CSRF纔有效 - 所以我不擔心非瀏覽器客戶端僞造請求。 –
「困難」你的意思是不可能的?這真的是一個問題:是否可能? –
@JS_Riddler:程序可以在任何方面充當瀏覽器,因此用戶身份不是保護。有人甚至可以使用任何開源瀏覽器項目並重寫它以執行任何操作,因此即使任何當前瀏覽器無法發送任意內容的帖子,也可以這樣做。 – Guffa
您可以通過常規表單發佈創建有效的JSON。這只是創造性地命名錶單參數的問題。特別是,參數名稱可以包含引號。
http://blog.opensecurityresearch.com/2012/02/json-csrf-with-parameter-padding.html
@JS_Riddler [服務器有一個處理模型](http://www.w3.org/TR/cors/#resource-processing-model)。 – Gumbo
我認爲這個被接受的答案對於文本/純文本是平坦的。看到這個僞造XML的例子:http://pentestmonkey.net/blog/csrf-xml-post-request。同樣的技術可以用於像之類的東西。 – 2013-06-02 20:53:11
@BradenAnderson你說得對,相應地更新了我的答案。 – Gumbo