XSS 簡(jiǎn)介
XSS(Cross Site Script)畦浓,全稱跨站腳本攻擊检疫,為了與 CSS(Cascading Style Sheet) 有所區(qū)別屎媳,所以在安全領(lǐng)域稱為 XSS风响。
XSS 攻擊状勤,通常指黑客通過(guò) HTML 注入 篡改網(wǎng)頁(yè)荧降,插入惡意腳本薄扁,從而在用戶瀏覽網(wǎng)頁(yè)時(shí)脱盲,控制用戶瀏覽器的一種攻擊行為。
DOM—based XSS漏洞的產(chǎn)生
DOM—based XSS漏洞是基于文檔對(duì)象模型Document Objeet Model,DOM)的一種漏洞尚卫。DOM是一個(gè)與平臺(tái)、編程語(yǔ)言無(wú)關(guān)的接口,它允許程序或腳本動(dòng)態(tài)地訪問(wèn)和更新文檔內(nèi)容、結(jié)構(gòu)和樣式撒轮,處理后的結(jié)果能夠成為顯示頁(yè)面的一部分题山。DOM中有很多對(duì)象故痊,其中一些是用戶可以操縱的慨菱,如uRI闪彼,location畏腕,refelTer等描馅“蚶海客戶端的腳本程序可以通過(guò)DOM動(dòng)態(tài)地檢查和修改頁(yè)面內(nèi)容,它不依賴于提交數(shù)據(jù)到服務(wù)器端刁绒,而從客戶端獲得DOM中的數(shù)據(jù)在本地執(zhí)行速蕊,如果DOM中的數(shù)據(jù)沒有經(jīng)過(guò)嚴(yán)格確認(rèn)隅肥,就會(huì)產(chǎn)生DOM—based XSS漏洞。
DOM簡(jiǎn)介
xss DOM
可能觸發(fā)DOM型XSS的屬性:
document.referer屬性
window.name屬性
location屬性
innerHTML屬性
documen.write屬性
1 查看服務(wù)端代碼
什么也沒有
查看頁(yè)面源代碼
相關(guān)屬性方法解釋
1 document 和 windows 對(duì)象
document表示的是一個(gè)文檔對(duì)象绿语,window表示的是一個(gè)窗口對(duì)象秃症,一個(gè)窗口下可以有多個(gè)文檔對(duì)象候址。
所以一個(gè)窗口下只有一個(gè)window.location.href,但是可能有多個(gè)document.URL种柑、document.location.href
window 對(duì)象
它是一個(gè)頂層對(duì)象,而不是另一個(gè)對(duì)象的屬性即瀏覽器的窗口岗仑。
document 對(duì)象
該對(duì)象是window和frames對(duì)象的一個(gè)屬性,是顯示于窗口或框架內(nèi)的一個(gè)文檔。
document 只是屬于window 的一個(gè)子對(duì)像聚请。
window.location 包含 href 屬性荠雕,直接取值賦值時(shí)相當(dāng)于 window.location.href
window.location.href 當(dāng)前頁(yè)面完整 URL
document.location 包含 href 屬性,直接取值賦值時(shí)相當(dāng)于 document.location.href
document.location.href 當(dāng)前頁(yè)面完整 URL
document.href 沒有這個(gè)屬性
document.URL 取值時(shí)等價(jià)于 window.location.href 或 document.location.href良漱。在某些瀏覽器中通過(guò)對(duì) document.URL 賦值來(lái)實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)舞虱,但某些瀏覽器中不行欢际。
2 indexOf()方法
定義和用法
indexOf() 方法可返回某個(gè)指定的字符串值在字符串中首次出現(xiàn)的位置母市。
indexOf(searchvalue,fromindex)
參數(shù) | 描述 |
---|---|
searchvalue | 必需。規(guī)定需檢索的字符串值损趋。 |
fromindex | 可選的整數(shù)參數(shù)患久。規(guī)定在字符串中開始檢索的位置。它的合法取值是 0 到 stringObject.length - 1浑槽。如省略該參數(shù)蒋失,則將從字符串的首字符開始檢索。 |
注釋:indexOf() 方法對(duì)大小寫敏感桐玻!
注釋:如果要檢索的字符串值沒有出現(xiàn)篙挽,則該方法返回 -1
2 substring() 方法
substring() 方法用于提取字符串中介于兩個(gè)指定下標(biāo)之間的字符。
substring(start,stop)
參數(shù) | 描述 |
---|---|
start 必需镊靴。 | 一個(gè)非負(fù)的整數(shù)铣卡,規(guī)定要提取的子串的第一個(gè)字符在 stringObject 中的位置。 |
stop 可選偏竟。 | 一個(gè)非負(fù)的整數(shù)煮落,比要提取的子串的最后一個(gè)字符在 stringObject 中的位置多 1。 |
如果省略該參數(shù)踊谋,那么返回的子串會(huì)一直到字符串的結(jié)尾蝉仇。 |
decodeURI() 函數(shù)可對(duì) encodeURI() 函數(shù)編碼過(guò)的 URI 進(jìn)行解碼
document.write
document.write詳解
document.write是JavaScript中對(duì)document.open所開啟的文檔流(document stream操作的API方法,它能夠直接在文檔流中寫入字符串殖蚕,一旦文檔流已經(jīng)關(guān)閉轿衔,那document.write就會(huì)重新利用document.open打開新的文檔流并寫入,此時(shí)原來(lái)的文檔流會(huì)被清空睦疫,已渲染好的頁(yè)面就會(huì)被清除害驹,瀏覽器將重新構(gòu)建DOM并渲染新的頁(yè)面
解釋script 代碼
if (document.location.href.indexOf("default=") >= 0) #判斷 "default=" 是否存在
var lang = document.location.href.substring(document.location.href.indexOf("default=")+8)
# 取出 default 的值 并 賦值給變量lang
document.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>");
寫入<option value='"lang"'>"decodeURL(lang)</option>
所以我們插入的 javascript 代碼可以在 decodeURL(lang) 被執(zhí)行
構(gòu)造攻擊語(yǔ)句
http://127.0.0.1/dvwa-master/vulnerabilities/xss_d/?default=English<script>alert(/xss/);</script>
寫入頁(yè)面的效果是這樣的
<option value='變量lang 的值'>English<script>alert(/xss/);</script></option>
Medium
查看服務(wù)端源代碼
array_key_exists() 函數(shù)檢查某個(gè)數(shù)組中是否存在指定的鍵名,如果鍵名存在則返回 true笼痛,如果鍵名不存在則返回 false裙秋。
提示:如果指定數(shù)組的時(shí)候省略了鍵名琅拌,將會(huì)生成從 0 開始并以 1 遞增的整數(shù)鍵名
array_key_exists(key,array)
參數(shù) | 描述 |
---|---|
key 必需 | 規(guī)定鍵名。 |
array | 必需摘刑。規(guī)定數(shù)組 |
stripos() 函數(shù)查找字符串在另一字符串中第一次出現(xiàn)的位置(不區(qū)分大小寫)
stripos(string,find,start)
參數(shù) | 描述 |
---|---|
string 必需 | 規(guī)定被搜索的字符串进宝。 |
find 必需 | 規(guī)定要查找的字符。 |
start 可選 | 規(guī)定開始搜索的位置枷恕。 |
返回值: | 返回字符串在另一字符串中第一次出現(xiàn)的位置党晋,如果沒有找到字符串則返回 FALSE。注釋:字符串位置從 0 開始徐块,不是從 1 開始未玻。 |
header() 函數(shù)向客戶端發(fā)送原始的 HTTP 報(bào)頭
header(string,replace,http_response_code)
參數(shù) | 描述 |
---|---|
string 必需 | 規(guī)定要發(fā)送的報(bào)頭字符串。 |
replace 可選 | 指示該報(bào)頭是否替換之前的報(bào)頭胡控,或添加第二個(gè)報(bào)頭扳剿。 |
默認(rèn)是 true(替換)。false(允許相同類型的多個(gè)報(bào)頭)昼激。 | |
http_response_code可選 | 把 HTTP 響應(yīng)代碼強(qiáng)制為指定的值庇绽。(PHP 4 以及更高版本可用) |
由服務(wù)端代碼 可知 Medium 級(jí)別過(guò)濾了 <script>
構(gòu)造攻擊語(yǔ)句
http://127.0.0.1/dvwa-master/vulnerabilities/xss_d/?default=English</option></select><img src=1 onerror=alert(/xss/)>
寫入頁(yè)面的效果是這樣的
<option value=''> English</option></select><img src=1 onerror=alert(/xss/)></option>
首先閉合了<option>標(biāo)簽 和 <select>標(biāo)簽
利用 img標(biāo)簽的onerror事件
javascript,img標(biāo)簽支持onerror 事件橙困,在加載圖像的過(guò)程中如果發(fā)生了錯(cuò)誤瞧掺,就會(huì)觸發(fā)onerror事件
執(zhí)行 JavaScript
high
查看服務(wù)端源代碼
白名單 只允許 傳的 default值 為 French English German Spanish 其中一個(gè)
構(gòu)造攻擊語(yǔ)句
http://www.dvwa.com/vulnerabilities/xss_d/?default=English #<script>alert(/xss/)</script>
寫入頁(yè)面的效果是這樣的
<option value=''>English #<script>alert(/xss/)</script></option>
由于 form表單提交的數(shù)據(jù) 想經(jīng)過(guò)JS 過(guò)濾 所以注釋部分的javascript 代碼 不會(huì)被傳到服務(wù)器端(也就符合了白名單的要求)
我們寫一個(gè)html 驗(yàn)證一下<option value=''>English #<script>alert(/xss/)</script></option>是否可行
impossible
服務(wù)端源代碼
不需要做任何事,在客戶端處理