0

我有一个简单的 C Wrapper 程序来在提升的上下文中运行 bash 脚本。它位于 FastCGI 包装器后面,并允许一些服务挂钩调用我的 C 程序,然后它将以 root 身份运行我的 bash 脚本。我很清楚安全问题,我的 Web 服务器只允许单个 IP 地址调用 CGI-BIN 脚本。我拥有两台机器,因此几乎没有安全风险。我是一个完整的菜鸟 C 并且已经从互联网上复制了一个片段。

到目前为止,这工作正常:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   setuid( 0 );
   return system( "./myscript.sh" );
}

但是我的程序现在需要从 FastCGI 获取 POST 数据。CGI 规范说它通过 STDIN 传递所有原始 POST 数据。我想要的是能够直接将原始 POST 数据从我的 C 程序/包装器的 STDIN 传输到我的脚本中。我尝试了以下方法,但没有奏效:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   setuid( 0 );
   dup2(1, 0);
   return system( "./myscript.sh" );
}

该脚本在使用普通管道(例如echo "Hey" | ./myscript.sh)时工作得非常好,但是我不知道如何将我的 C 程序的 STDIN 管道传输到我的脚本的 STDIN。

4

2 回答 2

0

扩展 Barmar 上面的评论。这是您修改后的 C 程序:

/* foo.c*/

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   setuid( 0 );       
   return system( "wc -l");
}

wc -l命令将等待来自您的 STDIN 的输入。

现在,编译并运行上述程序。您会看到它在等待输入,当您使用 Ctrl + D 结束输入时,您会看到它打印出行数:

/tmp> ./foo 
Hello world
This is an input
2
于 2013-11-10T04:22:03.870 回答
0

试试这个在标准输入的末尾添加一个换行符:

int main()
{
   setuid( 0 );
   return system( "(cat; echo '') | ./myscript.sh" );
}
于 2013-11-10T04:57:48.397 回答