CSRFæ¼æ´
CSRF (Cross-site request forgeryï¼è·¨ç«è¯·æ±ä¼ªé )ä¹è¢«ç§°ä¸ºOne Click Attackæè
Session Ridingï¼é常缩å为CSRFæè
XSRFï¼æ¯ä¸ç§å¯¹ç½ç«çæ¶æå©ç¨ã
尽管å¬èµ·æ¥åè·¨ç«èæ¬(XSS)ï¼ä½å®ä¸XSSé常ä¸åï¼XSSå©ç¨ç«ç¹å
çä¿¡ä»»ç¨æ·ï¼èCSRFåéè¿ä¼ªè£
æåä¿¡ä»»ç¨æ·è¯·æ±åä¿¡ä»»çç½ç«ã
CSRFæ»å»åçåè¿ç¨
CSRF为ä»ä¹è½å¤æ»å»æå? å
¶æ¬è´¨åå æ¯éè¦æä½çææåæ°é½æ¯å¯ä»¥è¢«æ»å»è
çæµå°çã
æ»å»è
åªæé¢æµåºURLçææåæ°ä¸åæ°å¼ï¼æè½æåå°æé ä¸ä¸ªä¼ªé ç请æ±;åä¹ï¼æ»å»è
å°æ æ³æ»å»æåã
åå¨CSRFæ»å»çå¯è½æ§å¿ é¡»åæ¶æ»¡è¶³ä¸¤ä¸ªæ¡ä»¶ï¼
- ç»å½åä¿¡ä»»ç½ç«ï¼å¹¶å¨æ¬å°çæCookieã
- å¨ä¸ç»åºåä¿¡ä»»ç½ç«çæ åµä¸ï¼è®¿é®å±é©ç½ç«ï¼å¹¶æ¨¡æåæ°è¿è¡è¯·æ±æ»å»ã
CSRF(Cross-Site Request Forgery)ï¼è·XSSæ¼æ´æ»å»ä¸æ ·ï¼åå¨å·¨å¤§çå±å®³æ§ã
å 为æ»å»è
çç¨äºä¿¡ä»»ç½ç«ç身份ï¼ä»¥ä¿¡ä»»ç½ç«çåä¹åéæ¶æè¯·æ±ï¼å¯¹æå¡å¨æ¥è¯´è¿ä¸ªè¯·æ±æ¯å®å
¨åæ³çï¼ä½æ¯å´å®æäºæ»å»è
æææçä¸ä¸ªæä½ï¼æ¯å¦ä»¥ä¿¡ä»»ç½ç«çåä¹åéé®ä»¶ãåæ¶æ¯ï¼çåè´¦å·ï¼æ·»å ç³»ç»ç®¡çåï¼çè³äºè´ä¹°ååãèæè´§å¸è½¬è´¦çã
CSRFåç±»
GETç±»åçCSRF
ä» ä» é¡»è¦ä¸ä¸ªHTTP请æ±ãå°±è½å¤æé 䏿¬¡ç®åçCSRFã
::: tip åºæ¯ä¸¾ä¾
è´ç©ç½ç«ï¼è¯¥ç½ç«çAPI设计ä¸ï¼æä¸ä¸ªæ¥å£ä»¥GETè¯·æ±æ¥å®æç¨æ·é¶è¡å¡å·çæ´æ°ï¼æ å
¶ä»æ ¡éªãå¦ï¼http://www.shop.com/updatecard?cardno=xxxxxx&userId=xxã
å¨å卿¼æ´çå±é©ç«ç¹ï¼æä¸æ®µHTMLç代ç ï¼ ä¾å¦ï¼<img src=http://www.shop.com/updatecard?cardno=xxxxxx&userId=xx>ã
é¦å
ãä½ ç»å½äºè´ç©ç½ç«ï¼ç¶å访é®å±é©ç«ç¹ï¼è¿æ¶ä½ ä¼åç°ä½ çé¶è¡å¡è´¦å·åäºã
å ä¸ºä½ çæµè§å¨ä¼å¸¦ä¸ä½ çè´ç©ç½ç«çCookieååºGet请æ±ï¼å»è·åèµæºä»¥GETçæ¹å¼è¯·æ±ç¬¬ä¸æ¹èµæºï¼è¿éçç¬¬ä¸æ¹å°±æ¯æè´ç©ç½ç«äºï¼ã
è¿å°±æ¯ä¸ä¸ªæç®åãæç´ç½ãå½ç¶ä¹æä¸å¯è½åºç°çCSRFæ»å»ãä½ç¨äºç»å¤§å®¶è®²æ¸
æ¥å®çåçï¼æ¯æéåçã
:::
大夿°CSRFæ»å»åèµ·æ¶ï¼ä½¿ç¨çHTML <image>ã<iframe>ã<script> ç带 src 屿§çæ ç¾ï¼è¿ç±»æ ç¾åªè½å¤åèµ·ä¸æ¬¡GET请æ±ï¼èä¸è½åèµ·POST请æ±ã
POSTç±»åçCSRF
ç¶èï¼å¦ææå¡ç«¯åºç¨çAPIæ¥å£è®¾è®¡å¹¶æªä¸¥æ ¼å°åºåGETä¸POSTï¼æ»å»è å¯ä»¥ä½¿ç¨GETæ¥è¯·æ±APIæ¥å£/表åçæäº¤å°åã
æ¯å¦:
- å¨PHPä¸ï¼å¦æä½¿ç¨çæ¯
$_REQUESTï¼èé$_POSTè·ååéï¼åä¼åå¨è¿ä¸ªé®é¢ã - å¨HTMLç表åä¸å¦æåå¨å¦ä¸ä»£ç ï¼
<form action="/register" id="register" method="post" >
<input type=text name="username" value="" />
<input type=password name="password" value="" />
<input type=submit name="submit" value="submit" />
</form>
ç¨æ·å¯å°è¯æé ä¸ä¸ªGETè¯·æ± http: //host/register?username=test&password=passwd æ¥æäº¤ï¼è¥æå¡å¨ç«¯æªå¯¹è¯·æ±æ¹æ³è¿è¡éå¶ï¼åè¿ä¸ªè¯·æ±ä¼éè¿ã
- 妿æå¡å¨ç«¯å·²ç»åºåäºGETä¸POST, å¯¹äºæ»å»è
æ¥è¯´ï¼ä»ç¶æè¥å¹²ç§æ¹æ³å¯ä»¥æé åºä¸ä¸ªçèµ·æ¥åççPOST请æ±ã
æ¯å¦å¨ä¸ä¸ªé¡µé¢ä¸æé 好ä¸ä¸ªè¡¨å表åï¼ç¶å使ç¨JavaScriptèªå¨æäº¤è¿ä¸ªè¡¨åãæ¯å¦ï¼æ»å»è å¨www.b.com/test.htmlä¸ç¼åå¦ä¸ä»£ç
<form action="http://www.a.com/register" id="register" method="post" >
<input type=text name="username" value=""/>
<input type=password name="password" value=""/>
<input type=submit name="submit" value="submit"/>
</form>
<script>
var f = document.getElementById ( "register");
f.inputs [0].value = "test";
f.inputs [1].value = "passwd" ;
f.submit ();
</script>
æ»å»è çè³å¯ä»¥å°è¿ä¸ªé¡µé¢éèå¨ä¸ä¸ªä¸å¯è§çiframeçªå£ä¸ï¼é£ä¹æ´ä¸ªèªå¨æäº¤è¡¨åçè¿ç¨ï¼å¯¹äºç¨æ·æ¥è¯´ä¹æ¯ä¸å¯è§çã
CSRFæ¼æ´çåç°ä¸ææ
- æåä¸ä¸ªæ£å¸¸è¯·æ±çæ°æ®å ï¼å¦ææ²¡æRefereråæ®µåtokenï¼é£ä¹ææå¯è½åå¨CSRFæ¼æ´ã
- 妿æRefereråæ®µï¼ä½æ¯å»æRefereråæ®µååéæ°æäº¤ï¼å¦æè¯¥æäº¤è¿ææï¼é£ä¹åºæ¬ä¸å¯ä»¥ç¡®å®åå¨CSRFæ¼æ´ã
- éç对CSRFæ¼æ´ç ç©¶çä¸ææ·±å
¥ï¼ä¸ææ¶ç°åºä¸äºä¸é¨é对CSRFæ¼æ´è¿è¡æ£æµçå·¥å
·ï¼å¦CSRFTesterï¼CSRF Request Builderçã
- 以CSRFTesterå·¥å ·ä¸ºä¾ï¼CSRFæ¼æ´æ£æµå·¥å ·çæµè¯åçå¦ä¸:使ç¨CSRFTesterè¿è¡æµè¯æ¶ï¼é¦å éè¦æåæä»¬å¨æµè§å¨ä¸è®¿é®è¿çææé¾æ¥ä»¥åææç表åçä¿¡æ¯ï¼ç¶åéè¿å¨CSRFTesterä¸ä¿®æ¹ç¸åºç表åçä¿¡æ¯ï¼éæ°æäº¤ï¼è¿ç¸å½äºä¸æ¬¡ä¼ªé 客æ·ç«¯è¯·æ±ã
- å¦æä¿®æ¹åçæµè¯è¯·æ±æå被ç½ç«æå¡å¨æ¥åï¼å说æåå¨CSRFæ¼æ´ï¼å½ç¶æ¤æ¬¾å·¥å ·ä¹å¯ä»¥è¢«ç¨æ¥è¿è¡CSRFæ»å»ã
CSRFæ¼æ´çé²å¾¡
- éªè¯ç
éªè¯ç 被认为æ¯å¯¹æCSRFæ»å»æç®æ´èææçé²å¾¡æ¹æ³ã
CSRFæ»å»çè¿ç¨ï¼å¾å¾æ¯å¨ç¨æ·ä¸ç¥æ
çæ
åµä¸æé äºç½ç»è¯·æ±ãèéªè¯ç ï¼å强å¶ç¨æ·å¿
é¡»ä¸åºç¨è¿è¡äº¤äºï¼æè½å®ææç»è¯·æ±ãå æ¤å¨é常æ
åµä¸ï¼éªè¯ç è½å¤å¾å¥½å°éå¶CSRFæ»å»ã
使¯éªè¯ç å¹¶éä¸è½ãå¾å¤æ¶åï¼åºäºç¨æ·ä½éªèèï¼ç½ç«ä¸è½ç»ææçæä½é½å ä¸éªè¯ç ãå æ¤ï¼éªè¯ç åªè½ä½ä¸ºé²å¾¡CSRFçä¸ç§è¾
å©ææ®µï¼èä¸è½ä½ä¸ºæä¸»è¦çè§£å³æ¹æ¡ã
- å¨è¯·æ±å°å䏿·»å token å¹¶éªè¯
CSRF æ»å»ä¹æä»¥è½å¤æåï¼æ¯å 为é»å®¢å¯ä»¥å®å ¨ä¼ªé ç¨æ·ç请æ±ï¼è¯¥è¯·æ±ä¸ææçç¨æ·éªè¯ä¿¡æ¯é½æ¯åå¨äº cookie ä¸ï¼å æ¤é»å®¢å¯ä»¥å¨ä¸ç¥éè¿äºéªè¯ä¿¡æ¯çæ åµä¸ç´æ¥å©ç¨ç¨æ·èªå·±ç cookie æ¥éè¿å®å ¨éªè¯ã
è¦æµå¾¡ CSRFå ³é®å¨äºå¨è¯·æ±ä¸æ¾å ¥é»å®¢æä¸è½ä¼ªé çä¿¡æ¯ï¼å¹¶ä¸è¯¥ä¿¡æ¯ä¸åå¨äº cookie ä¹ä¸ã
å¯ä»¥å¨ HTTP/HTTPS 请æ±ä¸ä»¥åæ°çå½¢å¼å å ¥ä¸ä¸ªéæºäº§çç tokenï¼å¹¶å¨æå¡å¨ç«¯å»ºç«ä¸ä¸ªæ¦æªå¨æ¥éªè¯è¿tokenï¼å¦æè¯·æ±ä¸æ²¡æ token æè token å 容䏿£ç¡®ï¼å认为å¯è½æ¯ CSRF æ»å»èæç»è¯¥è¯·æ±ã
è¿ç§æ¹æ³è¦æ¯æ£æ¥ Refererè¦å®å ¨ä¸äºï¼token å¯ä»¥å¨ç¨æ·ç»éå产çå¹¶æ¾äº session ä¹ä¸ï¼ç¶å卿¯æ¬¡è¯·æ±æ¶æ token ä» session 䏿¿åºï¼ä¸è¯·æ±ä¸ç token è¿è¡æ¯å¯¹ï¼ä½è¿ç§æ¹æ³çé¾ç¹å¨äºå¦ä½æ token 以忰çå½¢å¼å å ¥è¯·æ±ã
å¯¹äº GET 请æ±ï¼token å°éå¨è¯·æ±å°åä¹åï¼è¿æ · URL å°±åæ http://url?csrftoken=tokenvalueã èå¯¹äº POST è¯·æ±æ¥è¯´ï¼è¦å¨ form çæåå ä¸ ï¼è¿æ ·å°±æ token 以忰çå½¢å¼å å
¥è¯·æ±äºã
è¯¥æ¹æ³ç缺ç¹ï¼
é¾ä»¥ä¿è¯ token æ¬èº«çå®å
¨ãç¹å«æ¯å¨ä¸äºè®ºåä¹ç±»æ¯æç¨æ·èªå·±å表å
容çç½ç«ï¼é»å®¢å¯ä»¥å¨ä¸é¢åå¸èªå·±ä¸ªäººç½ç«çå°åãç±äºç³»ç»ä¹ä¼å¨è¿ä¸ªå°ååé¢å ä¸ tokenï¼é»å®¢å¯ä»¥å¨èªå·±çç½ç«ä¸å¾å°è¿ä¸ª tokenï¼å¹¶é©¬ä¸å°±å¯ä»¥åå¨ CSRF æ»å»ã
为äºé¿å è¿ä¸ç¹ï¼ç³»ç»å¯ä»¥å¨æ·»å token çæ¶åå¢å ä¸ä¸ªå¤æï¼å¦æè¿ä¸ªé¾æ¥æ¯é¾å°èªå·±æ¬ç«çï¼å°±å¨å颿·»å tokenï¼å¦ææ¯éåå¤ç½åä¸å ã
- å¨ HTTP 头ä¸èªå®ä¹å±æ§å¹¶éªè¯
è¿ç§æ¹æ³ä¹æ¯ä½¿ç¨ token å¹¶è¿è¡éªè¯ï¼åä¸ä¸ç§æ¹æ³ä¸åçæ¯ï¼è¿é并䏿¯æ token 以忰çå½¢å¼ç½®äº HTTP 请æ±ä¹ä¸ï¼èæ¯æå®æ¾å° HTTP 头ä¸èªå®ä¹ç屿§éã
éè¿ XMLHttpRequest è¿ä¸ªç±»ï¼å¯ä»¥ä¸æ¬¡æ§ç»ææè¯¥ç±»è¯·æ±å ä¸ csrftoken è¿ä¸ª HTTP 头屿§ï¼å¹¶æ token 弿¾å ¥å ¶ä¸ã
è¿æ ·è§£å³äºä¸ç§æ¹æ³å¨è¯·æ±ä¸å å ¥ token çä¸ä¾¿ï¼åæ¶ï¼éè¿XMLHttpRequest 请æ±çå°åä¸ä¼è¢«è®°å½å°æµè§å¨çå°åæ ï¼ä¹ä¸ç¨æ å¿ token ä¼éè¿ Referer æ³é²å°å ¶ä»ç½ç«ä¸å»ã
::: tip
ç¶èè¿ç§æ¹æ³çå±éæ§é常大ï¼XMLHttpRequest 请æ±é常ç¨äº Ajax æ¹æ³ä¸å¯¹äºé¡µé¢å±é¨ç弿¥å·æ°ï¼å¹¶éææç请æ±é½éåç¨è¿ä¸ªç±»æ¥åèµ·ï¼èä¸éè¿è¯¥ç±»è¯·æ±å¾å°ç页é¢ä¸è½è¢«æµè§å¨æè®°å½ä¸ï¼ä»èè¿è¡åè¿ï¼åéï¼å·æ°ï¼æ¶èçæä½ï¼ç»ç¨æ·å¸¦æ¥ä¸ä¾¿ã
:::
- éªè¯ HTTP Referer åæ®µ
æ ¹æ® HTTP åè®®ï¼å¨ HTTP 头䏿ä¸ä¸ªå段å«Refererï¼å®è®°å½äºè¯¥ HTTP 请æ±çæ¥æºå°åã
å¨é常æ åµä¸ï¼è®¿é®ä¸ä¸ªå®å ¨åé页é¢çè¯·æ±æ¥èªäºåä¸ä¸ªç½ç«ã
å æ¤ï¼è¦é²å¾¡ CSRF æ»å»ï¼åºç¨ç½ç«åªéè¦å¯¹äºæ¯ä¸ä¸ªè½¬è´¦è¯·æ±éªè¯å
¶ Referer å¼ï¼å¦ææ¯ä»¥åºç¨ç½ç«èªå·±çåå(å¦ a.example)å¼å¤´çååï¼å说æè¯¥è¯·æ±æ¯æ¥èªé¶è¡ç½ç«èªå·±ç请æ±ï¼æ¯åæ³çã妿 Referer æ¯å
¶ä»ç½ç«çè¯ï¼åæå¯è½æ¯é»å®¢ç CSRF æ»å»ï¼æç»è¯¥è¯·æ±ã

