.NET高級代碼審計(第三課)Fastjson反序列化漏洞

?0X00 前言

Java中的Fastjson曾經爆出了多個反序列化漏洞和Bypass版本,而在.Net領域也有一個Fastjson的庫,作者官宣這是一個讀寫Json效率最高的的.Net 組件,使用內置方法JSON.ToJSON可以快速序列化.Net對象。讓你輕松實現.Net中所有類型(對象,基本數據類型等)和Json之間的轉換,fastjson是一個開源的Json.Net庫,下載地址 http://www.codeproject.com/Articles/159450/fastJSON,反序列過程中詳細的性能對比如下

從圖上得出和老牌Json.Net、Stack等比起來速度和性能優勢非常明顯,究其原因組件的作者利用反射生成了大量的IL代碼,而IL代碼是托管代碼,可以直接給運行庫編譯所以性能就此大大提升。但在某些場景下開發者使用JSON.ToObject方法序列化不安全的數據時候會造成反序列化漏洞從而實現遠程RCE攻擊,本文筆者從原理和代碼審計的視角做了相關介紹和復現。

?

?

0X01 Fastjson序列化

使用JSON.ToJSON可以非常方便的實現.NET對象與Json數據之間的轉化,ToJSON首先會得到對象名稱所在的程序集全限定名,并且作為$types這個key的值,再將對象的成員屬性名轉化為Json數據中的Key,把對象的成員屬性值轉化為Json數據中的value,下面通過一個實例來說明問題,首先定義TestClass對象

定義了三個成員,并實現了一個靜態方法ClassMethod啟動進程。 序列化通過創建對象實例分別給成員賦值?

筆者為了盡量保證序列化過程不拋出異常,所以引入了 JSON.ToJSON方法的第二個參數并實例化創建JSONParameters,它的字段中有很多類型是布爾值,

和反序列化漏洞相關的字段為UseExtensions ,將它設置為true可得到類的全限定名,如果不需要序列化空值的時可將另一個字段SerializeNullValues設為false; 筆者使用JSON.ToJSON后得到序列化的Json數據

0x02 Fastjson反序列化

2.1、反序列化用法

反序列過程就是將Json數據轉換為對象,Fastjson通過創建一個新對象的方式調用JSON. ToObject方法實現的,ToObject有多個重載方法,當傳入兩個參數,第一個參數需要被序列化的數據、第二個參數設置序列化配置選項來指定JSONParameters按照指定的屬性值處理,重載方法參考下圖

?

具體代碼可參考以下Demo

2.2、打造Poc

漏洞的觸發點也是在于被序列化的Json中的$types是否可控,為此官方文檔里也標注了警告。

筆者繼續選擇ObjectDataProvider類方便調用任意被引用類中的方法,具體有關此類的用法可以看一下《.NET高級代碼審計(第一課) XmlSerializer反序列化漏洞》,因為Process.Start方法啟動一個線程需要配置ProcessStartInfo類相關的屬性,例如指定文件名、指定啟動參數,所以首先得考慮序列化ProcessStartInfo,如下代碼Demo

一步步來看,開始從GetType獲取當前類的實例,返回Type類型變量t3;然后通過Type.GetProperty方法找到指定為FileName的公共屬性并賦值給PropertyInfo類型的變量propertyName;再使用PropertyInfo.SetValue方法設置對象的指定屬性值“cmd.exe“,同理為Arguments屬性指定值。下一步再來序列化Process類,并調用StartInfo啟動程序,Demo如下

然后需要對其做減法,去掉無關的System.RuntimeType、System.IntPtr數據,最終得到反序列化Payload

FastJson定義的JSON類定義了多個ToObject重載方法,對于反序列化漏洞無需關心重載的方法參數是一個還是多個,它們都可以觸發漏洞

筆者通過下面的Demo , JSON.ToObject(payload)反序列化成功彈出計算器。

0x03 代碼審計視角

從代碼審計的角度很容易找到漏洞的污染點,通過前面幾個小節的知識能發現需要滿足一個關鍵條件JSON.ToObject傳入String或者Object就可以被反序列化,例如以下JSONSerializer類

