1. 程式人生 > 實用技巧 >聊兩句XSS(跨站指令碼攻擊)

聊兩句XSS(跨站指令碼攻擊)

原型鏈汙染攻擊

前言:最近好幾次的比賽都碰到了原型鏈汙染攻擊的題目,這些題目都有一個普遍的特點,看起來就像是一個簡單的注入或者其他常規型別的題目,如果不認真檢視,真的就會根本找不到入口。因為之前沒有這方面的技術,所以今天也來補一下這個技術棧。

參考連結:1.鏈式呼叫https://juejin.cn/post/6844904030221631495

一 什麼是原型鏈汙染

參考連結:https://www.leavesongs.com/PENETRATION/javascript-prototype-pollution-attack.html#0x01-prototype__proto__

首先要了解什麼是原型鏈,下面給出一些比較詳細的連結:

https://www.cnblogs.com/aoyo/p/5245162.html

這是兩個簡單的示例,這裡就說一個點,

 1. _proto_是所有物件(包括函式)都有的,它才叫做物件的原型,原型鏈就是靠它形成的。
  2. prototype只有函式(準確地說是建構函式)才有的。它跟原型鏈沒有關係。它的作用是:建構函式new物件的時候,告訴建構函式新建立的物件的原型是誰。

還有這個該死的小細節

二 XNUCA的ooooldjs 和 安訊杯的 validator

首先我們來看一下題目環境.

後面這些都是一些常規的程式碼套用,我們主要是看圖中的middlewares到底是怎麼運作的,現在我們就偷一個官方wp中的demo來跑一下。

const express = require('express')
const app = express()
const port = 9000
app.use(express.json())
app.use(express.urlencoded({
extended: true
}))
const {
body,
validationResult
} = require('express-validator')
middlewares = [
body('*').trim() // 對所以鍵值進行trim處理
] 
app.use(middlewares)
app.post("/user", (req, res) => {
const foo = "hellowrold"
return res.status(200).send(foo)
})
app.listen(port, () => {
console.log(`server listening on ${port}`)
})

獲得上帝之眼的除錯能力。這是body的實現地方。

然後我們的body就被傳入了以下的地方

並且安排了一個runner在那裡非同步執行中。注意在此處的return的表示式中,將middleware的屬性全部綁到了上面,使他獲得了力量,根據原文也可以知道,這裡就是將所有的東西都全部拷在了他一個人的身上,然後用他來和express進行互動。

然後我們開始發起請求。

這個stack中的資料是根據我們的傳入的body和middler規則生成的一個過濾器,現在在下面進行run方法呼叫。

我們繼續跟下去,發現了loadash的一個漏洞位置了,這裡就是一個漏洞點了

上面的get是他獲取路徑的方法,下面的set就是涉及到原型鏈汙染中的屬性賦值的問題了,我們也就不繼續跟下去了,因為這裡已經知道了(並且注意避開重複引數名字就可以了)。

我們重新回到那個獲取body中對應鍵資料的位置,就是instances

匹配到點號就給他加個中括號。這些功能點複習完畢了,看看漏洞點就是下面這個。

{"\"].__proto__[\"test": "123 "}

利用他匹配.自動加[] 的機制讓取出來的path 他會拿這些path來進行比對,在前面的物件中進行搜尋有沒有這個鍵的資料,如果有就不能通過,這就是操蛋設計,他的value值就會變成你給的value值,就不會呼叫一個API(一會解決這個問題,然後我們就會發現,他成功地提取出了這個prototype的鍵,並馬上就會對他進行汙染。嘿嘿。

這裡還有一個點需要進行繞過,那就是當系統拿著get方法的鍵來找的body要值的時候,發現,我去,沒有這個值,然後就會自動給個空值,然後我們又要來繞過這個地方。

他拿來進行尋找值的鍵,tokey函式又是一個不好惹的東西,他會對【】轉換成path,然後再進行嘿嘿,就會方便很多,這樣

{"a": {"__proto__": {"test": "testvalue"}}, "a\"].__proto__[\"test": 222}

安洵杯的那道題就到這裡結束了。其實那個body的沒有什麼鳥用(不管怎麼配置都會觸發)。

XNUCA的題目涉及知識點

1.非同步程式設計的bug
2.jquery的遠古RCE
3.上面 loadsh的原型鏈汙染