请选择 进入手机版 | 继续访问电脑版

专注代码检测 - 阅镜

 找回密码
 立即注册
热搜: 安装 代码
查看: 135|回复: 1

避免路径穿越问题

[复制链接]

70

主题

70

帖子

232

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
232
发表于 2021-9-10 20:11:27 | 显示全部楼层 |阅读模式
在进行文件操作时,需要判断外部传入的文件名是否合法,如果文件名中包含  ../  等特殊字符,则会造成路径穿越,导致任意文件的读写。

错误:
  1. void Foo() {
  2.   char file_path[PATH_MAX] = "/home/user/code/";
  3.   // 如果传入的文件名包含../可导致路径穿越
  4.   // 例如"../file.txt",则可以读取到上层目录的file.txt文件
  5.   char name[20] = "../file.txt";
  6.   memcpy(file_path + strlen(file_path), name, sizeof(name));
  7.   int fd = open(file_path, O_RDONLY);
  8.   if (fd != -1) {
  9.     char data[100] = {0};
  10.     int num = 0;
  11.     memset(data, 0, sizeof(data));
  12.     num = read(fd, data, sizeof(data));
  13.     if (num > 0) {
  14.       write(STDOUT_FILENO, data, num);
  15.     }
  16.     close(fd);
  17.   }
  18. }
复制代码

正确:
  1. void Foo() {
  2.   char file_path[PATH_MAX] = "/home/user/code/";
  3.   char name[20] = "../file.txt";
  4.   // 判断传入的文件名是否非法,例如"../file.txt"中包含非法字符../,直接返回
  5.   if (strstr(name, "..") != NULL){
  6.     // 包含非法字符
  7.     return;
  8.   }
  9.   memcpy(file_path + strlen(file_path), name, sizeof(name));
  10.   int fd = open(file_path, O_RDONLY);
  11.   if (fd != -1) {
  12.     char data[100] = {0};
  13.     int num = 0;
  14.     memset(data, 0, sizeof(data));
  15.     num = read(fd, data, sizeof(data));
  16.     if (num > 0) {
  17.       write(STDOUT_FILENO, data, num);
  18.     }
  19.     close(fd);
  20.    }
  21. }
复制代码

关联漏洞:
  1. 高风险-逻辑漏洞
复制代码

回复

使用道具 举报

匿名  发表于 2021-12-9 18:44:24
不管是liunx还是windows都允许文件名中包含‘..’例如 1..1.txt,直接找到‘..’就返回这种方式是不正确的,它会导致合法的文件名无法被操作。
回复

使用道具

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

QQ|Archiver|手机版|小黑屋| 阅镜 ( 京ICP备2020034574号 )|网站地图|网站地图点击这里给我发消息

GMT+8, 2022-1-17 09:14 , Processed in 0.050559 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表