今天,我想如何通过这两个文件的关系来做一个登录的界面。
首先,/etc/shadow里是存储了用户的信息包括密码等,其密码的加密模式有多种,每一种的Linux操作系统都不一样,我这次用的操作系统是Ubuntu 64位,其加密模式是sha512。
那么,我们如何把手上的密码,用PHP语言编写的程序进行加密呢?在php里,有一个crypt的函数
,其使用方法是:crypt(str,salt),解释下:str:加密的字符串;salt:格式与长度。
如:crypt('123456','$6$abcde'),最后得到的是一串加密的字符串。这串字符串就是我们shadow中用户的密码。
现在我们来看看,关键的一步如何通过PHP的权限来获取/etc/shadow的相应用户。经过我在网上搜索了大量的资料,发现最后的方法还是通过调用C程序来获取权限。下面的一段C程序是我已经验证过的代码:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main() { uid_t uid ,euid; uid = getuid() ; euid = geteuid(); printf("my uid :%u/n",getuid()); //这里显示的是当前的uid 可以注释掉. printf("my euid :%u/n",geteuid()); //这里显示的是当前的euid if(setreuid(euid, uid)) //交换这两个id perror("setreuid"); printf("after setreuid uid :%u/n",getuid()); printf("afer sertreuid euid :%u/n",geteuid()); system("less /etc/shadow | grep root"); //执行脚本 return 0; }
注意:上面代码可以根据自已的需求来改写,如参数传进cmd外部命令等。
录入后,编译代码后叫test,我们还要经过最重要的一步:
su root
chmod u+s test
OK,接下来我们通过PHP的exce函数来调用了。附件是我这次做的实验证。