我有这种C代码,第一次输入后,如果我输入一个大字符串,最后后面的字符在我的Linux Shell中作为命令执行,它可以用于命令注入(inject),正如我发现的那样() 函数是发生这种情况的主要原因,但不明白为什么,val
只是一个 int:
if (val > 0) {
struct in_addr *addr;
int addrMultVal = val*sizeof(*addr);
char *buf2 = malloc(addrMultVal);
for (i = 0; i < val; i++) {
if (read(0, buf2, sizeof(*addr)) < 0) {
return 0;
}
}
done = 1;
}
最佳答案
您的addrMultVal
变量必须计算addr类型的大小,然后您必须sizeof(*addr)
您的代码 sizeof(addr)
返回指针的大小,可能是 4。
另请注意,read()
不会添加 '\0'
来终止以使其成为字符串(仅提供原始缓冲区)。
关于C 函数 read() 导致命令注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30640086/