0x00 XSS Rootkit介紹
Rootkit概念: 一種特殊的惡意軟體
類型: 常見為木馬、後門等
特點: 隐蔽 持久控制
談到XSS,一般都是想到反射型、存儲型及dom xss,腦海中往往就是點選連結然後彈窗的形式,這次學習的是ROORKIT XSS(持久化XSS),就是通過某些手段嵌入一些js代碼,進而擷取一個持久控制浏覽器用戶端的“Rootkit”的一種攻擊。下面是Roorkit XSS的思維導圖
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLwkDMxUDM4AjNtEDNzkTN0EjMxMjM5ADOxAjMtUTN0kjM58CX5ADOxAjMvwVN1QTOykzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
0x01 利用點-網站使用者資訊
思維導圖中列舉了一些,如個性簽名、使用者名、昵稱等,主要就是網站本身展示的資訊,這個其實跟存儲型XSS很類似
這塊就不詳細講了,挖掘方式跟存儲型XSS一樣
0x02 Cookie
有時我們會将資訊儲存在cookie中,使用document.cookit擷取資訊再輸出在頁面中,
如果沒有做安全輸出的話,就會存在Rootkit XSS,因為cookie是儲存在用戶端的,有失效時間,當然如果我們能控制添加,那就可以控制這個失效時間了
0x02.1 Cookie學習
Cookie是由伺服器生成的,通過響應傳回給用戶端,儲存在某個目錄下,後面發往該伺服器的請求都會攜帶此Cookie;
而Cookie是存儲什麼資訊的呢,又是起到什麼作用的呢?
主要是HTTP協定是無狀态的,而業務是需要狀态的,要判斷此次請求是屬于誰的,才能記錄用戶端的行為和資料,換句話說就是維持會話的,當然也是可以存儲其他資訊的。
Cookie的處理分為:
1)伺服器向用戶端發送cookie
2)浏覽器将cookie儲存
3)之後每次http請求浏覽器都會将cookie發送給伺服器端
Cookie的主要構成如下:
name:一個唯一确定的cookie名稱。通常來講cookie的名稱是不區分大小寫的。
value:存儲在cookie中的字元串值。最好為cookie的name和value進行url編碼
domain:cookie對于哪個域是有效的。所有向該域發送的請求中都會包含這個cookie資訊。這個值可以包含子域(如:
yq.aliyun.com),也可以不包含它(如:.aliyun.com,則對于aliyun.com的所有子域都有效).
path: 表示這個cookie影響到的路徑,浏覽器跟會根據這項配置,像指定域中比對的路徑發送cookie。
expires:失效時間,表示cookie何時應該被删除的時間戳(也就是,何時應該停止向伺服器發送這個cookie)。如果不設定這個時間戳,浏覽器會在頁面關閉時即将删除所有cookie;不過也可以自己設定删除時間。這個值是GMT時間格式,如果用戶端和伺服器端時間不一緻,使用expires就會存在偏差。
max-age: 與expires作用相同,用來告訴浏覽器此cookie多久過期(機關是秒),而不是一個固定的時間點。正常情況下,max-age的優先級高于expires。
HttpOnly:
告知浏覽器不允許通過腳本document.cookie去更改這個值,同樣這個值在document.cookie中也不可見。但在http請求中仍然會攜帶這個cookie。注意這個值雖然在腳本中不可擷取,但仍然在浏覽器安裝目錄中以檔案形式存在。這項設定通常在伺服器端設定。
secure: 安全标志,指定後,隻有在使用SSL連結時候才能發送到伺服器,如果是http連結則不會傳遞該資訊。就算設定了secure 屬性也并不代表他人不能看到你機器本地儲存的 cookie 資訊,是以不要把重要資訊放cookie就對了伺服器端設定
0x02.2 Cookie持久化XSS原理
Rootkit XSS主要是利用了下面兩點:
1、Cookie可以設定過期時間儲存在用戶端,隻要用戶端不主動清理cookie
2、發往該伺服器的請求都會攜帶屬于此伺服器的Cookie
如果前端使用cookie資料在頁面展示,可以利用XSS或者CSRF等漏洞成功設定惡意Cookie内容,就能夠構造可持續的XSS攻擊。
這裡寫了個簡單的業務:
<html>
<head>
<title>Rootkit XSS for Cookie</title>
</head>
<body>
<h1 id='id'></h1>
</body>
<script type="text/javascript">
var user = location.hash.split("#")[1];
var cookies = document.cookie.split("; ");
for (index in cookies){
var cookie = cookies[index];
if(cookie.indexOf(user) == 0){
//cookie的名字hack加= 一共5個字元
var data = cookie.substring(5);
console.log(data);
document.getElementById("id").innerHTML=data;
break;
}
}
</script>
</html>
将cookie中的資訊展示到<h1>标簽中
構造cookie如下:
通路:http://localhost/rootkit.php#hack
彈窗了,隻要不清理cookie,什麼時候通路都會觸發這個XSS
0x03 localStorage學習
localStorage是HTML5新加入的一特性,這個特性主要是用來作為本地存儲來使用的,解決了cookie存儲空間不足的問題(cookie中每條cookie的存儲空間為4k),localStorage中一般浏覽器支援的是5M大小,這個在不同的浏覽器中localStorage會有所不同。
0x03.1 浏覽器支援情況
if(window.localStorage){
alert("Yes");//支援
}else{
alert("No");//不支援
}
我們可以用上面js來判斷浏覽器是否支援localStorage特性
簡單點就打開浏覽器的控制台,輸入localStorage回車,看是否localStorage資訊,如下
我這裡是部落格園的,這裡有儲存資訊,儲存的是目前編輯的部落格内容,看來編輯過程中的儲存就是使用localStorage了。
0x03.2 localStorage使用
我們可以打開控制台的localStorage資訊,裡面會展示特性的方法,如下
擷取:localStorage.getItem(key);若key不存在則傳回null
存儲:localStorage.setItem(key,value); key值存在則更新value
删除:localStorage.removeItem(key,value);
清空:localStorage.clear(); 清空本地localStorage
存儲
我們打開控制台,我們操作都在這裡(FireFox)
三種設定的方法:
localStorage.setItem('test','123');
localStorage['test']='123';
localStorage.test='123';
資訊存儲在本地的,我們選中‘存儲’選項,選擇我們是在那個域下添加的
資訊設定成功。
擷取
擷取也有三種方式:
localStorage.getItem('test');
localStorage['test'];
localStorage.test;
輸出如下
删除
localStorage.removeItem("test"); //删除某個鍵的資料
test的本地存儲就被删除了
清空
localStorage.clear();
這個是清空localStorage的存儲資訊,前面添加的都沒有了。
0x03.3 localStorage持久化XSS原理
上面學習了localStorage,知道資訊是存儲在本地的,而且如果不主動執行clear()時,是會一直保留的,退出浏覽器也不會清空。
這個就是我們的利用點了,因為這個才能形成Rootkit XSS。
利用條件:
1、站點前端有擷取使用localStorage的資料進行展示
2、存在反射型或者存儲型XSS,用于添加localStorage惡意資料
利用過程:
根據站點擷取localStorage的資料輸出點構造payload,通過反射或存儲XSS,将payload設定localStorage
這樣就可以構造一個Rootkit的XSS了。
參考資料:
https://blog.csdn.net/zhangquan_zone/article/details/77627899
https://www.jb51.net/article/86598.htm?pc
https://www.cnblogs.com/st-leslie/p/5617130.html