程式碼審計中XSS挖掘一些體會

蚁景网安实验室發表於2024-06-19

0x01 XSS的挖掘思路

1.1 反射型

直接搜尋 echo print_r print之類的函式即可也可以尋找$_GET變數來判斷是否存在輸出(不過對於程式碼審計來說除非實在挖不出漏洞,否則沒必要關注反射xss)

程式碼審計中XSS挖掘一些體會

1.2 dom型

和反射型差不多需要看網站的前端javascript(一般安裝好網頁直接檢視原始碼即可,和反射xss一樣程式碼審計沒必要太過於關注)。但是也和反射型有區別,domxss是不經過伺服器處理的,也就是不需要經過後端程式碼,需要審計javascript。

程式碼審計中XSS挖掘一些體會

1.3 儲存型xss

對於程式碼審計,儲存型xss才是需要關注的重點。

儲存型xss一般是存在有資料庫互動的地方,因為需要把資料寫入進去資料庫中才能長期儲存資料。

所以我們在審計儲存型xss的時候會關注資料庫互動的地方。

這裡舉例兩種思路:

思路一 : 從資料庫類檔案中開始審計

什麼是資料庫類檔案呢?其實在實際開發專案過程中,通常程式設計師都會把資料庫操作封裝成一個類來提供操作。

比如說我們需要設計一個留言板,留言板最基本得有這幾個功能吧。比如說發表留言,檢視留言,回覆留言,刪除留言,修改留言等等功能。

而這些是不是需要使用資料庫來實現這類功能(下面用程式碼配合虛擬碼示意,注意程式碼可以不用理解功能,但是要能夠理解程式碼為什麼要這樣寫。)

# 比如使用者發表一條留言
​
# uname就是使用者名稱也就是"小明",content就是內容也就是"你好"
​
insert into text(id, uname, content) value(1, '小明', '你好');
# 然後使用者發現你好不太恰當,想刪掉替換成您好
delete from text where id = 1;
# id就是資料庫用於區分不同資料的欄位, delete from 表示刪除表裡面的內容
text表示需要刪除的表
# 表示刪除id=1的資料
where id = 1
​
# 那麼php中的程式碼是這樣看小明的:
$sql = "insert into text(id, uname, content) value(1, '小明',
'你好')";
// $conn就是我們資料庫的連結
mysqli_query($conn, $sql);
$sql = "delete from text where id = 1";
mysqli_query($conn, $sql);
// 小明換成了您好
$sql = "insert into text(id, uname, content) value(2, '小明',
'您好')";
mysqli_query($conn, $sql);
$sql = "delete from text where id = 2";
mysqli_query($conn, $sql);
​
# 這樣的程式碼是不是特別麻煩 把他簡化一下(把sql查詢做成一個函式)
function sql_insert($name, $content){
$sql = "insert into text(id, uname, content) value(1, '{$name}',
'{$content}',哈哈哈哈')";
mysqli_query($conn,$sql);
}
​
function sql_delete($id){
$sql = "delete from text where id = '{$id}'";
mysqli_query($conn,$sql);
}
​
// 好的封裝完成了 這時候小明傳送你好
sql_insert('小明', "你好");
sql_delete(1); // 想刪除
// 傳送您好
sql_insert('小明', "您好");
sql_delete(2); // 又刪除
​
# 這樣是不是無論小明發多少條留言都能夠很輕鬆的刪除插入
# 好了 這就是封裝成的作用(把重複的操作放在一起)
#
這裡是寫完了,但是還是有一個問題,比如遇到sql注入怎麼辦。遇到xss怎麼辦。
# 很簡單!只需要修改我們定義的兩個操作函式即可
function sql_insert($name, $content){
$name = htmlspecialchars(addslashes($name));
$content = htmlspecialchars(addslashes($content)); // 新增了轉義
$sql = "insert into text(id, uname, content) value(1, '{$name}',
'{$content}')";
mysqli_query($conn,$sql);
}
​
function sql_delete($id){
$id = intval($id); // 強制轉換
$sql = "delete from text where id = '{$id}'";
mysqli_query($conn,$sql);
}
​
#
是不是這樣的寫法很方便,如果我們不定義一個函式集中操作的話每次拼接sql語句都需要新增htmlspecialchars和addlashes
#
這就是我們為什麼要尋找資料庫操作檔案的意義。(因為程式設計師很有可能把過濾函式寫在sql類中)

