-
-
[原创]浅谈Bypass disable_function
-
发表于:
2019-10-31 17:38
1292
-
[原创]浅谈Bypass disable_function
2. LD_PRELOAD替换后
这种绕过行为实施起来很简单,并且不受PHP与Linux版本的限制,但是也很容易防御,只要禁用相关的函数(putenv)或者限制对环境变量的传递就可以了,但是要注意对现有业务是否造成影响。其实对于这个问题,早在08年就有人向PHP官方反馈过,只不过PHP给出的回复是你最好禁用putenv函数:
https://bugs.php.net/bug.php?id=46741
,所以我们有理由相信在后续的PHP版本中也不会对这个问题有什么针对性的解决方案。
要更改的话打开php.ini,找到对应的行修改即可,这里修改如下:
危险等级:高
危险等级:高
危险等级:高
危险等级:高
危险等级:高
危险等级:高
危险等级:高
危险等级:高
危险等级:高
危险等级:高
危险等级:高
危险等级:高
危险等级:高
危险等级:高
危险等级:高
危险等级:中
危险等级:中
危险等级:中
危险等级:中
危险等级:中
1.主程序
// myverifypasswd.c
#include <stdio.h>
#include <string.h>
#include "mystrcmp.h"
void main(int argc,char **argv) {
char passwd[] = "password";
if (argc < 2) {
printf("usage: %s <password>\n",argv[0]);
return;
}
if (!mystrcmp(passwd,argv[1])) {
printf("Correct Password!\n");
return;
}
printf("Invalid Password!\n");
}
2.调用库
#include <stdio.h>
int mystrcmp(const char *s1,const char *s2);
3.生成动态链接库原始C文件
// mystrcmp.c
#include <stdio.h>
#include <string.h>
#include "mystrcmp.h"
int mystrcmp(const char *s1,const char *s2)
{
return strcmp(s1,s2);
}
#include <stdio.h>
int mystrcmp(const char *s1,const char *s2);
3.生成动态链接库原始C文件
// mystrcmp.c
#include <stdio.h>
#include <string.h>
#include "mystrcmp.h"
int mystrcmp(const char *s1,const char *s2)
{
return strcmp(s1,s2);
}
// mystrcmp.c
#include <stdio.h>
#include <string.h>
#include "mystrcmp.h"
int mystrcmp(const char *s1,const char *s2)
{
return strcmp(s1,s2);
}
演示流程图
编译、设置
gcc mystrcmp.c -fPIC -shared -o libmystrcmp.so
gcc myverifypasswd.c -L. -lmystrcmp -o myverifypasswd
export LD_LIBRARY_PATH=/home/n6/桌面/LD_PRELOAD #指定动态链接库所在目录位置
ldd myverifypasswd #显示、确认依赖关系
./myverifypasswd
gcc mystrcmp.c -fPIC -shared -o libmystrcmp.so
gcc myverifypasswd.c -L. -lmystrcmp -o myverifypasswd
export LD_LIBRARY_PATH=/home/n6/桌面/LD_PRELOAD #指定动态链接库所在目录位置
ldd myverifypasswd #显示、确认依赖关系
./myverifypasswd
gcc mystrcmp.c -fPIC -shared -o libmystrcmp.so
gcc myverifypasswd.c -L. -lmystrcmp -o myverifypasswd
export LD_LIBRARY_PATH=/home/n6/桌面/LD_PRELOAD #指定动态链接库所在目录位置
ldd myverifypasswd #显示、确认依赖关系
./myverifypasswd
// myhack.c
#include <stdio.h>
#include <string.h>
int mystrcmp(const char *s1, const char *s2)
{
printf("hack function invoked. s1=<%s> s2=<%s>\n", s1, s2);
// always return 0, which means s1 equals to s2--总是相等
return 0;
}
替换流程图
七、实际应用测试
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!