è¿ç§æ¹æ³çæ¾èæè§ç好å¤å°±æ¯ç®åæè¡ï¼ç½ç«çæ®éå¼å人åä¸éè¦æå¿ CSRF çæ¼æ´ï¼åªéè¦å¨æåç»ææå®å
¨ææç请æ±ç»ä¸å¢å ä¸ä¸ªæ¦æªå¨æ¥æ£æ¥ Referer çå¼å°±å¯ä»¥ã
ç¹å«æ¯å¯¹äºå½åç°æçç³»ç»ï¼ä¸éè¦æ¹åå½åç³»ç»çä»»ä½å·²æä»£ç åé»è¾ï¼æ²¡æé£é©ï¼é常便æ·ã
ç¶èï¼è¿ç§æ¹æ³å¹¶é䏿 ä¸å¤±ãReferer ç弿¯ç±æµè§å¨æä¾çï¼è½ç¶ HTTP åè®®ä¸ææç¡®çè¦æ±ï¼ä½æ¯æ¯ä¸ªæµè§å¨å¯¹äº Referer çå ·ä½å®ç°å¯è½æå·®å«ï¼å¹¶ä¸è½ä¿è¯æµè§å¨èªèº«æ²¡æå®å ¨æ¼æ´ã
å卿å
CSRFæ»å»æ¯æ»å»è
å©ç¨ç¨æ·ç身份æä½ç¨æ·è´¦æ·çä¸ç§æ»å»æ¹å¼ã
设计CSRFçé²å¾¡æ¹æ¡å¿
é¡»å
çè§£CSRFæ»å»çåçåæ¬è´¨ã
æä»¬é常使ç¨Anti CSRF Tokenæ¥é²å¾¡CSRFæ»å»ï¼å¨ä½¿ç¨Tokenæ¶ï¼è¦æ³¨æTokençä¿å¯æ§åéæºæ§ã
è¯è®ºåº