W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
在進行文件操作時,需要判斷外部傳入的文件名是否合法,如果文件名中包含 ../
等特殊字符,則會造成路徑穿越,導致任意文件的讀寫。
錯誤:
void Foo() {
char file_path[PATH_MAX] = "/home/user/code/";
// 如果傳入的文件名包含../可導致路徑穿越
// 例如"../file.txt",則可以讀取到上層目錄的file.txt文件
char name[20] = "../file.txt";
memcpy(file_path + strlen(file_path), name, sizeof(name));
int fd = open(file_path, O_RDONLY);
if (fd != -1) {
char data[100] = {0};
int num = 0;
memset(data, 0, sizeof(data));
num = read(fd, data, sizeof(data));
if (num > 0) {
write(STDOUT_FILENO, data, num);
}
close(fd);
}
}
正確:
void Foo() {
char file_path[PATH_MAX] = "/home/user/code/";
char name[20] = "../file.txt";
// 判斷傳入的文件名是否非法,例如"../file.txt"中包含非法字符../,直接返回
if (strstr(name, "..") != NULL){
// 包含非法字符
return;
}
memcpy(file_path + strlen(file_path), name, sizeof(name));
int fd = open(file_path, O_RDONLY);
if (fd != -1) {
char data[100] = {0};
int num = 0;
memset(data, 0, sizeof(data));
num = read(fd, data, sizeof(data));
if (num > 0) {
write(STDOUT_FILENO, data, num);
}
close(fd);
}
}
關聯(lián)漏洞:
高風險-邏輯漏洞
在程序中,使用相對路徑可能導致一些安全風險,例如DLL、EXE劫持等問題。
例如以下代碼,可能存在劫持問題:
int Foo() {
// 傳入的是dll文件名,如果當前目錄下被寫入了惡意的同名dll,則可能導致dll劫持
HINSTANCE hinst = ::LoadLibrary("dll_nolib.dll");
if (hinst != NULL) {
cout<<"dll loaded!" << endl;
}
return 0;
}
針對DLL劫持的安全編碼的規(guī)范:
1)調用LoadLibrary,LoadLibraryEx,CreateProcess,ShellExecute等進行模塊加載的函數(shù)時,指明模塊的完整(全)路徑,禁止使用相對路徑,這樣就可避免從其它目錄加載DLL。 2)在應用程序的開頭調用SetDllDirectory(TEXT("")); 從而將當前目錄從DLL的搜索列表中刪除。結合SetDefaultDllDirectories,AddDllDirectory,RemoveDllDirectory這幾個API配合使用,可以有效的規(guī)避DLL劫持問題。這些API只能在打了KB2533623補丁的Windows7,2008上使用。
關聯(lián)漏洞:
中風險-邏輯漏洞
在創(chuàng)建文件時,需要根據(jù)文件的敏感級別設置不同的訪問權限,以防止敏感數(shù)據(jù)被其他惡意程序讀取或寫入。
錯誤:
int Foo() {
// 不要設置為777權限,以防止被其他惡意程序操作
if (creat("file.txt", 0777) < 0) {
printf("文件創(chuàng)建失敗!\n");
} else {
printf("文件創(chuàng)建成功!\n");
}
return 0;
}
關聯(lián)漏洞:
中風險-邏輯漏洞
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: