在Apache下运行SUID C脚本

在Apache下运行SUID C脚本,c,linux,apache,suid,C,Linux,Apache,Suid,我有一个c语言的cgi脚本,如下所示: #include <stdio.h> #include <stdlib.h> #include <string> int main(void) { printf("Content-type: text/html\n\n"); printf("RUID : %d<br />\n", getuid()); printf("EUID : %d<br />\n", geteu

我有一个c语言的cgi脚本,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string>

int main(void) {

    printf("Content-type: text/html\n\n");

    printf("RUID : %d<br />\n", getuid());
    printf("EUID : %d<br />\n", geteuid());

    char ch;
    char getLine[256];
    char *token = NULL;
    FILE *ft;

    ft = fopen("/etc/shadow", "r");
    if(ft == NULL){
        printf("%s", "can not open file");
        exit(1);
    }
    while(1){
        ch=fgetc(ft);
        if(ch == EOF)
            break;
        else if(ch == '\n'){
            token = (char *)strtok(getLine, ":");
            printf("<b> fitst toke : %s</b><br />\n", token);
            if(strcmp(token,"root") == 0){
                token = (char *)strtok(NULL, ":");
                printf("password is : %s<br />\n", token);
                break;
            }
        } else{
            sprintf(getLine, "%s%c", getLine, ch);
        }
    }

  return 0;
}
如果在shell中运行此功能,则一切似乎都正常:

Content-type: text/html

RUID : 500<br />
EUID : 0<br />
<b> fitst toke : root</b><br />
password is : $1$aLRBTUSe$341xIb6AlUeOlrtRdWGY40<br />
内容类型:文本/html
RUID:500
EUID:0
第一节:根
密码为:$1$aLRBTUSe$341xib6aluelrtrdwgy40
但他说,若在apache和CGIBIN下运行它,就无法打开文件。虽然EUID看起来还不错:

RUID : 48<br />
EUID : 0<br />
can not open file
RUID:48
EUID:0
无法打开文件

谢谢

可以配置Apache,使其可以从chroot服务器上运行。在这种情况下,/etc/shadow将不可用


这个问题可以通过
setenforce 0
停止selinux stop来解决。

fopen()
失败后,尝试打印
errno
的值,看看问题是什么。错误打开文件:权限被拒绝。返回此代码:printf(“错误打开文件:%s\n”,strerror(errno));从安全的角度来看,这是一个非常愚蠢的想法。这个程序在开始它的进程之前,有一个来自远程服务器的令牌和其他授权解决方案的身份验证,与iptables中的固定ip和端口相同。在所有这些过程中,这段代码会有安全漏洞吗?不,我没有在chroot中安装apache。另外,如果我尝试读取/etc/passwd,则此代码段会成功运行。请让程序
stat()
读取该文件。如果失败,请打印错误号和字符串(
int errnum=errno;printf(“%d:%s
\n”,errnum,strerror(errnum));
,在它有机会更改之前捕获
errno
。如果
stat()
成功,我会有点惊讶;但是,您应该打印文件的所有者、组、大小和模式。另一种方法是,如果文件位于NFS挂载的文件系统上,
root
无法访问文件。然而,
/etc
极不可能挂载在NFS上。您可能会遇到一些“问题”ues',但跟踪会很麻烦!哦!这个问题用setenforce 0解决了!现在还有一个问题,这个代码有安全问题吗?意味着在共享主机中使用suid获取用户密码?还有selinux?
RUID : 48<br />
EUID : 0<br />
can not open file