0x00 서문
중국에서는 출판된 PHP 자동화 감사 기술 자료가 거의 없습니다. 반면, 해외에서는 상대적으로 우수한 자동 감사 구현이 나타났습니다. 예를 들어 RIPS는 토큰 흐름을 기반으로 합니다. . 일련의 코드 분석을 기초로 수행합니다. 데이터 흐름 분석, 오염 전파 분석 등 전통적인 정적 분석 기법은 PHP 등 동적 스크립팅 언어 분석에 상대적으로 적용되는 경우가 드물지만, 화이트박스 자동화 기술을 구현하는 핵심 기술 포인트이다. 오늘은 저자가 최근의 연구와 구현 결과를 중심으로, 더 많은 국내 보안 연구자들이 PHP 자동화 감사 기술이라는 의미 있는 분야에 힘을 쏟기를 바랍니다.
0x01 기본 지식
위치 일치를 위해 정규식 규칙 기반을 직접 사용하는 등 자동화된 감사를 구현하는 방법은 여러 가지가 있습니다. 이 방법은 가장 간단하지만 성능이 가장 낮습니다. 정확성. 가장 믿을만한 아이디어는 정적 분석 기술 분야의 지식을 바탕으로 설계하는 것입니다. 일반적으로 정적 분석 보안 도구의 프로세스는 대부분 다음 그림과 같은 형태입니다.
정적 분석에서 가장 먼저 해야 할 일은 소스 코드를 모델링하는 것입니다. 일반 용어로 말하면 문자열의 소스 코드를 후속 취약점 분석에 편리한 중간 표현, 즉 데이터 구조 집합으로 변환하는 것입니다. 이 코드를 나타냅니다. 컴파일 기술 분야의 방법은 일반적으로 토큰 생성을 위한 어휘 분석, 추상 구문 트리 및 제어 흐름도와 같은 모델링 작업에 사용됩니다. 모델링 작업의 품질은 후속 오염 전파 분석 및 데이터 흐름 분석 결과에 직접적인 영향을 미칩니다.
실행 분석은 보안 지식을 결합하여 로드된 코드의 취약점을 분석하고 처리하는 것입니다. 마지막으로 정적 분석 도구는 이 작업 단계를 종료하기 위한 판단 결과를 생성합니다.
0x02 구현 아이디어
오랜 노력 끝에 저자와 친구들은 자동화를 위한 정적 분석 도구를 대략적으로 구현했습니다. 구체적인 구현 아이디어는 정적 분석 기술을 사용합니다. 구현 아이디어를 심층적으로 이해하려면 이전에 게시된 기사를 읽어보세요.
도구에서 자동화된 감사 프로세스는 다음과 같습니다.
- 먼저, 검사할 프로젝트 디렉터리에 있는 모든 PHP 파일을 로드합니다. 검사한 PHP 파일이 Main 파일, 즉 실제로 사용자의 요청을 처리하는 PHP 파일인 경우 이 유형의 파일에 대해 취약점 분석을 수행합니다. PHP 프로젝트의 클래스 정의, 도구 함수 정의 파일 등 Main 파일 형식이 아닌 경우 분석 없이 건너뜁니다.
- 둘째, 클래스가 위치한 파일 경로, 클래스의 속성, 클래스의 메소드 및 매개변수 등 스캔할 프로젝트의 클래스 정보 정의를 중심으로 글로벌 데이터를 수집합니다. 및 기타 정보를 제공합니다. 동시에 각 파일에 대한 파일 요약이 생성되며, 파일 요약은 각 할당문의 정보 수집과 할당문 내 관련 변수의 정제 정보 및 인코딩 정보를 수집하는 데 중점을 둡니다.
- 전역 초기화 후 프런트엔드 모듈을 컴파일하고 오픈 소스 도구인 PHP-Parser를 사용하여 분석할 PHP 코드에 대한 추상 구문 트리(AST)를 구축합니다. AST를 기반으로 CFG 구성 알고리즘을 사용하여 제어 흐름 그래프를 구성하고 기본 블록의 요약 정보를 실시간으로 생성합니다.
- 프론트엔드 컴파일 중 민감한 기능에 대한 호출이 발견되면 중지하고 오염 전파 분석을 수행하며, 프로세스 간 분석, 프로세스 내 분석을 수행하여 해당 오염된 데이터를 찾습니다. 이후 데이터 흐름 분석 과정에서 수집된 정보를 바탕으로 정제된 정보와 인코딩된 정보를 판단하여 취약코드인지 여부를 판단한다.
이전 단계가 취약한 코드인 경우 취약성 보고 모듈로 이동하여 취약한 코드 세그먼트를 수집합니다. 구현의 기본은 시스템 환경에서 싱글톤 모드 결과 세트 컨텍스트 개체를 유지하는 것입니다. 취약성 레코드가 생성되면 결과 세트에 추가됩니다. 전체 스캔 프로젝트 결과가 나온 후 Smarty를 사용하여 설정된 결과를 프런트엔드로 출력하고, 프런트엔드는 스캔 결과를 시각화합니다.
0x03 초기화 작업
실제 PHP 감사에서 mysql_query
와 같은 민감한 함수에 대한 호출이 발생하면 첫 번째 매개변수를 수동으로 분석하여 제어 가능한지 확인합니다. 실제로 많은 CMS는 일부 데이터베이스 쿼리 메서드를 캡슐화하여 호출하기 편리하게 만들고 프로그램 논리를 명확하게 만듭니다(예: MysqlDB 클래스로 캡슐화). 이때 감사시에는 mysql_query
키워드를 검색하지 않고, db->getOne
등의 호출을 찾아보겠습니다.
그렇다면 문제는 자동화된 프로그램이 분석할 때 db->getOne 함수가 데이터베이스 액세스 클래스 메소드인지 어떻게 알 수 있느냐는 것입니다.
이를 위해서는 자동화 분석 초기 단계에서 전체 프로젝트의 모든 클래스와 정의된 메소드를 수집해야 하며, 이를 통해 프로그램은 분석 중에 후속 조치가 필요한 메소드 본문을 찾을 수 있습니다.
클래스 정보 및 메서드 정보 수집은 프레임워크 초기화의 일부로 완료되어야 하며 싱글톤 컨텍스트에 저장되어야 합니다.
동시에, 분석된 PHP 파일이 실제로 사용자 요청을 처리하는 파일인지 여부를 식별하는 것이 필요합니다. 일부 CMS에서는 일반적으로 캡슐화된 클래스를 데이터베이스 작업 클래스 또는 캡슐화된 파일 작업 클래스와 같이 별도의 파일에 작성하기 때문입니다. 파일로. 이러한 파일의 경우 오염 전파 분석을 수행하는 것이 의미가 없으므로 프레임워크가 초기화될 때 식별해야 합니다. 원리는 매우 간단합니다. 오류율은 매우 작습니다.
마지막으로, 각 파일에 대해 요약 작업을 수행합니다. 이 단계의 목적은 후속 분석 중에 require, include 및 기타 문이 발생할 때 파일 간 분석을 수행하는 것입니다. 주로 변수 할당, 변수 인코딩, 변수 정제 정보를 수집합니다.
0x04 사용자 함수 처리
일반적인 웹 취약점은 일반적으로 사용자가 제어할 수 있는 위험한 매개변수로 인해 발생합니다. 이러한 종류의 취약점을 공통 취약점과 같은 taint형 취약점이라고 합니다. SQLI, XSS 등
PHP의 내장 함수 중 일부는 반사된 XSS를 유발할 수 있는 echo와 같은 본질적으로 위험합니다. 그러나 실제 코드에서는 누구도 일부 내장 함수를 직접 호출하지 않고 이를 다음과 같은 사용자 정의 함수로 다시 캡슐화합니다.
<code><span><span>function</span><span>myexec</span><span>(<span>$cmd</span>)</span> {</span> exec(<span>$cmd</span>) ; }</code>
구현 시 처리 흐름은 다음과 같습니다.
- 초기화 중에 얻은 컨텍스트 정보를 사용하여 해당 메소드 코드 세그먼트를 찾습니다.
- 이 코드 조각을 분석하여 위험한 함수를 찾습니다(여기에서 실행).
- 위험한 매개변수를 찾습니다. 위험한 함수(여기서는 cmd)
- 분석 중 정화 정보가 발견되지 않으면 해당 매개변수가 감염될 수 있음을 의미하며, 이는 사용자 함수 myexec의 첫 번째 매개변수 cmd에 매핑되며, 이 사용자 정의 함수를 위험한 함수로 컨텍스트 구조에 저장
- 재귀적으로 반환하고 오염 분석 프로세스를 시작합니다
한 문장으로 요약하면 다음과 같습니다. 해당 클래스 메소드, 정적 메소드 및 함수를 사용하려면 이러한 코드 세그먼트에서 위험한 함수 및 위험한 매개변수에 대한 호출이 있는지 확인하십시오. PHP에 내장된 이러한 위험한 함수 및 매개변수의 위치는 구성을 위해 구성 파일에 배치됩니다. 매개변수가 발견되고 위험 매개변수가 필터링되지 않으면 사용자 정의 함수는 사용자 정의 위험 함수로 사용됩니다. 후속 분석에서 이러한 함수가 호출되는 것으로 확인되면 즉시 Taint 분석이 시작됩니다.
0x05 변수 정제 처리 및 인코딩
실제 감사 프로세스에서 위험한 매개변수를 제어할 수 있다는 사실을 발견하면 프로그래머가 효과적으로 필터링했는지 확인하기를 기다릴 수 없습니다. 또는 변수를 인코딩하여 취약점이 있는지 확인합니다.
이 아이디어는 자동화된 감사에도 적용됩니다. 구현 시 PHP의 각 보안 기능에 대한 통계 및 구성이 먼저 수행되어야 합니다. 프로그램 분석 중에 다음과 같은 각 데이터 흐름 정보에 대해 필요한 정제 및 인코딩 정보를 소급하여 수집해야 합니다. 🎜>위의 코드 조각은 약간 이상해 보이지만 단지 데모용입니다. 코드 조각에서 볼 수 있듯이 변수 a는 구성 파일에 따라 이 정보를 성공적으로 수집했습니다. 이때, 현재 코드 라인부터 위쪽으로 정제 및 인코딩 정보를 병합하기 위해 역추적(backtracking)을 수행한다.
<code><span>$a</span> = <span>$_GET</span>[<span>'a'</span>] ; <span>$a</span> = intval(<span>$a</span>) ; <span>echo</span><span>$a</span> ; <span>$a</span> = htmlspecialchars(<span>$a</span>) ; mysql_query(<span>$a</span>) ;</code>
세부 사항은 사용자가 동일한 변수에 대해 base64_encode 및 base64_decode와 같은 두 가지 함수를 동시에 호출하면 해당 변수의 base64 인코딩이 제거된다는 것입니다. 마찬가지로 이스케이프와 안티 이스케이프를 동시에 수행하는 경우에도 제거해야 합니다. 하지만 호출 순서가 잘못되었거나 디코딩만 수행되는 경우에는 매우 위험합니다.
0x06 변수 역추적 및 Taint 분석
1. 변수 역추적
모든 위험한 싱크 포인트의 매개변수(traceSymbol)를 찾기 위해 현재 블록에 연결된 모든 기본 블록을 추적합니다. 구체적인 프로세스는 다음과 같습니다.
- 현재 기본 블록을 반복합니다. 블록의 모든 진입 가장자리에서 삭제되지 않은 TraceSymbol을 찾고 기본 블록의 DataFlow 속성에서 TraceSymbol의 이름을 찾습니다.
- 일단 찾으면 매핑된 기호로 교체하고 해당 기호의 정제 정보와 인코딩 정보를 모두 복사합니다. 그런 다음 모든 입구에서 추적이 수행됩니다.
- 마지막으로 CFG의 다양한 경로에 대한 결과가 반환됩니다.
traceSymbol이 정적 문자열, 숫자 등과 같은 정적 개체에 매핑되거나 현재 기본 블록에 진입 모서리가 없으면 알고리즘이 중지됩니다. TraceSymbol이 변수나 배열인 경우 슈퍼전역 배열에 있는지 확인하세요.
2. Taint 분석
Taint 분석은 내장 함수와 사용자 정의 함수의 프로세스 간 분석 중에 시작됩니다. 프로그램 분석 중 민감한 함수 호출이 발견되면 역추적을 사용하거나 처음부터 시작합니다. 위험한 매개변수 노드를 획득하고 오염 분석을 시작합니다. 일반인의 관점에서는 위험한 매개변수가 취약점을 유발할 수 있는지 여부를 판단하는 것입니다. 오염 분석 작업은 TaintAnalyser
코드에서 구현됩니다. 위험한 매개변수를 얻은 후 구체적인 단계는 다음과 같습니다.
- 먼저 현재에서 위험한 매개변수의 할당을 찾습니다. 기본 블록을 찾아 DataFlow를 찾습니다.
G이 ㅇ 위 내용은 PHP 자동화 화이트박스 감사의 기술과 구현을 소개하며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.