如果想看图片和观感更好的话,可以直接去我的github或者gitbook
github:https://github.com/kakaandhanhan/cybersecurity_knowledge_book-gitbook.22kaka.fun
gitbook:http://22kaka.fun
在PHP语法篇的10.文件里面我们讲了include和require和include_one和require_one这些,如果大家忘记了,可以返回去看看。
{% content-ref url=“…/rce-yuan-cheng-dai-ma-zhi-hang/php-yu-fa.md” %}
php-yu-fa.md
{% endcontent-ref %}
其实我看到老师写的书上也还在说这个,但是我看官方手册上面allow_url_include自php7.4就废除了,还发现就算是再新的书都有一定的滞后性,大家还是以手册为主。虽然废除了,但是我们还是讲解这两个在php.ini配置文件中的作用
这个选项允许include,require,include_one和require四个函数的使用。
{% hint style=“info” %}
这个设置项需要开启 allow_url_fopen 。
{% endhint %}
本选项激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象例如文件。默认的封装协议提供用 ftp 和 http 协议来访问。
我们在RCE漏洞知识点总结的5.php伪协议里面讲了php伪协议,忘记了也可以去看看
{% content-ref url=“…/rce-yuan-cheng-dai-ma-zhi-hang/rce-lou-dong-zhi-shi-dian-zong-jie.md” %}
rce-lou-dong-zhi-shi-dian-zong-jie.md
{% endcontent-ref %}
{% hint style=“info” %}
这里总结一下四个主要的协议是用在哪些方面。
1.php://filter 主要用于读取源码
2.php://input 经常使用file_get_contents获取php://input内容
3.data:// 执行命令
4.file:// 访问本地文件系统
{% endhint %}
在有以上的知识的基础上我们要介绍这个FL漏洞了。主要是分为本地文件包含漏洞和远程文件包含漏洞。
本地文件包含漏洞是指能打开并且包含本地文件的漏洞,大部分都是这个漏洞。不受allow_url_fopen和allow_url_include的影响
远程文件包含漏洞是指能够包含远程的文件并且执行他们,这个远程是我们可控的,所以危害较大,并且要求allow_url_fopen和allow_url_include都打开为on才能够执行。
这里主要是要进行目录穿越或者是遍历任意文件时用到,虽然有很多,但是也不知道有用没用,都积累一下吧。
linux下:
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件
windows下
c:\boot.ini // 查看系统版本
c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
c:\windows\repair\sam // 存储Windows系统初次安装的密码
c:\ProgramFiles\mysql\my.ini // MySQL配置
c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
c:\windows\php.ini // php 配置信息
在开头我们也放了php伪协议,虽然有相同的运用之处,但是也有一些差别,我们会专门就这个漏洞再来补充他们在这个漏洞的用法。有些不怎么要用或者之前已经详细讲过的就直接跳过去了。
访问本地文件系统。
条件:无要求
姿势:
http://*********.php/?file=file://C:/Windows/win.ini
可以直接读取到POST上没有经过解析的原始数据。我们之前提到过,input后面可以加上post的body执行php代码。
{% hint style=“warning” %}
enctype="multipart/form-data"
的时候 php://input
是无效的。
{% endhint %}
条件:
姿势:
http://*******.php/?file=php://input
/*[post]
*/
后面的注释的php代码需要通过post传递。
{% hint style=“info” %}
当出现file_get_contents函数时,我们就要想到用php://input了
{% endhint %}
http://******.php/?file=php://input
/*[post]
*/
http://******.php/?file=php://input
/*[post]
');?>*/
解释一下上面的php语句吧。可能因为之前没有见到过可能不太理解。这里了解两个函数之后就容易理解了,就是后面的木马代码是写入到前面fopen打开的文件里面的。
fputs()/fwrite():写入文件
并且是把data写入到scream里面。
fwrite(resource $stream, string $data, ?int $length = null): int|false
fopen():打开文件或者url。
filename可以是文件,可以是url。
fopen(string $filename, string $mode,bool $use_include_path = false,?resource $context = null ): resource|false
并且模式和c语言打开文件一样这里贴张图大家看吧
这个之前就讲的详细了,没啥好补充的。
这个之前没讲过,但是在这里要用到,补充一下。
是php解压缩包的协议,并且不管后面是什么都会解压缩,无差别平等攻击
要求:
姿势:
写一个php代码比如,然后打包成zip压缩模式的压缩包
{% hint style=“danger” %}
注意,这个压缩模式必须是zip,不能是7zip,rar这种。此外,压缩包的后缀名可以不一定是zip,还可以是111,222,txt都可以。
{% endhint %}
然后指定绝对目录
http://localhost:3000/study.php?file=phar://F:\php%20code\1.zip\1.php
当然相对目录也可以
http://localhost:3000/study.php?file=phar://1.zip/1.php
只要把php代码修改一下变成执行命令的语句就可以,其他都不变,这里就不测试了因为步骤都是一样的
同理
和上面的phar()的作用是一样的,就是用法不一样。我们直接说区别了其他都是一样的。他们的区别主要是在路径上。
{% hint style=“danger” %}
zip://只能用绝对路径不能用相对路径。
{% endhint %}
并且压缩文件包和压缩文件之间要用#连接,并且这个#得经过url编码,也就是%23。
http://localhost:3000/study.php?file=phar://F:\php%20code\1.zip%231.php
就是之前的两句话之前已经很详细地说了。
首先我们先介绍一下session是什么
session简单理解就是会话。打个生动的比喻,session是位于服务器端的保险柜。比如我们去健身的时候,前台小姐姐会给我们一把钥匙和与它对应的保险柜,我们从开始健身到最后离开健身房就是一个会话,途中可能会去买瓶水放到保险柜里,或者从保险柜里拿个换洗衣物之类的,都是这个中间产生的数据,保险柜记录了我们产生的数据。
条件:
如果要使用包含session,那么我们需要知道session的路径并且他的内容部分是我们可控的。
姿势:
我们可以查看phpinfo()文件里面的session的路径存放处,在session下面的session_save_path
可以看到我的是/var/lib/php/sessions
{% hint style=“info” %}
第二竖排是local value(局部变量),第三竖排是master value(主变量),local value会覆盖master value。所以我们看第二竖排
{% endhint %}
/var/lib/php/sess_PHPSESSID
/var/lib/php/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID
我的session就位于/var/lib/php/sessions下。
sessions目录下的文件的命名是sess_[phpsessid]。而phpsessid是我们的cookie里面可以看到的,我们甚至可以控制cookie中的phpsessid的值。然后发