小记PHP7的disable_functions绕过以及open_basedir()跨路径访问
主要针对PHP7版本
disable_functions绕过
一般而言,利用漏洞控制 web 启动新进程 a.bin(即便进程名无法让我随意指定),a.bin 内部调用系统函数 b(),b() 位于系统共享对象 c.so 中,所以系统为该进程加载共 c.so,想法在 c.so 前优先加载可控的 c_evil.so,c_evil.so 内含与 b() 同名的恶意函数,由于 c_evil.so 优先级较高,所以,a.bin 将调用到 c_evil.so 内 b() 而非系统的 c.so 内 b(),同时,c_evil.so 可控,达到执行恶意代码的目的。
甚至不要main()
函数来劫持 getuid(),作者通过 LD_PRELOAD 劫持了启动进程:
具体链接:https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD
利用backtrace
、json反序列化
和gc
绕过disable_functions:
具体链接:
https://github.com/mm0r1/exploits
open_basedir()跨路径访问
open_basedir
可将用户访问文件的活动范围限制在指定的区域,通常是其家目录的路径,也可用符号.
来代表当前目录。注意用open_basedir
指定的限制实际上是前缀,而不是目录名。
举例来说: 若open_basedir = /dir/user
, 那么目录 /dir/user
和 /dir/user1
都是可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。例如设置成:
open_basedir = /dir/user/
open_basedir
也可以同时设置多个目录, 在Windows中用分号分隔目录,在任何其它系统中用冒号分隔目录。
当限制了目录后,通过chdir()
和ini_set()
来进行跨路径访问:
查看根目录payload:
mkdir(%22/tmp/crispr%22);chdir(%27/tmp/crispr/%27);ini_set(%27open_basedir%27,%27..%27);chdir(%27..%27);chdir(%27..%27);chdir(%27..%27);chdir(%27..%27);ini_set(%27open_basedir%27,%27/%27);print_r(scandir(%27.%27))