攻擊者控制傳入字符串參數json便可輕松實現反序列化漏洞攻擊。Github上也存在大量的不安全案例代碼,如下

0x04 案例復盤

最后再通過下面案例來復盤整個過程,全程展示在VS里調試里通過反序列化漏洞彈出計算器。

1. 輸入http://localhost:5651/Default Post加載value值

2.?通過ToObject 反序列化 ,并彈出計算器

最后附個動態圖

?

0x05 總結

Fastjson憑借速度和性能上的優勢占得一席之地,但隨著newtonsoft.Json的主流化,性能上已經逐漸趕超了Fastjson,也使得Fastjson越來越小眾化,對于攻擊者來說,利用成本很低,在代碼審計配合的情況下這種安全問題越發的嚴重起來,若提交惡意的污染數據,便可水到渠成的反序列化成功拿下目標,最后.NET反序列化系列課程筆者會同步到 https://github.com/Ivan1ee/ 、https://ivan1ee.gitbook.io/ ,后續筆者將陸續推出高質量的.NET反序列化漏洞文章,歡迎大伙持續關注,交流,更多的.NET安全和技巧可關注實驗室公眾號。

?

轉載于:https://www.cnblogs.com/Ivan1ee/p/10581913.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449111.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449111.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449111.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IDEA:No SLF4J providers were found.

如果您是用IDEA 的 maven 寫的 將slf4j的導入包 更改 為下列代碼 <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.8.0-beta2</version></dependency><dependency><groupId&…

【C++基礎】時間類型詳解(轉)

Unix時間戳(Unix timestamp)&#xff0c;或稱Unix時間(Unix time)、POSIX時間(POSIX time)&#xff0c;是一種時間表示方式&#xff0c;定義為從格林威治時間1970年01月01日00時00分00秒起至現在的總秒數。Unix時間戳不僅被使用在Unix 系統、類Unix系統中&#xff0c;也在許多其…

沒變強是因為你太舒服(圖)

職業生涯很長&#xff0c;對企業而言&#xff0c;它需要你成為一個專才&#xff0c;但從職業發展來看&#xff0c;你需要成為一個全才&#xff0c;方能適應社會的變化。 阻礙你成為全才的不良習慣有很多&#xff0c;有時候我們喜歡趨利避害&#xff0c;拖延癥更是讓自己定下來…

解決:DuplicateMappingException: Table [xx] contains physical column name referred to by multiple ... .

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯如題&#xff1a; Caused by: org.hibernate.DuplicateMappingException: Table [xxx] contains physical column name [comment] …

0323表格學習

上午早來復習了一會昨天的課程。今天主要學習了表格的標簽寫法&#xff0c;難度不大&#xff0c;但是合并行與合并列容易混淆搞不明白。 <!--有序列表--> <ol type"I"> <li>數學</li> <li>英語</li> &l…

路由進階

1>路由組件傳參 在組件中使用 $route 會使之與其對應路由形成高度耦合&#xff0c;從而使組件只能在某些特定的 URL 上使用&#xff0c;限制了其靈活性。 解決方法: 1.1若是動態匹配頁面&#xff0c;只需要在路由參數中加入props:true即可。 import Home from "/views/…

物聯網攝像機通訊_網絡調試助手

1&#xff0c;文檔目的&#xff1a; 了解對于物聯網網關與攝像機協議聯動&#xff0c;進行報警抓圖&#xff0c;智能檢測&#xff0c;OSD疊加&#xff0c;語音播報控制等聯動及數據交互。 適用產品&#xff1a;物聯網網關 &#xff08;OSD是屏幕顯示技術的一種&#xff09; 2…

linux 復制指定目錄下的全部文件到另一個目錄中,linux cp 文件夾

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 linux復制指定目錄下的全部文件到另一個目錄中復制指定目錄下的全部文件到另一個目錄中文件及目錄的復制是經常要用到的。linux下進行復…

銀行不告訴的秘密,看完豁然大悟

隨著理財意識的廣泛普及&#xff0c;每個人與銀行打交道的次數越來越頻繁&#xff0c;對于銀行知識、業務的了解似乎也有了很大的進步。 但總有一些看似很“肯定”的事&#xff0c;在銀行那里卻成了“不一定”。 在銀行里&#xff0c;還存在著不少讓非專業人士“意想不到”…

