关于SHFileOperation函数的另类思考!!!!

huabihan 2004-10-18 04:18:21
微软的文件夹有一个系统漏洞,例如你可以在dos下建个带“\”文件夹,md test..\
,而这个文件夹在windows下是无法打开和删除的,在用SHFileOperation函数的时候可以把一个正常的文件改名为那个非法的文件名,如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char Path[256];
char topath[256];
SHFILEOPSTRUCT sfo;
memset(&sfo, 0, sizeof(sfo));
memset(Path, 0, sizeof(Path));
memset(topath,0,sizeof(topath));
strcpy(Path, "D:\\test");
strcpy(topath,"D:\\test..\");
sfo.wFunc = FO_RENAME;
sfo.pFrom = Path;
sfo.pTo = topath;
sfo.fFlags=FOF_NOCONFIRMATION;
SHFileOperation(&sfo);
}
可是当把
strcpy(Path, "D:\\test");
strcpy(topath,"D:\\test..\");
改为
strcpy(topath,"D:\\test..\");
strcpy(Path, "D:\\test");
时候却无法更改,也就是说执行这个函数的时候会对源文件名的合法性进行检查,而对目标文件名的时候却不检查???
或者有其他的什么???希望大家讨论讨论???


...全文
192 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
redlei 2004-11-01
  • 打赏
  • 举报
回复
我想是因为字符串的/0的问题
最后一个字符是\0
而你的最后一句是\\0就是“\0“了
你明白我的意思吗?
就是你的这个字符串没有结束标志了
而strcpy就是以\0结束的
所以必然会出问题
蒋晟 2004-10-27
  • 打赏
  • 举报
回复
Windows 2000 SP4下测试未通过
huabihan 2004-10-27
  • 打赏
  • 举报
回复
不会吧,我的2000 sp4都能通过,SHFileOperation这个函数执行的时候到底过程使怎么样的?有没有人知道??
wenyongjie 2004-10-26
  • 打赏
  • 举报
回复
关注
progray 2004-10-22
  • 打赏
  • 举报
回复
该漏洞,很久我就知道了,绿盟,安焦都有。
Behard 2004-10-19
  • 打赏
  • 举报
回复
这样都可以?
huabihan 2004-10-19
  • 打赏
  • 举报
回复
对,上面的漏了一个“\"号,
md test..\之后,如果有test文件夹,可以打开这个新建的test.\文件夹,不过文件夹的内容是test中的文件,也就是说你访问的对象是test,不是新建的test.\文件夹,
假如你在 md test...\文件夹,你访问这个文件的时候,实际上打开的是test.\文件夹,而不是新建的test..\文件夹!!
不过对里面的文件无法运行,可以删除,复制等~!!

有没有哪位可以用函数的形式可以把那个非法文件夹改名回去啊???
weixing979 2004-10-18
  • 打赏
  • 举报
回复
呵呵,看一看
myy 2004-10-18
  • 打赏
  • 举报
回复
这个漏洞可以好好利用一下,嘿嘿......
myy 2004-10-18
  • 打赏
  • 举报
回复
试了一下:

md test..\ 建立(或用象楼主那样用SHFileOperation改名现有的)的文件夹

可以用Dos命令:

copy 文件到里面
type 显示里面的文件内容
rd 没有文件时,可以删除
不能用 del ,dir , cd,deltree 等命令操作文件夹或里面的文件。

用程序的话,可以用正常访问、读写里面的文件,不能用SHFileOperation函数
删除和改名文件夹,但可以用DeleteFile函数删除里面的文件,删除全部文件后,
可以用dos命令 rd 删除文件夹。
myy 2004-10-18
  • 打赏
  • 举报
回复
改回去 可能是你写错了吧,:

strcpy(topath,"D:\\test..\"); //这样应该编译都通不过的。
strcpy(topath,"D:\\test..\\"); //这样试试看
strcpy(Path, "D:\\test");
huabihan 2004-10-18
  • 打赏
  • 举报
回复
对啊,是可以用rd删除的~!那个api函数执行这个文件的时候怎么为什么不能直接改回去呢???
dos下没有重命名文件夹的功能!!!
constantine 2004-10-18
  • 打赏
  • 举报
回复
居然有这种事
xrdsheng 2004-10-18
  • 打赏
  • 举报
回复
有意思
COKING 2004-10-18
  • 打赏
  • 举报
回复
不错!!
myy 2004-10-18
  • 打赏
  • 举报
回复
我倒,真的是个漏洞哦,不过md test..\建立后,可以用rd test..\ 删除。

strcpy(topath,"D:\\test..\\"); 不知行不行。

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