コンテンツ
序文:
プロジェクトの開始から現在まで、Docker関連のコンテンツの学習と実践的なテストに加えて、SQLインジェクションの脆弱性の数値インジェクションと文字インジェクションおよびブラケットを使用した文字インジェクションの脆弱性環境のコード作成と環境構築には次のようなものがあります。完了しました。次のタスクは、RCE脆弱性環境の構想、コードの記述、およびテスト実行を完了することです。
1.RCEの脆弱性の概要
1.1。はじめに
RCE(リモートコード/コマンド実行):リモートコード/コマンド実行
脆弱性の理由:Webアプリケーションでは、柔軟性と単純さのために、開発者はアプリケーションにコードまたはシステムコマンド実行関数を呼び出して処理させ、ユーザーの入力を制御できるかどうかを考慮せず、コード/システムコマンドを実行します。脆弱性。
たとえば、一般的なルーターのWeb管理インターフェース、ファイアウォール侵入検知などの機器では、通常、ping操作用のWebインターフェースがユーザーに提供されます。ユーザーは、Webインターフェースからターゲットを入力し、送信後、バックグラウンドでIPアドレスに対してpingテストを実行し、テスト結果を返します。この機能を完了するときに設計者が厳密なセキュリティ制御を実装しないと、攻撃者がこのインターフェイスを介して予期しないコマンドを送信し、バックグラウンドが実行される可能性があります。 、それによってバックグラウンドサーバー全体を制御します。
実際、この脆弱性はほとんどの脆弱性と同様です。つまり、ユーザー入力はチェックも厳密なフィルタリングも行われず、直接実行されるため、リモートでコードが実行される脆弱性が発生します。
phpを使用する場合と比較して、javaで構築されたWebサイトでは、リモートコード実行の脆弱性が発生する可能性が低くなります。これは、phpには関連するコマンドを実行できる組み込み関数が多数あるためですが、このような脆弱性は依然として発生します。
この脆弱性が発見されると、それはほとんどリスクの高い脆弱性になります。
1.2.危険
高リスク:サーバーのアクセス許可を直接取得し、機密データ、ファイルを取得し、悪意のあるファイルを書き込むgetshell
システムコマンドを実行するためのWebサーバープログラムの権限を継承します
Webサーバープログラムの権限を継承し、ファイルを読み書きします
バウンスシェル
ウェブサイト全体を管理する
サーバー全体を制御することもできます
Wechat PCバージョンはRCEの脆弱性を公開しています。これは主に、ChromeブラウザがサンドボックスモードなしでRCE実行の脆弱性をトリガーするためですが、Chromeではデフォルトでサンドボックスモードが有効になっています。
WeChat PCバージョン(3.2.1.141)より前では、WeChatのデフォルトの組み込みブラウザーを使用してリンクを開くときにchromeカーネルが呼び出され、デフォルトで--no-sandboxを使用してコマンドを実行できます。
影響を受けるバージョン:WeChatWindowsバージョン<3.1.2.141
1.3、利用
1.3.1。脆弱性マイニング
ブラックボックステスト:pingなどのWebサイトの特別なファンクションポイントをテストします。
(推奨)ホワイトボックステスト:コード監査を通じて、アプリケーションの危険な機能が厳密にフィルタリングされているかどうかを監査します
phpのコマンド実行関数:system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()
phpのコード実行関数:eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()
この脆弱性はパイプ文字を使用して悪用されます。さまざまなサーバーシステムでパイプ文字を悪用するさまざまな方法があります。
1.3.2、窓の下のパイプ文字
";":前のステートメントを実行した後、次のステートメントを実行します。
"|":次のステートメントの実行結果を表示します。
"||":前のステートメントの実行でエラーが発生すると、次のステートメントが実行されます。
「&」:両方のコマンドが実行されます。前のステートメントがfalseの場合、次のステートメントが実行されます。前のステートメントはtrueまたはfalseになります。
「&&」:前のステートメントがfalseの場合、エラーが直接発生し、次のステートメントは実行されません。前のステートメントがtrueの場合、両方のコマンドが実行され、前のステートメントのみがtrueになります。
1.3.3、Linuxでのパイプ文字
";":前のステートメントを実行した後、次のステートメントを実行します。
"|":次のステートメントの実行結果を表示します。
"||":前のステートメントの実行でエラーが発生すると、次のステートメントが実行されます。
「&」:両方のコマンドが実行されます。前のステートメントがfalseの場合、次のステートメントが実行されます。前のステートメントはtrueまたはfalseになります。
「&&」:前のステートメントがfalseの場合、エラーが直接発生し、次のステートメントは実行されません。前のステートメントがtrueの場合、両方のコマンドが実行されます。前のステートメントのみがtrueになります。
1.4。予防
-
このような抜け穴を防ぐために、危険な機能に入る前に、ユーザー入力、つまりフロントエンドから返されるデータを厳密に検出してフィルタリングする必要があります。
-
コマンドを使用して機能を実行しないようにしてください
2.関連する構成
application.propertiesを記述します
spring.thymeleaf.prefix = classpath:/templates/
pom.xmlは関連する依存関係をインポートします
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>sqli</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sqli</name>
<description>sqli</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.「RCE脆弱性」バックエンドコードを記述します
以前のSQLインジェクションと同じ設定でspringbootフレームワークのプロジェクトを作成します。
最初にコントローラーレイヤーを作成し、リクエストマッチングジャンプを構成します。
indexController.java
package com.example.sqli.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class indexController {
@RequestMapping(value={
"/","/index.html"})
public String index(){
return "index";
}
@RequestMapping(value={
"RCE_ping"})
public String RCE_ping_index(){
return "RCE_ping";
}
}
次に、RCE脆弱性バックエンドコードを記述し、RCE脆弱性実行環境を構築します。私が考えるのは、pingサービスを提供する環境シナリオを構築することです。フロントエンドは入力ボックスであり、ユーザーはIPアドレスを入力できます。次に、バックエンドサーバーが関数を呼び出してpingコマンドを実行し、結果をフロントエンドに返します。このようなサービスシナリオは、ユーザー入力コンテンツがフィルタリングおよびチェックされない場合、RCEの脆弱性を構成する可能性があります。
上記の考えに従って、RCE.javaを記述します
package com.example.sqli.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.SQLException;
@Controller
@RequestMapping("/RCE/")//接口注解
public class RCE {
//RCE-ping漏洞(测试payload:127.0.0.1 | whoami 或者 127.0.0.1 && whoami)
@RequestMapping("ping")
public String RCE_ping(@RequestParam(value = "ip",required = false) String ip, Model model) throws SQLException, IOException {
// Runtime rt = Runtime.getRuntime();
// Process p = rt.exec("cmd.exe /c ping "+ip);
// System.out.println(p.toString());
// return "RCE_ping";
Runtime runtime = Runtime.getRuntime();
try {
String cmd = "cmd /c ping "+ip;
Process process = Runtime.getRuntime().exec(cmd);
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
process.waitFor();
process.exitValue() ;
//BufferedReader br = new BufferedReader(new InputStreamReader(runtime.exec("ping "+ip).getInputStream(),"GBK"));
String line=null;
System.out.println(cmd);
StringBuffer b=new StringBuffer();
while ((line=br.readLine())!=null) {
b.append(line+"\n");
}
System.out.println("ping输出结果:"+b.toString());
} catch (Exception e) {
e.printStackTrace();
}
return "RCE_ping";
}
}
4.「RCE脆弱性」フロントエンドコードを記述します
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SQL注入</title>
</head>
<body>
<input type="button" value="RCE-ping"
onclick="javascrtpt:window.location.href='http://localhost:8080/RCE_ping'" />
</body>
</html>
RCEの脆弱性、フロントエンドの単純な環境、pingサービス
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>RCE-ping</title>
</head>
<body>
<form action="http://localhost:8080/RCE/ping" method="get">
请输入ip地址: <input type="text" name="ip" />
<input type="submit" value="ping" />
</form>
</body>
</html>
5.テストを実行します
まず、射撃場のサーバーはLinuxシステムであり、Linuxパイプ文字を使用してテストする必要があります。ここでは、書き込み後にWindows環境で直接テストします。Linuxサーバーにデプロイすると、ペイロードが変化する。
スタートアッププロジェクト
RCE脆弱性シミュレーション環境、pingサービスにアクセスする
テスト入力127.0.0.1
![]](https://img-blog.csdnimg.cn/33e5d898071a461db63f2f7773ab4ee9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZmM5YWuXw==,size_20,color_FF
ペイロード:127.0.0.1 && whoami
回显:
![[]](https://img-blog.csdnimg.cn/9930b090b4284cdaae3aa6f89f39d68c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZmM5YWuXw==,size_20,color_FF
ご覧のとおり、コマンドが実行されますwhoami
RCE脆弱性環境が構築されている
参考記事
https://www.cnblogs.com/mrob0t/p/14750795.html
https://www.icode9.com/content-4-812303.html
https://www.jianshu.com/p/1010fb8d9597
https://www.cnblogs.com/zzb228/articles/15440327.html
https://jingyan.baidu.com/article/c275f6ba6b7985e33d756789.html
https://blog.csdn.net/nigo134/article/details/118462599
https://www.zhihu.com/question/474360592/answer/2017267949