好了,進入正題。 關於如何找到sql封裝檔案,很簡單。

搜尋關鍵字即可(new mysqli, mysqli,pdo)這裡拿其他cms來例項(phpems架構比較複雜也就是上課時用的cms)這裡我使用yixuncms_v2.0.3

開啟檔案,全域性搜尋

程式碼審計中XSS挖掘一些體會

第二步 分析檔案的功能 查詢需要的關鍵函式

程式碼審計中XSS挖掘一些體會

直接跟進query函式 檢視是否有過濾

程式碼審計中XSS挖掘一些體會

右鍵定位函式 定位escape_string_array函式

程式碼審計中XSS挖掘一些體會

然後跟進審計

程式碼審計中XSS挖掘一些體會

思路二: 使用輸出函式進行動態輸出檢視是否過濾

因為原始碼在我們伺服器上,我們可以使用echo或者var_dump檢視過濾後的結果來判斷過濾了什麼。

由於我們不知道在程式在哪個頁面做了sql查詢,所以選擇登入功能作為測試點

因為可以知道一點,那就是登陸功能一定是做了sql查詢的,除非是前端登陸,而前端登陸本身也就是一個漏洞...

知道了這一點,登陸抓包,登陸賬號密碼有沒有都不要緊。

我這裡使用錯誤的賬號密碼登陸:

程式碼審計中XSS挖掘一些體會

返回了一個操作失敗

程式碼審計中XSS挖掘一些體會

然後我們根據提示去全域性搜尋: 操作失敗

程式碼審計中XSS挖掘一些體會

至於為什麼是這三個呢? 因為我們抓到的資料表訪問的就是這個路徑

程式碼審計中XSS挖掘一些體會

進入app.php

程式碼審計中XSS挖掘一些體會

然後定位getUserByUserName函式

程式碼審計中XSS挖掘一些體會

然後就可以新增程式碼進行除錯了(修改後記得儲存 快捷鍵 ctrl + s)

程式碼審計中XSS挖掘一些體會

再次發包進行除錯發現已經返回sql語句了

程式碼審計中XSS挖掘一些體會

程式碼審計中XSS挖掘一些體會

思路在這裡完結了。下面是漏洞復現

【----幫助網安學習,以下所有學習資料免費領!加vx:dctintin,備註 “部落格園” 獲取!】

 ① 網安學習成長路徑思維導圖
 ② 60+網安經典常用工具包
 ③ 100+SRC漏洞分析報告
 ④ 150+網安攻防實戰技術電子書
 ⑤ 最權威CISSP 認證考試指南+題庫
 ⑥ 超1800頁CTF實戰技巧手冊
 ⑦ 最新網安大廠面試題合集(含答案)
 ⑧ APP客戶端安全檢測指南(安卓+IOS)

0x02 漏洞的復現

因為上面已經知道了xss和sql在普通引數裡面不存在,然後正常註冊後登陸發現

程式碼審計中XSS挖掘一些體會

那麼直接根據註冊ip搜尋

程式碼審計中XSS挖掘一些體會

跟進後再次全域性搜尋

程式碼審計中XSS挖掘一些體會

程式碼審計中XSS挖掘一些體會

程式碼審計中XSS挖掘一些體會

程式碼審計中XSS挖掘一些體會

由於程式開發中預設ip地址是安全的一般很少會進行過濾,所以這裡直接猜測ip地址不存在過濾。

然後註冊賬號進行測試

payload:Client-ip: <svg/onload=alert(1)>

程式碼審計中XSS挖掘一些體會

然後放包,發現個人中心已經儲存了我們的xss

程式碼審計中XSS挖掘一些體會

程式碼審計中XSS挖掘一些體會

同理,這裡沒有經過過濾也是存在注入的。這裡就不在演示

0x03 總結

xss加固可以在前端或者後端實體編碼 同時也要注意對單雙引號的轉義。

不要以為獲取ip就是安全的,獲取ip往往是不安全的。

思路 -》 找過濾函式 -》測試過濾是否有遺漏 -》 測試可能沒有經過過濾的引數

有些網站會把在屬性內的引數使用反斜槓編碼.比如你輸入 &url="onerror=alert(1) 雙引號會被轉義成/",這時如果網站的編碼是gb2312...之類的可以使用寬位元組 %df"的方式繞過

程式碼審計中XSS挖掘一些體會

程式碼審計中XSS挖掘一些體會

更多網安技能的線上實操練習,請點選這裡>>

相關文章