XSS 簡單理解之:AntiSamy


AntiSamy介紹

OWASP是一個開源的、非盈利的全球性安全組織,致力於應用軟件的安全研究。我們的使命是使應用軟件更加安全,使企業和組織能夠對應用安全風險作出更清晰的決策。目前OWASP全球擁有140個分會近四萬名會員,共同推動了安全標准、安全測試工具、安全指導手冊等應用安全技術的發展。

OWASP AntiSamy項目可以有好幾種定義。從技術角度看,它是一個可確保用戶輸入的HTML/CSS符合應用規范的API。也可以這么說,它是個確保用戶無法在HTML中提交惡意代碼的API,而這些惡意代碼通常被輸入到個人資料、評論等會被服務端存儲的數據中。在Web應用程序中,“惡意代碼”通常是指 Javascript。同時層疊樣式表(CSS)在調用Javascript引擎的時候也會被認為是惡意代碼。當然在很多情況下,一些“正常”的HTML 和CSS也會被用於惡意的目的,所以我們也會對此予以處理。

 

AnitiSamy下載

         官方網站:https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project

         項目地址:https://code.google.com/p/owaspantisamy/downloads/list

                   我們看到Downloads,下載WhereToGet.txt就可以看到下載地址

 

標准策略文件說明

antisamy-slashdot.xml

Slashdot (  http://www.slashdot.org/  )  是一個提供技術新聞的網站,它允許用戶用有限  的  HTML  格式的內容匿名回帖。  Slashdot 不僅僅是目前同類中最酷的網站之一,而  且同時也曾是最容易被成功攻擊的網站之一。更不幸的是,導致大部分用戶遭受攻  擊的原由是臭名昭着的  goatse.cx  圖片  (  請你不要刻意去看  )  。  Slashdot 的安全策略非  常嚴格:用戶只能提交下列的  html  標簽:  <b>, <u>, <i>,
<a>,<blockquote>  ,並且  還不支持  CSS. 

因此我們創建了這樣的策略文件來實現類似的功能。它允許所有文本格式的標簽來  直接修飾字體、顏色或者強調作用。

antisamy-ebay.xml

眾所周知,  eBay (  http://www.ebay.com/  )  是當下最流行的在線拍賣網站之一。它是一  個面向公眾的站點,因此它允許任何人發布一系列富  HTML  的內容。  我們對  eBay  成為一些復雜  XSS  攻擊的目標,並對攻擊者充滿吸引力絲毫不感到奇怪。由於  eBay  允許  輸入的內容列表包含了比  Slashdot 更多的富文本內容,所以它的受攻擊面也要大得多。下  面的標簽看起來是  eBay  允許的(  eBay  沒有公開標簽的驗證規則)  :   
 <a>,..

antisamy-myspace.xml

MySpace ( http://www.myspace.com/  )  是最流行的一個社交網站之一。用戶允許提交  幾乎所有的他們想用的  HTML  和  CSS  ,只要不包含  JavaScript 。  MySpace  現在用一  個黑名單來驗證用戶輸入的  HTML  ,這就是為什么它曾受到  Samy  蠕蟲攻擊  ( http://namb.la/)  的原因。  Samy  蠕蟲攻擊利用了一個本應該列入黑名單的單詞  (eval)  來進行組合碎片攻擊的,其實這也是  AntiSamy 立項的原因。  

antisamy-anythinggoes.xml 

也很難說出一個用這個策略文件的用例。如果你想允許所有有效的  HTML  和  CSS  元素輸入(但能拒絕  JavaScript 或跟  CSS  相關的網絡釣魚攻擊),你可以使用  這個策略文件。其實即使  MySpace 也沒有這么瘋狂。然而,它確實提供了一個很  好的參考,因為它包含了對於每個元素的基本規則,所以你在裁剪其它策略文件的  時候可以把它作為一個知識庫。  

策略文件定制

http://www.owasp.org/index.php/AntiSamy_Directives

AntiSamy.JAVA的使用

首先,老規矩,我們需要一個jar包

使用Maven的,在pom.xml的dependencies中添加如下代碼

 

<dependency>
<groupId>org.owasp.antisamy</groupId>
<artifactId>antisamy</artifactId>
<version>1.5.3</version>
</dependency>

 

配置web.xml

 

<!-- XSS -->
<filter>
<filter-name>XSS</filter-name>
<filter-class>com.william.XssFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XSS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

 

其中XssFilter為自定義的class,該類必須實現Filter類,在XssFilter類中實現doFilter函數。將策略文件放到和pom.xml平級目錄下然后我們就開始編寫XssFilter類。

public class XssFilter implements Filter {
@SuppressWarnings("unused")
private FilterConfig filterConfig;
public void destroy() {
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
chain.doFilter(new RequestWrapper((HttpServletRequest) request), response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
}

OK,我們需要重寫request,新建一個類RequestWrapper,繼承HttpServletRequestWrapper,我們需要重寫getParameterMap()方法,以及過濾非法html的方法xssClean()

public class RequestWrapper extends HttpServletRequestWrapper {
public RequestWrapper(HttpServletRequest request) {
super(request);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public Map<String,String[]> getParameterMap(){
Map<String,String[]> request_map = super.getParameterMap();
Iterator iterator = request_map.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry me = (Map.Entry)iterator.next();
//System.out.println(me.getKey()+":");
String[] values = (String[])me.getValue();
for(int i = 0 ; i < values.length ; i++){
System.out.println(values[i]);
values[i] = xssClean(values[i]);
}
}
return request_map;
}
private String xssClean(String value) {
        AntiSamy antiSamy = new AntiSamy();
        try {
Policy policy = Policy.getInstance("antisamy-myspace-1.4.4.xml");
//CleanResults cr = antiSamy.scan(dirtyInput, policyFilePath); 
            final CleanResults cr = antiSamy.scan(value, policy);
            //安全的HTML輸出
            return cr.getCleanHTML();
        } catch (ScanException e) {
            e.printStackTrace();
        } catch (PolicyException e) {
            e.printStackTrace();
        }
        return value;
}
}

好了,到此為止,我們的AntiSamy就成功添加到項目了。

CSRF 防御方案總結下,無外乎三種:

  1. 用戶操作限制,比如驗證碼;

  2. 請求來源限制,比如限制 HTTP Referer 才能完成操作;

  3. token 驗證機制,比如請求數據字段中添加一個 token,響應請求時校驗其有效性;

第一種方案明顯嚴重影響了用戶體驗,而且還有額外的開發成本;第二種方案成本最低,但是並不能保證 100% 安全,而且很有可能會埋坑;第三種方案,可取!


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM