解析漏洞和文件包含漏洞都是服务于文件上传漏洞,大部分来讲,没有文件上传漏洞,文件包含漏洞也没用。对于一部分文件上传漏洞,没有文件包含漏洞或者解析漏洞也没法运行。(隔着说废话)
废话文学真好玩。
其实都是为了文件上传的白名单绕过做的
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 方式执行。
老版本服务器了,开发语句一般为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默认是以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文件执行
建议搞白名单
只要在该文件路径下面,后面解析 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目录下
将一句话木马写入日志文件中
然后用本地包含漏洞,执行这个日记文件page=../../../../Apache-20\logs\access.log()
读取的是当前目录下的文件,需要知道当前目录下文件名
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读取的文件名
构造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)
函数代码如下
```
// 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:`
代码
这种方法只适合于magic_quotes_gpc=off的时候, php版本小于5.3.4,可通过%00截断绕过(基本上没有)
放弃吧
代码
为什么我不在前面用file解析呢
本地文件page=file:///C:/xampp/htdocs/dvwa/php.ini