(악용 금지) OS 명령에 취약한 PHP 코드 삽입 확인

개요


학습용으로 OS 명령 삽입의 취약성을 실제로 적용해 검증하고 싶다.
실제 코드를 테스트할 때 로컬 연결만 가능한 환경에서만 실행해야 합니다.
외부에 공개된 서버에서 테스트를 진행하면 제3자가 OS 명령을 실행할 수 있음을 주의하십시오.

샘플 코드(Apache+PHP)


이번 검증은 Windows10에서 WSL2를 사용하여 Apache+PHP의 환경을 만든 후 실시되었습니다.
유효성 검사 환경: Ubuntu 20.4.2 LTS(WSL2) + Apache2.41 + PHP 7.4.3
os_cmd_injection_test.php
/**
 * 【悪用厳禁】
 * 表題:OSコマンドインジェクションテスト(PHP)
 * 説明:OSコマンドインジェクション脆弱性を検証するためのPHPプログラムです。
 * 概要:フォームからサブミットされたコマンドを受け取りOSコマンドを実行して結果を表示する。
 */

// OSコマンド実行
$exec_cmd = "";
if ( isset($_POST['exec_cmd']) ) {
  $exec_cmd = $_POST['exec_cmd'];
  ob_start();
  passthru($exec_cmd);
  $cmd_result = ob_get_contents();
  ob_end_clean();
  $cmd_result = nl2br($cmd_result);
}

// 画面表示(HTML)
$html =<<<__EOL__
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>OS Command Injection Test Program</h1>
<div>---- Input Command To Submit----</div>
<div>
<form method="post">
<input type="text" name="exec_cmd"></input><br />
<input type="submit" value="submit"></input>
</form>
</div>
<br />
<div>---- Exec OS Cmd ----</div>
<div>
$exec_cmd<br />
</div>
<div>---- OS Cmd Result ----</div>
<div>
$cmd_result
</div>
</body>
</html>
__EOL__;

header("Content-type: text/html; charset=UTF-8");
echo $html;
명령의 실행 결과를 모두 볼 수 있습니다.함수.
4passthru() 명령 실행 결과가 표준 출력에 기록되기 때문입니다.표준 출력을 버퍼링합니다.OS 명령은 POST 없이 실행됩니다.

실행 결과 샘플


명령 실행:apchee-2-v

실행 결과:submit 실행 후

OS 명령 실행 결과가 성공적으로 표시됩니다.

PHP를 통해 외부 프로그램을 실행할 수 있는 주요 함수


PHP는 외부 프로그램이 실행할 수 있는 함수를 많이 준비했기 때문이다.그 외에도 주의가 필요하다.
passthru()
명령 결과의 마지막 줄을 되돌려줍니다.
ob_start()
성공할 때 명령 출력의 마지막 줄을 되돌려주고 실패할 때 가짜를 되돌려줍니다.
passthru()
어떠한 간섭도 받지 않고 지령으로부터 모든 데이터를 직접 받다.
...
※ PHP 외부 프로그램을 실행하는 다른 함수도 있어 확인해야 합니다.

OS 명령 주입 대책


외부 명령을 사용하여 수행할 수 있는 함수는 다음과 같습니다.
※ 이것은 제 개인적인 생각일 뿐입니다.
1. 외부 전달을 실행하지 않는 값으로 구성한다.
2. 외부에서 명령을 전달할 때 지정한 명령 이외의 명령을 실행하지 않는다.
3. ";"의 연속 명령 ">"시작 파일과 같은 특수 기호입니다.
 「;」「>」「<」「|」「&」「`」「(」「)」「$」「*」「?」「{」「}」「[」「]」「!」잠깐만요.
4. 다른 취약성으로 인해 부당한 파일 업로드를 한 경우 OS 명령 주입에 섞일 수 있으므로'변조 검사'를 검토한다.
5. 프로그램의 사용자(WEB 서버의 사용자) 권한을 최소화합니다.

총결산


OS 명령 삽입 취약성은 OS 단계를 조작하는 데 매우 위험한 취약성이다.Apache의 사용자 권한은 가능한 모든 것을 실현할 수 있기 때문에 SSH를 통해 로그인하는 것과 같다고 할 수 있다.
또 코드에 취약성이 생기지 않도록 주의할 뿐 아니라 다른 취약성으로 인한 부당한 파일 업로드로 OS 명령 삽입 취약성이 혼입되지 않도록 대책을 강구해야 한다.
취약성을 모르면 해결할 수 없기 때문에 규격대로 움직이는 코드를 만드는 것은 물론 안전코드 쓰기 학습도 병행해야 한다.
이상은 OS 명령의 취약성을 검증하는 PHP 코드입니다.절대 학습용으로 악용하지 마세요!!

좋은 웹페이지 즐겨찾기