一.php各个版本的特性
二.绕过正则匹配的常见方式
1.绕过空格
a.空变量$@
l$@s
b.环境变量IFS(默认情况下IFS为空格、制表符和换行符)
l${IFS}s
c.重定向符(<,>)
cat < file.txt //把file.txt的内容给cat命令,显示在shell中
ls > file.txt //把ls命令显示在shell中的,写入到文件file.txt中
ls < file //显示file那层的ls命令
d.逗号绕过
{cat,flag.txt} //和cat flag.txt一样
2.绕过某些关键字
a.反斜线绕过(shell中的\用来转义的)
ca\t fl\ag.txt //因为反斜线转义的是特殊字符,所以正常的字符不会转义,即绕过正则匹配又执行了代码
b.两个单引号拼接
l''s //和ls一样,在这里扩展一个python的特性,python字符相加不一定用加好可以直接'a''b',会输出'ab'
c.模糊匹配
1.*(星号):
匹配零个或多个字符。例如,*.txt 匹配所有以 .txt 结尾的文件名。
2.?(问号):
匹配单个字符。例如,file?.txt 可以匹配 file1.txt、fileA.txt 等,但不匹配 file12.txt 或 file.txt(因为 ? 只匹配一个字符)。
3.[](方括号):
匹配方括号内的任意一个字符。例如,file[123].txt 可以匹配 file1.txt、file2.txt 或 file3.txt。
还可以使用范围,如 [a-z] 匹配任何小写字母。
4.[^...](方括号内的否定):
匹配不在方括号内的任意字符。例如,file[^123].txt 不会匹配 file1.txt、file2.txt 或 file3.txt,但会匹配 fileA.txt。
5.{}(花括号):
通常用于扩展,而不是直接的模糊匹配,但可以用于生成一系列匹配的模式。例如,echo file{1..3}.txt 会输出 file1.txt file2.txt file3.txt。
d.内联执行
1.使用分号(;):
分号用于分隔要在单个命令行中顺序执行的命令。Shell会按照从左到右的顺序依次执行这些命令,无论前面的命令是否成功执行。
command1; command2; command3
在这个例子中,command1、command2和command3会依次执行。
2.使用逻辑与(&&):
逻辑与操作符用于连接两个命令,并且仅当第一个命令成功执行(即返回状态为0)时,才会执行第二个命令。
command1 && command2
如果command1成功执行,那么command2会被执行;如果command1失败(返回非0状态),那么command2不会被执行。
3.使用逻辑或(||):
command1 || command2
如果command1失败执行(返回非0状态),那么command2会被执行;如果command1成功执行(返回0状态),那么command2不会被执行。
4.使用子Shell:
你可以将命令放在括号()中,这样它们就会在一个新的子Shell进程中执行。子Shell中的命令之间也可以用分号、逻辑与或逻辑或来连接。
(command1; command2)
或者
(command1 && command2)
或者
bash
(command1 || command2)
5.使用管道符(|):
管道符用于将一个命令的输出作为另一个命令的输入。这通常用于文本处理任务中,而不是简单的命令串联。
command1 | command2
在这个例子中,command1的输出会被传递给command2作为输入。
6.使用后台执行(&):
如果你想要并行执行命令(即同时运行它们),你可以在命令的末尾加上&符号。但是,请注意,这种方式并不会等待第一个命令完成就开始第二个命令;它们会同时运行。
command1 & command2 &
e.编码绕过(类似于base64,16进制编码)
三.弱类型的绕过
详细看这篇文章
四.常见的函数绕过
1.array_search
$c=(array)json_decode(@$_GET['c']); //把输入的json格式转成php的数据格式
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){ //判断c数组里是否不为空,c[m]是否不是数字,并且c[m]是否大于2022
if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){//判断c[n]是否是一个数组,c[n]数组是否有两个,并且c[n][0]也要是数组
$d = array_search("DGGJ", $c["n"]);//查找是否含有DGGJ
$d === false?die("no..."):NULL;
foreach($c["n"] as $key=>$val){
$val==="DGGJ"?die("no......"):NULL;//同上
}
$key2 = 1;
}else{
die("no hack");
}
}else{
die("no");
}
这里就用到了array_search查找匹配的时候用的是==而不是===,所以可以采用弱类型绕过
payload
c={"m":"2024a","n":[[],0]}
2.__wakeup(CVE-2016-7124)
漏洞影响版本:
PHP5 < 5.6.25
PHP7 < 7.0.10
漏洞产生原因:
如果存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于 真实的属性个数时会跳过__wakeup的执行
攻防世界web进阶区Web_php_unserialize,序列化大详解-CSDN博客
3.+绕过正则匹配
反序列化为啥可以利用加号绕过php正则匹配-CSDN博客
五.一些特殊的绕过
1.php伪协议
- php://input
- 用途:读取原始POST数据。
- 示例:
php">$data = file_get_contents('php://input'); echo $data;
说明:这个伪协议允许你读取通过POST方法发送的原始数据,这在处理JSON、XML或其他非表单数据格式时非常有用。
- php://output
- 用途:写入数据到输出缓冲区。
- 示例:
php">$data = "Hello, World!"; file_put_contents('php://output', $data);
- 说明:这个伪协议允许你直接将数据写入到输出缓冲区,通常用于生成动态内容。
- php://filter
- php://memory 和 php://temp
- zlib://
- 用途:读取或写入gzip压缩文件。
- 示例:
php">$data = file_get_contents('zlib://compressed.gz'); echo $data;
- 说明:这个伪协议允许你读取gzip压缩文件的内容,而不需要先解压文件。
- data://
- glob://
- 用途:读取匹配文件路径模式的结果。
- 示例:
php">$files = glob('glob://*.php'); print_r($files);
- 说明:这个伪协议允许你使用glob模式匹配文件路径,并返回匹配的文件列表。
- phar://
- 用途:读取Phar归档文件的内容。
- 示例:
php">$data = file_get_contents('phar://archive.phar/file.txt'); echo $data;
- 说明:这个伪协议允许你读取Phar归档文件(PHP Archive)的内容,Phar是PHP的打包格式,用于将多个PHP文件打包成一个单独的文件。
2.反单引号
程序中的反单引号“ ` ”-CSDN博客
cat `find` //会找到当前目录下的所有文件目录和文件,并输出
//执行过程是先执行find函数,找到目录和文件,在返回执行cat,cat会输出所有的不是目录的内容,目录不显示内容
六.一些特殊的知识
1.robots协议
举个例子,下面也就是不允许你访问f1ag_1l_h3re.php这个文件,详细看下面的链接
User-agent: *
Disallow:
Disallow: f1ag_1s_h3re.php
robots协议-CSDN博客