这两个链接有兴趣自己可以去参考下
文件包含漏洞
PHP文件包含漏洞
文件包含分为本地文件包含和远程文件包含,可以直接执行包含文件的代码,包含的文件格式是不受限制的。文件包含漏洞大多可以直接获取webshell,
文件包含漏洞的成因:
文件包含漏洞的产生原因是在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校验,或者校验被绕过,从而操作了预想之外的文件,就 可能导致意外的文件泄露甚至恶意的代码注入。
文件包含的函数:
include()和include_once():在包含文件时即使遇到错误,下面的代码依然会执行;
require()和require_once():会直接报错退出程序。
漏洞利用::
(1)上传包含一句话木马的任意文件,记录好路径;
(2)利用文件包含漏洞上传文件
本地文件包含
本地文件包含,做了过滤不能远程
一般结合上传漏洞进行getshell
远程文件包含:
需要设置allow_url_include = On和allow_url_fopen = On
危害大于本地文件包含,直接调用一个远程文件木马就能getshell
附加:
包含日志文件getshell
日志文件要知道是什么服务器搭建的
抓包可以知道服务器类型,
查找该类服务器错误日志的默认路径,file=路径
用Ckinfe把路径拼接起来
结合Apache日志Getshell
(1)将webshell代码写在URL中,抓包访问
注意:在数据包中要对webshell代码进行urldecode操作,否则被记录到日志中的webshell代码是编码后的
(2)包含日志文件获取webshell,可以包含access.log也可以包含error.log,此两者均存放在apache/logs/目录下
webshell:就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。
黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。
(File Inclusion)
low(没有做加固)
文件包含漏洞首先要修改php.ini(这样才可以测试漏洞)
allow_url_include :允许url里包含文件要打开(开发人员可能会把这个值忘了,这也是导致文件包含漏洞的原因之一)
启用方式:在终端里:
find / -name php.ini
修改apache2下的:
vim /etc/php/7.0/apache2.php.ini
找到allow_url_include=off,修改为on(默认为off),
然后Ctrl+C后,:wq保存并退出
再重启apache服务:
service apache2 restart
cd一步步进入,最后 /var/www/html/dvwa/vulnerabilities/fi
ls一下就可以看到三个文件了
(没有啥加固措施)
包含本地的文件,也就是包含目标主机的文件
low级别的源码:直接file接收page参数,page传啥显示啥
漏洞利用:将url里的include.php换成/etc/shells(kali上的shells,实现本地包含),把操作系统的shell值显示出来
(或者这种利用方式:在url里/etc/password
:把网站操作系统的用户给列出来(很危险))
验证漏洞被利用(显示出来的值是正确的):终端里 # cat /etc/shells
,里面的东西出来了
(/etc/shells是绝对路径)
(cat file1.php可以查看文件内容)
(cd / 直接进入根目录)
被包含的文件在第三方服务
(2.1)初步准备,建一个网站,以便远程文件包含
进入根目录:cd /var/www/html
建个网站fit:mkdir fit
ls
下发现有fit目录
进入fit:cd fit
,
ls
发现啥也没有(因为自己没有加东西)
vim f1.txt
在里面写些内容,保存退出:wq
(2.2)在浏览器访问网站:
在kali虚拟机上:http://127.0.0.1/fit/f1.txt
发现可以访问f1.txt 的内容,
在DVWA的low安全下,将file=后面的改为http://127.0.0.1/fit/f1.txt,发现可以访问到f1.txt的内容,
这种情况下,如果是将一串恶意代码写入f1.txt,此时也会被执行
(加固措施:使用str_replace()函数,过滤了远程文件包含(http://,https://)和本地文件包含的相对路径,但是,绝对路径没有过滤掉)
解决方式:远程文件包含就双写http;本地文件包含就使用绝对路径或者双写绕过相对路径
(绝对路径:/var/www/html/dvwa/php.ini
相对路径:…/…/…/dvwa/php.ini 没有固定几个“’…/”如果没写对,继续加,在low下试试是几个)
(3.1)本地文件包含
page=后面加相对路劲 发现相对路径被过滤掉了
page=后加上绝对路径 没有被过滤
(3.2)远程文件包含
绝对路径的双写绕过:page=hthttp://tp://127.0.0.1/file.txt
因为http://被过滤了,于是把"http://"插入一个http里(“http://”被过滤,就留下一个http,而且输入的不是http://,不会被过滤,成功绕过http了!)
相对路径的双写绕过:page=…/./…/./…/./dvwa/php.ini(把…/给过滤掉之后,是…/…/…/dvwa/php.ini)
(加固措施:fnmatch()函数,文件名必须以file开头,而且不包含include.php)
解决方式:使用file:///,同时文件路径不是include.php(只要file协议里要包含的文件不是include.php就可以)
(4.1)file协议(本地文件传输协议):用于访问本地计算机中的文件,
语法: scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]
打开C盘的东西就是:file:///c:/.....
,在“我的电脑”里这个file:///没有写出来,但是它使用的就是file协议
Windows下:比如在某个浏览器的URL栏输入:
file:///D:
这样就可以在浏览器的页面里呈现自己主机里D盘下的文件啦
Linux下:比如file:///var/www/html/dvwa/php.ini
(4.2)fnmatch 匹配文件名或路径名
比如fnmatch(“file”,$file),输入配置里的文件名要以file开头
page=后面改成file:///var/www/html/dvwa/php.ini (这样就是以file开头并且打开自己想要打开的文件)
(find / -name php.ini 可以在根目录下寻找php.ini 文件)
其他加固的方法:指定包含的文件 的名字
phpStudy2018
启动,搭建一个Web服务器 ,打开,
Cknife和菜刀功能一样,没有后门,菜刀常常被爆后门
(有机会搭建一个nginx服务器)
第一步:将一句话木马写入url,
错误日志里写入木马
第二步:/var/log/nginx/error.log
包含错误日志
第三部打开c刀,模拟终端里输入命令
文件包含漏洞
菜刀可以直接连接,也就是说不管后缀是什么样,最后都会以php的形式执行
源代码显示自动在最后加后缀".php"的情况
使用 %00截断 (直接在url最后加%00,就可以截断那个自动添加的后缀)
(好像也可以加 ? )
读取的是base64编码的:
由于XXE漏洞的特殊性,我们在读取HTML、PHP等文件时可能会抛出此类错误parser error : StartTag: invalid element name,可能这是远程文件名不能为php后缀的原因
远程的文件名不能为php可解析的扩展名(php、php5…),而且php.ini中allow_url_fopen和allow_url_include为On才可以。
http://blog.51cto.com/tdcqvip/1958654
read=convert.base64-encode(看下面的例子)
php://filter读取本包含漏洞脚本的源码
修改url,使用base64编码:
file=php://filter/read=convert.base64-encode/resource=index.php
然后就可以得到flag啦
下面摘自大佬的笔记:php://filter的妙用
为了读取包含有敏感信息的PHP等源文件,我们就要先将“可能引发冲突的PHP代码”编码一遍,这里就会用到php://filter
将POST内容转换成base64编码并输出:
readfile(“php://filter/read=convert.base64-encode/resource=php://input”);
大佬的笔记里有个不管输入什么都不会执行的死亡exit例子,很值得看