TOJ 3046: 招商銀行網絡系統

3046: 招商銀行網絡系統 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal Submit: 12 Accepted:3 Description 雖然招商銀行的網絡安全已經做得非常完善&#xff0c;但是天有不測風云&#xff0c;招商銀行內部網絡系統的一臺服務器意外感…

vue打包成app后,背景圖片不顯示

問題&#xff1a; 在使用npm run build 打包后&#xff0c; 如果在頁面中使用img標簽引入&#xff0c;打包后的路徑是由index.html開始訪問的&#xff0c;真正訪問的是Static/img/圖片名&#xff0c; 是正確的&#xff0c; 但是寫在css 中的background: url("../../assets…

解決: Linux – git: command not found

出錯原因&#xff1a;服務器沒有安裝GIT&#xff0c;所以導致出錯。 解決方法&#xff1a; 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Centos下使用&#xff1a;yum install git…

19-03-25

關于上拉加載和下拉刷新 minirefresh.github.io/minirefresh… 這是一個插件&#xff0c;應該是默認禁止了e.preventDefault和e.stopPropagation&#xff0c;而且在每次touchend中判斷當前滾動條位置&#xff0c;如果到達上部頂部&#xff0c;則再次雙禁止&#xff0c;因為插件…

如何設計函數?

函數&#xff1a; 一段具有某項功能的代碼&#xff0c;是C語言中管理代碼的單位。 把代碼封裝成一個個函數&#xff0c;可以方便的管理和調用代碼。函數分類&#xff1a; 標準庫函數&#xff1a;C語言標準為委員會為C語言以函數形式提供的一些基礎功能&#xff0c;被封裝在lib…

八個被現代科學證實的古老信條

近年來&#xff0c;現代科學證實了很多古代智慧中的教導和信念。幾個世紀以來我們都知道這些信念能夠幫助我們生活的幸福、健康和平衡。《赫芬頓郵報》將八個被現代科學證實的古老信仰整理如下。 1.幫助他人能讓你更健康 近年來&#xff0c;現代科學證實了很多古代智慧中的教…

Hystix熔斷解決雪崩問題

1.線程隔離&#xff0c;服務降級&#xff08;服務的消費方做降級處理&#xff09; 當服務繁忙時&#xff0c;如果服務出現異常&#xff0c;不是粗暴的直接報錯&#xff0c;而是返回一個友好的提示&#xff0c;雖然拒絕了用戶的訪問&#xff0c;但是會返回一個結果。 這就好比去…

Docker 環境下如何 安裝 Zookeeper

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 第一步&#xff1a;首先下載Zookeeper的鏡像文件&#xff1a; 從倉庫中pull 這個zookeeper鏡像&#xff1a;docker pull jplock/zookeep…

office教程:教你Excel 怎么樣使用信息函數

Excel如何使用信息函數信息函數專門用來返回某些指定單元格或區域的信息&#xff0c;例如獲取文件路徑、單元格格式信息或操作環境信息等。一&#xff0c;使用CELL函數返回引用單元格信息工作表中的每一個單元格都有對應的單元格格式、位置和內容等信息&#xff0c;在Excel中可…

【C基礎】指針/指針運算/二級指針/函數指針

指針定義&#xff1a; 指針是一種數據類型&#xff0c;使用它可以用來定義指針變量&#xff0c;指針變量中存儲的其實是整數&#xff0c;這種整數代表了內存的編號。指針的使用&#xff1a; 1、函數之間相獨立&#xff0c;但有些時候需要共享變量。傳參是值傳遞全局變量容易命…

中醫養生 選對方法就成功一半

在醫院門診室&#xff0c;因為腸胃不適前來看病的林先生。問及他平時的養生之道&#xff0c;他笑談&#xff0c;現在也正困惑著呢。 原來&#xff0c;最近他有兩個朋友&#xff0c;在單位體檢時分別被查出患有腎結石和膽囊炎&#xff0c;他本人最近也犯胃病。 最令人奇怪的一…