
PHPの権限昇格時に、システムによって無効化された関数が原因でコマンドを実行できない状況を解決する
bypass_disablefunc.phpには3つのGETオプションがあります:cmd、outpath、sopath。
オプションは非常に簡単です。
cmdはあなたの邪悪なコマンドで、
outpathはコマンド出力のファイルパス(読み取りおよび書き込み可能)で、
sopathは共有オブジェクトbypass_disablefunc_x64.soの絶対パスです。例:
1つ目はcmdパラメータで、実行するシステムコマンド(pwdなど);
2つ目はoutpathパラメータで、コマンド実行の出力結果を保存するファイルパス(例:/ tmp / xx)で、ページ上での表示を容易にします。また、このパラメータについては、webに読み書き権限があるか、webがディレクトリをまたいでアクセスできるか、ファイルが上書き・削除されるかなどに注意してください;
3つ目はsopathパラメータで、システム関数をフックする共有オブジェクトの絶対パスを指定します(例:/var/www/bypass_disablefunc_x64.so)。また、このパラメータについては、webがディレクトリをまたいでそのファイルにアクセスできるかどうかに注意してください。
さらに、bypass_disablefunc.phpはコマンドと出力パスを連結して完全なコマンドラインを構成するため、cmdパラメータでリダイレクトする必要はありません。
bypass_disablefunc_x64.soはコマンドを実行する共有オブジェクトで、コマンドgcc -shared -fPIC bypass_disablefunc.c -o bypass_disablefunc_x64.so
を使用してbypass_disablefunc.cからコンパイルされます。ターゲットがx86アーキテクチャの場合は、-m32オプションを追加してbypass_disablefunc_x86.soを再コンパイルする必要があります。
bypass_disablefunc.phpとbypass_disablefunc_x64.soをターゲットに転送する方法を考え、3つのGETパラメータを指定すれば、bypass_disablefunc.phpでdisable_functionsを突破できます。
既知の問題:
1)ターゲット環境によっては、共有オブジェクトの再コンパイルが必要になる場合があります。このプロジェクトのbypass_disablefunc_x64.soはdebian、x64でコンパイルされていますが、非debian系では再コンパイルが必要になる可能性があります; 2)bypass_disablefunc.phpは、outpathで指定されたパスに対して読み書き権限が必要です。ターゲットでSELinuxが有効になっている場合、webアカウントによるファイル書き込みがブロックされる可能性があります。例えば、apacheユーザーとしてidを実行すると、出力はuid=48(apache) gid=48(apache) groups=48(apache) context=system_u:system_r:httpd_t:s0となります。最後のcontext=system_u:system_r:httpd_t:s0が見えましたか?それが見えたら、まさにSELinuxの仕業です。