我知道如果你覆盖PATH变量,你可以调用system("ls");
这样的调用。
但是当用户没有system("/bin/ls");
的写入权限时,如何绕过/bin /ls
的来电?
请不要告诉我这不兼容OS,我知道这不是问题的关键。
谢谢!
答案 0 :(得分:2)
这会导致类似:
execve("/bin/sh", ["sh", "-c", "/bin/ls"], [/* 66 vars */]) = 0
因此没有太大的回旋余地,虽然可以创建一个function /bin/ls { ... }
,但上面的调用似乎是sh
实际上是bash
bash
不读取rc文件,并且不调用该函数。
$ /bin/ls
hello world
$ type -a /bin/ls
/bin/ls is a function
/bin/ls ()
{
echo hello world
}
/bin/ls is /bin/ls
$ cat dols.c
#include <stdlib.h>
int main(void)
{
system("/bin/ls");
return 0;
}
$ ./dols
dols dols.c trace.9594 trace.9595
$
除了环境攻击(例如通过ls
变量使LD_
与其他库链接)或shell冲击类漏洞(例如sh
本身中的错误),这可能是好的。 (如果有人不了解这些问题然后编辑成代码是不安全的shell命令,那就不行了......)
答案 1 :(得分:0)
用户可以将ls
和/bin/ls
定义为函数。
使用...
ls () { echo 'No.'; }
和...
/bin/ls () { echo 'NO!'; }
但是,您可以在执行ls
和/bin/ls
之前取消设置,以防止这种情况发生......
使用...
unset -f ls /bin/ls