【web安全】目录遍历攻击学习与防范


原文: 什么是目录遍历攻击? (acunetix.com)

1.目录遍历攻击是什么

  • 目录遍历或者路径遍历是一种HTTP攻击,允许攻击者访问受限制的目录并在web服务器的根目录【放网站的目录】之外执行命令。

  • 如果系统受到了目录遍历攻击,攻击者可以利用此漏洞跳出根目录,并访问非web文件夹的其他文件部分,查看到大量本应该受限制的文件,从而为攻击者提供进一步危害系统所需要的更多信息。

  • 以微软的IIS举例,用户本不应该有权限访问到wwwroot以上或者同级的其他内容,如果发起了目录遍历攻击,攻击者就可以访问包括下面的mysql、php等其他文件部分。【我们也可以说www目录之所以存在,就是为了防范目录遍历攻击】在这里插入图片描述

2.目录遍历攻击如何实现

两个步骤:

  1. 测试检索文件和检索参数

    攻击者尝试发送这样一个url,成功返回了oldarchive.html后,攻击者就知道show.asp文件是可以通过web服务器的文件系统进行查询找到view参数后面的文件的。【需要攻击者不断测试网站拥有的请求和响应,找到正确的查询文件脚本和查询参数】

GET http://test.webarticles.com/show.asp?view=oldarchive.html HTTP/1.1
Host: test.webarticles.com

​ ps:show.asp是微软IIS特有的,也可以理解成java的show.jsp,是一个动态页面,在服务端有能查询文件的功能。

  1. 恶意参数注入

    攻击者通过不断测试去修改参数,以不断往上翻高层目录可以找到windows所在的位置,进行恶意攻击

GET http://test.webarticles.com/show.asp?view=../../../../../Windows/system.ini HTTP/1.1
Host: test.webarticles.com

在旧版本的IIS或者Apache中,这些服务器组件本身也有可能受到目录遍历的攻击,当然在新版本里很早就修复了该漏洞。例如,利用 IIS 的脚本目录遍历目录并执行命令的 URL 请求可以是

GET http://server.com/scripts/..%5c../Windows/System32/cmd.exe?/c+dir+c:\ HTTP/1.1
Host: server.com

解释:
1.访问到允许用户访问的scripts文件夹,通过注入字符%5c【%5c是'/'的编码】来操纵进入高层目录
2.也就是../../windows进入到了windows文件夹。
3.服务端误认为是访问 '/scripts/xxx' 文件,把后面'..%5c../Windows/System32/cmd.exe?/c+dir+c:\' 当做了文件名 xxx 交给了文件系统
4.也就是本应该把'/scripts/xxx' 交给文件系统的,结果却把'/scripts/..%5c../Windows/System32/cmd.exe?/c+dir+c:\'提交给了文件系统
5.那文件系统肯定是直接执行的,也就是直接进入/scripts/..%5c../Windows/System32/cmd.exe命令行了,并且对该命令行提供了 /c+dir+c:\ 的参数,找到了c盘的文件列表

该请求将通过执行命令cmd文件并在cmd中运行命令,将目录中所有文件的列表返回给用户。URL 请求中的表达式是 Web 服务器转义代码,用于表示普通字符,比如这个%5c 和后面的 \c【‘/’ 的 编码就是%5c】

较新版本的现代Web服务器软件检查这些转义码,不要让它们通过。但是,某些较旧的版本不会在根目录执行程序中过滤掉这些代码,而是允许攻击者执行此类命令。

但是对于网站代码本身,就需要开发者人工进行安全干预和防范。

3.如何防御目录遍历攻击

  • 确保web服务器软件版本最新,并且已经安装所有补丁

  • 有效过滤任何用户输入,防范参数中的转义字符,通过utf8编码后只要发现参数包含可能引发目录遍历攻击的非法字符,直接拒绝请求,如果合法再将用户输入提交到服务器。

  • 确保权限控制到位,谨慎处理传向文件系统API的参数【与第二点差不多】

  • 对文件类型进行白名单控制【只允许请求html文件、css文件、js文件等这些】,对包含恶意字符或者空字符的参数进行拒绝。【windows现在已知的文件名非法字符有 \ / : * ? " < > | 】【 linux文件名非法字符 "/ " 】

  • 当然,如有需要,使用全面的web漏洞扫描,把网站安全可能涉及的各种漏洞都进行检查。

总结为一句话:不要信任任何用户的任何输入。对任何输入都要规范化检查与处理。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个Web安全攻击防范的代码示例,其中包括了一些常见的防范措施: 1. 输入数据的过滤和验证 ``` $username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING); $password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING); if (!empty($username) && !empty($password)) { // 进行后续操作 } else { // 输入数据不合法,进行错误处理 } ``` 2. 数据库操作的权限控制 ``` // 用户登录验证 function login($username, $password) { $conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); // 防止SQL注入攻击 $username = mysqli_real_escape_string($conn, $username); $password = mysqli_real_escape_string($conn, $password); $query = "SELECT * FROM users WHERE username='$username' AND password='$password'"; $result = mysqli_query($conn, $query); if (mysqli_num_rows($result) > 0) { // 用户登录成功 } else { // 用户登录失败 } mysqli_close($conn); } ``` 3. 使用预编译语句和存储过程 ``` // 插入数据的操作 $stmt = $conn->prepare("INSERT INTO users (username, password) VALUES (?, ?)"); $stmt->bind_param("ss", $username, $password); $username = "test"; $password = "123456"; $stmt->execute(); $stmt->close(); ``` 4. 数据库安全配置 ``` // 禁止root用户远程登录 GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEGES; ``` 以上是一个Web安全攻击防范的代码示例,具体的实现要根据你的实际情况进行调整和完善。希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值