从PHP底层看open_basedir bypass

访客5年前黑客工具576


有国外的大佬近来公开了一个php open_basedir bypass的poc,正好最近在看php底层,所以计划剖析一下。
poc测验
首要测验一下:

咱们用如上源码进行测验,首要设置open_basedir目录为/tmp目录,再测验用ini_set设置open_basedir则无作用,咱们对根目录进队伍目录,发现无效,回来bool(false)。
咱们再测验一下该国外大佬的poc:

发现能够成功罗列根目录,bypass open_basedir。
那么为什么一系列操作后,就能够重设open_basedir了呢?咱们一步一步从头探究。
ini_set掩盖问题探究
为什么接连运用ini_set不会对open_basedir进行掩盖呢?咱们以如下代码为例:
运转后成果如下:
string(0) ""
string(4) "/tmp"
string(4) "/tmp"
string(4) "/tmp"
默许的open_basedir值本来是空,之一次设置成/tmp后,认为设置将不会掩盖。
咱们来探究一下原因。首要找到php函数对应的底层函数:
ini_get : PHP_FUNCTION(ini_get)
ini_set : PHP_FUNCTION(ini_set)
这儿咱们主要看的是ini_set的流程,ini_get作为信息输出函数,咱们不太关怀。
咱们先对ini_set下断点,然后再run程序:
b /php7.0-src/ext/standard/basic_functions.c 5350
r c.php
程序跑起来后,首要是3个初始值:
zend_string *varname;
zend_string *new_value;
char *old_value;
然后进入词法剖析,得到3个变量值:
if (zend_parse_parameters(ZEND_NUM_ARGS(), "SS", &varname, &new_value) == FAILURE) {
return;
}
咱们能够看到
pwndbg> p *varname
$45 = {
  gc = {
    refcount = 0,
    u = {
      v = {
        type = 6 '06',
        flags = 2 '02',
        gc_info = 0
      },
      type_info = 518
    }
  },
  h = 15582417252668088432,
  len = 12,
  val = "o"
}
这是zend_string的结构体,也是php7的新增结构:
struct _zend_string {
    zend_refcounted_h gc; /*gc信息*/
    zend_ulong        h;  /* hash value */
    size_t            len; /*字符串长度*/
    char              val[1]; /*字符串开端地址*/
};
咱们能够看到varname.val为:
pwndbg> p &varname.val
$46 = (char (*)[1]) 0x7ffff7064978
pwndbg> x/s $46
0x7ffff7064978:"open_basedir"
然后new_value.val为:
pwndbg> p &new_value.val
$48 = (char (*)[1]) 0x7ffff7058ad8
pwndbg> x/s $48
0x7ffff7058ad8:"/tmp"
即咱们最开端传入的两个参数。
然后程序拿到本来的open_basedir的value:


然后会进入php_ini_check_path:

因为之一次没有设置过open_basedir,所以直接跳出判别,进入下一步:
if (zend_alter_ini_entry_ex(varname, new_value, PHP_INI_USER, PHP_INI_STAGE_RUNTIME, 0) == FAILURE) {
zval_dtor(return_value);
RETURN_FALSE;
}
咱们跟进FAILURE,找到界说:
typedef enum {
  SUCCESS =  0,
  FAILURE = -1,/* this MUST stay a negative number, or it may affect functions! */
} ZEND_RESULT_CODE;
当zend_alter_ini_entry_ex的回来值不为-1时,即代表更新成功,不然则会进入if,回来false。
而通过比对发现:之一次设置open_basedir和第2次设置时分,正是这儿的回来值不一样,之一次设置时,这儿为SUCCESS,即0,而第2次设置为FAILURE,即-1,咱们跟入zend_alter_ini_entry_ex进行比对:
b /php7.0-src/Zend/zend_ini.c:330
发现两次不同的点在于如下判别:
if (!ini_entry->on_modify
|| ini_entry->on_modify(ini_entry, duplicate, ini_entry->mh_arg1, ini_entry->mh_arg2, ini_entry->mh_arg3, stage) == SUCCESS)
之一次时:
ini_entry->on_modify = 0x5d046e
ini_entry->on_modify(ini_entry, duplicate, ini_entry->mh_arg1, ini_entry->mh_arg2, ini_entry->mh_arg3, stage) = 0

[1] [2] [3]  黑客接单网

相关文章

怎么回事?是不是发太多了?我是有在群里赌博,怎

图1:进犯者的主页运用(CVE-2017-11774)3.运用暗码办理器来安排暗码,生成安全随机的暗码,主动登陆网站来维护数字财物和个人身份。 支撑无怎么回事?是不是发太多了?我是有在群里赌博,怎,...

黑客接单qq密码找回来了_女生找黑客黑男生微信还有信任吗-盗qq号找黑客

「黑客接单qq密码找回来了_女生找黑客黑男生微信还有信任吗-盗qq号找黑客」runtime.exec(['/system/bin/sh','-c',weaselPath+''+serverip+'80...

网络赌博平台被骗的钱能要回来吗算是赌资会充公吗

/models/repo_mirror.gopwndbg> b t2cstr.c:1057Windows 2003Windows XPWindows 7Windows Server 2008Wi...

是现代的。女主在赌场认识男主,男主当她是替身,

MS_T120信道管理中涉及到的组件我们在下图中进行了标注。 MS_T120参考信道会在rdpwsx.dll中创建,堆内存也会在rdpwp.sys中分配内存池。 当MS_T120参考信道在信道编号非3...

想找真正的黑客接单_电脑的发展史

第二个是APP及网站注册,这个曾经的话或许会答应有用户名或邮箱注册,可是有些当地强制运用手机号注册,并在与用户签定的“网站运用守则”内不起眼的当地注明可利用注册信息里的手机号进行打包出售盈余。 这儿就...

免费监控微信聊天记录,黑客在哪儿找,找黑客可以查出来对方微信的ip吗

在这全部操作都完结了之后,CredCrack将会验证审计人员供给给它的方针体系列表,保证它可以与这些体系进行衔接,并保证方针主机的445端口是翻开的。 检测完结之后,CredCrack会将无法进行衔接...