黄小民 發表於 2021-3-1 15:17:00

PHP文件包含总结

<h2 id="1文件包含小知识">1.文件包含小知识</h2>
<h3 id="11-包含函数">1.1 包含函数</h3>
<ol>
<li>PHP共有4个与文件包含相关的函数:</li>
</ol>
<p>include</p>
<p>require</p>
<p>include_once</p>
<p>require_once</p>
<ol start="2">
<li>include与include_once的区别:</li>
</ol>
<p>(1)include:会将指定的文件载入并执行里面的程序;重复引用的情况下加载多次。</p>
<p>例如:<br>
<img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301144423822-1623323397.png" alt="" loading="lazy"></p>
<pre><code>这里include两次1.php文件,所以就会包含1.php两次。
</code></pre>
<p>(2)Include_once:会将指定的文件载入并执行里面的程序;此行为和include语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。</p>
<p>例如:<br>
<img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301144442366-268821498.png" alt="" loading="lazy"></p>
<pre><code>这里include_once了两次1.php文件,但只会包含1.php一次。
</code></pre>
<p>(3)require和requireonce的用途与上面两个一样,但区别就是require和requireonce会加载页面最开始执行。Include和include_once会按代码顺序执行。</p>
<h3 id="12-支持的协议和封装协议">1.2 支持的协议和封装协议</h3>
<pre><code class="language-bash">file:// ------访问本地文件系统
http(s):// ------访问HTTP(s)网址
ftp:// ------访问FTP(s) URLs
php:// ------访问各个输入/输出流(I/O streams)
zlib:// ------压缩流
data:// ------数据(RFC 2397)
glob:// ------查找匹配的文件路径模式
phar:// ------PHP归档
ssh2:// ------Secure Shell 2
rar:// ------RAR
ogg:// ------音频流
expect:// ------处理交互式的流
</code></pre>
<h3 id="13-常用伪协议">1.3 常用伪协议</h3>
<ol>
<li>file://</li>
</ol>
<p>(1)这个协议可以展现本地文件系统,默认目录是当前的工作目录。</p>
<p>(2)例如:file:///etc/passwd、file://key.txt</p>
<ol start="2">
<li>php://</li>
</ol>
<p>(1) php://input是个可以访问请求的原始数据的只读流,可以访问请求的原始数据的只读流,将post请求中的数据作为php代码执行。</p>
<p>(2) php://filter是一种元封装器,设计用于数据流打开时的筛选过滤应用。</p>
<p><img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301144959731-1213368091.jpg" alt="" loading="lazy"></p>
<ol start="3">
<li>phar://</li>
</ol>
<p>(1)phar://数据流包装器自PHP5.3.0起开始有效</p>
<p>(2)例如:phar://E:/phpstudy/www/1.zip/phpinfo.txt    |   phar://1.zip/phpinfo.txt</p>
<h3 id="14-伪协议利用方式小总结">1.4 伪协议利用方式小总结</h3>
<p><img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301145053433-142533030.png" alt="" loading="lazy"></p>
<h2 id="2getshell总结">2.getshell总结</h2>
<h3 id="21-getshell之session">2.1 Getshell之session</h3>
<p>条件:session文件路径已知,且session文件中内容部分可控。</p>
<p>获取session文件路径:</p>
<ol>
<li>session文件的保存路径可以在phpinfo的session.save_path看到。</li>
</ol>
<p><img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301145127921-360207917.png" alt="" loading="lazy"></p>
<ol start="2">
<li>
<p>默认路径:</p>
<p>/var/lib/php/sess_PHPSESSID</p>
<p>/var/lib/php/sess_PHPSESSID</p>
<p>/tmp/sess_PHPSESSID</p>
<p>/tmp/sessions/sess_PHPSESSID</p>
<p>session的文件名格式为sess_。而phpsessid在发送的请求的cookie字段中可以看到</p>
</li>
</ol>
<p><img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301145234426-218072664.png" alt="" loading="lazy"></p>
<p>利用:</p>
<p>1.要包含并利用的话,需要能控制部分sesssion文件的内容。可以先包含进session文件,观察里面的内容,然后根据里面的字段来发现可控的变量,从而利用变量来写入payload,并之后再次包含从而执行php代码。</p>
<p>2.例如现在有一个session.php可控用户会话信息值:<br>
<img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301145250013-1035389566.png" alt="" loading="lazy"></p>
<p>3.可以看到这个session.php文件中的用户会话信息username的值是用户可控制的,那我们就可以传入恶意代码进行攻击利用。<br>
<img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301145329334-1140245348.png" alt="" loading="lazy"></p>
<p>4.将恶意代码传入以后,接下来就要利用文件包含漏洞去包含这个恶意代码。<br>
<img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301150057968-1008996952.png" alt="" loading="lazy"></p>
<p>5.从返回结果来看,我们的payload和恶意代码已经正常解析和执行。</p>
<h3 id="22-getshell之日志">2.2 Getshell之日志</h3>
<h4 id="221-访问日志">2.2.1 访问日志</h4>
<p>条件:需要知道服务器日志的存储路径,且日志文件可读。</p>
<p>日志存储默认路径:</p>
<pre><code>1.apache+Linux日志默认路径:/etc/httpd/logs/accesslog或/var/log/httpd/accesslog

2.apache+win2003日志默认路径:D:\xampp\apache\logs\access.log、D:\xampp\apache\logs\error.log

3.IIS6.0+win2003默认日志文件:C:\WINDOWS\system32\Logfiles

4.IIS7.0+win2003 默认日志文件:%SystemDrive%\inetpub\logs\LogFiles

5.nginx 日志文件:日志文件在用户安装目录logs目录下,假设安装路径为/usr/local/nginx,那日志目录就是在/usr/local/nginx/logs下面
</code></pre>
<p>利用:</p>
<p>1.多数情况,web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log。默认情况下,日志保存路径在/etc/httpd/logs/下。</p>
<p>2.但如果是直接发起请求,会导致一些符号被编码使得包含无法正确解析。可以使用burp截包后修改。<br>
<img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301150156602-10238271.png" alt="" loading="lazy"><br>
3.正常的php代码已经写入了 /etc/httpd/logs/access.log。然后包含即可执行代码。<br>
<img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301150215595-2146712947.png" alt="" loading="lazy"><br>
4.但有的时候,log的存放地址会被更改。这个时候可以通过读取相应的配置文件后,再进行包含。</p>
<p>中间件默认配置文件存放路径:</p>
<pre><code>1.apache+linux 默认配置文件
      /etc/httpd/conf/httpd.conf或/etc/init.d/httpd

2. IIS6.0+win2003 配置文件
      C:/Windows/system32/inetsrv/metabase.xml

3. IIS7.0+WIN 配置文件
      C:\Windows\System32\inetsrv\config\applicationHost.config
</code></pre>
<h4 id="222-ssh-log">2.2.2 SSH log</h4>
<p>条件:需要知道ssh-log的位置,且可读。</p>
<p>ssh日志默认路径:</p>
<p>1./var/log/auth.log</p>
<p>2./var/log/secure</p>
<p>利用:</p>
<p>1.用ssh连接:</p>
<pre><code class="language-bash">ssh \'\&lt;?php phpinfo(); ?&gt;\'\@remotehost
</code></pre>
<p>之后会提示输入密码,随便输入就可以。</p>
<p><img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301150305460-102281792.png" alt="" loading="lazy"></p>
<p>2.然后利用文件包含,包含日志文件:</p>
<p><img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301150328353-279078270.png" alt="" loading="lazy"></p>
<h3 id="23-getshell之environ">2.3 Getshell之environ</h3>
<p>条件:</p>
<ol>
<li>
<p>php以cgi方式运行,这样environ才会保持UA头。</p>
</li>
<li>
<p>environ文件存储位置已知,且有权限访问environ文件。</p>
<p>environ文件默认位置:proc/self/environ</p>
</li>
</ol>
<p>利用:</p>
<ol>
<li>
<p>proc/self/environ中会保存user-agent头。如果在user-agent中插入php代码,则php代码会被写入到environ中。之后再包含它,即可。</p>
</li>
<li>
<p>例如我们现在访问一个网站,使用burpsuite抓包,将恶意代码插入到user-agent中。</p>
</li>
</ol>
<p><img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301150510603-1650244101.png" alt="" loading="lazy"></p>
<p>3.利用文件包含漏洞去包含proc/self/environ,成功执行php代码。</p>
<p><img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301150546254-271539052.png" alt="" loading="lazy"></p>
<h3 id="24-getshell之利用phpinfo">2.4 Getshell之利用phpinfo</h3>
<p>条件:</p>
<p>存在phpinfo页面并且存在文件包含漏洞</p>
<p>原理:</p>
<pre><code>1.当我们给PHP发送POST数据包时,如果数据包里包含文件区块,PHP就会将文件保存成一个临时文件,路径通常为:/tmp/php,这个临时文件,在请求结束后就会被删除。

2.因为phpinfo页面会将请求上下文中的所有变量打出来,所以我们如果向phpinfo页面发送包含文件区块的数据包,就可以在返回包里找到临时文件名,也就是\$_FILES变量中的内容。
</code></pre>
<p>利用:</p>
<ul>
<li>首先我们使用vulhub的脚本(https://github.com/vulhub/vulhub/blob/master/php/inclusion/exp.py),他可以实现包含临时文件,而这个临时文件的内容是:&lt;?php fileputcontents('/tmp/p','&lt;?=eval($_REQUEST)?&gt;')?&gt;。成功包含这个文件后就会生成新的文件/tmp/p,这个文件就会永久的留在目标机器上。<br>
<img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301150614735-2021525756.png" alt="" loading="lazy"></li>
<li>写入成功以后,我们利用文件包含来执行任意命令。<br>
<img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301150714743-837877210.png" alt="" loading="lazy"></li>
</ul>
<p>原理:</p>
<p>那么为什么vulhub的脚本是如何做到在临时脚本文件删除前去包含的呢,其实就是用到了条件竞争,具体流程大致如下:</p>
<pre><code>1.首先发送包含webshell的数据包给phpinfo页面,并用大量的垃圾数据将header和get等位置填满。

2.因phpinfo页面会将所有数据打印出来,第一个步骤中的垃圾数据就会将phpinfo页面撑的非常大。而php默认输出缓冲区大小为4096,也可以理解为php每次返回4096个字节给socket连接。

3.所以,这里直接操作原生socket,每次读取4096个字节。只要我们读取到字节里包含临时文件名,就立刻发送文件包含漏洞利用的数据包。因为第一个数据包的socket连接没有结束,所以临时文件还没有删除,我们就可以文件包含成功。
</code></pre>
<h3 id="25-getshell之上传文件">2.5 Getshell之上传文件</h3>
<p>条件:</p>
<p>有上传点,知道上传上去的文件名和存放目录。</p>
<p>利用:</p>
<ul>
<li>
<p>这里用一个靶场简单演示一下,找个文件上传点,上传一个带有php恶意代码的图片。<br>
<img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301150751491-513438128.png" alt="" loading="lazy"></p>
</li>
<li>
<p>我们现在已知文件名称和路径,可以利用文件包含漏洞去包含这个图片,就可以成功执行php代码了。<br>
<img src="https://img2020.cnblogs.com/blog/1449167/202103/1449167-20210301150806829-1436832257.png" alt="" loading="lazy"></p>
</li>
</ul>
<h2 id="3防护措施">3.防护措施</h2>
<p>1、在很多场景中都需要去包含web目录之外的文件,如果php配置了open_basedir,则会包含失败。</p>
<p>2、对可以包含的文件进行限制,可以采用白名单的方式,或设置可以包含的目录。</p>
<p>3、对危险字符进行过滤。</p>
<p>4、尽量不使用动态包含等等</p>
<p>Refer:https://mp.weixin.qq.com/s/IT6bbaG7zBbnrvcNPYr1_w</p>


</div>
<div id="MySignature" role="contentinfo">
    朋友可以背叛你,但技术和身材不会<br><br>
来源:https://www.cnblogs.com/zha0gongz1/p/14449520.html
頁: [1]
查看完整版本: PHP文件包含总结