이전 보안오버라이드해킹 챌린지에서 문제해결 아이디어를 정리하는 작업을 이어가서 이번에는 고급을 마쳤습니다. 이는 주로 PHP에 대한 몇 가지 공격 방법을 포함하며, 이는 심층적인 이해를 위한 기초로 사용될 수 있습니다.
3 고급
3.1 PHP는 짜증나
==의 교차 유형 비교 사용 PHP 결과적인 허점. 궁극적인 목표는 $input=="0000"을 만드는 것입니다. PHP에서는 모든 숫자 문자열이 결국 비교를 위해 숫자로 변환되므로 입력은 임의의 숫자가 될 수 있습니다. 그러나 필터는 마침내 정규 판단 <code><span>preg_match</span>
preg_match<span>(</span>
<code><span>"/^[d]{1,}$/D"</span>
(<span>, </span>
<code><span>$input</span>
"/^[d]{1을 추가합니다. ,}$/D"<span>)</span>
,
<p>$input<span></span></p>
)
. 이는 순수한 숫자가 될 수 없음을 의미합니다. 이것도 비교적 간단해서 0의 특성(초등학교 지식: 0은 음수 0과 같음)을 이용하면 되므로 -0만 입력하면 됩니다. PS: PHP의 약한 클래스 판단 규칙에 대해 http://php.net/manual/en/types.comparisons.php
3.2 난독화된 PHP:
혼란을 전제로 코드 로직을 정리할 수 있는지 살펴보세요. 이 문제에 대한 지름길은 없으며 수동 청소가 필요합니다. 주석과 세미콜론을 지우고 나면 실제로 코드의 양은 많지 않습니다. 그런 다음 디코딩해야 할 일부 부분을 디코딩하고 함수에서 반환해야 하는 부분을 직접 대체하면 코드 논리가 명확해집니다. 완료 후 코드 로직은 다음과 같습니다.
session_start();
$_u=array();
$_u[0 ]=' SERVER_ADDQUERY_STRINGREQUEST_METHODHTTP_ACCEPT'; // 문자열
$_u[1]='substr'; // substr 함수
$_u[2]='base64_decode'; §§ §§§§ =preg_split('/(?!\##$$$uu)=/',_SERVER['QUERY_STRING']) // 간단히 =
${로 나누는 것으로 이해하면 됩니다. "_g_1"} = urldecode($_§§§§§§§[0]) // 키
${"_g_2"} = _GET[${"_g_1"}] // 값
if(LEVENSHTEIN( ${"_g_1"},${"_g_2"})==0){// 매개변수의 키와 값은 동일해야 합니다
validate_result(${"_g_2"});
🎜> function verify_result($result){ // value = phpinfo(); then 성공(세미콜론 필요)
if($result === 'phpinfo();'){
$_SESSION[" solved_advanced_2"] = true;
header("Location:./");
}
}
echo "행운을 빕니다. 뒤로 챌린지 메인 페이지로 이동하세요.
이 챌린지를 해결한 경우에만 피드백을 받을 수 있습니다. 잘못된 시도는 전혀 결과를 생성하지 않습니다.< ;hr />";
?>
그 다음은 매우 간단합니다. 요구 사항.
3.3 업로드 우회
에서는 필터 프로그램을 우회하고 PHP를 업로드해야 합니다. 스크립트. 일반 아이디어: 1 .php 파일을 직접 업로드합니다(실패). 2 .php 파일을 업로드하되 게시물 내용의 contentType을 image/jpg로 변경합니다(실패). 3 일반 jpg 파일을 업로드하고 PHP 스크립트를 숨깁니다(Linux 명령 cattest.php>>image.jpg 또는 도구를 사용하여 주석 추가. PHP 구문 분석을 방해하는 특정 이미지 문자를 피하기 위해 이미지를 단순하거나 단색으로 유지하십시오). . 세 번째 단계를 통해 이 문제는 해결된다.
다음으로 jpg에서 php 스크립트를 실행하는 방법에 대한 문제도 연구했습니다. 정보를 참고하고 직접 실험한 결과 기본적으로 다음 두 가지 방법만이 더 적합합니다.
· 이 jpg 파일을 다른 PHP 파일에 포함하거나 요구합니다
include('images/' . $_GET['test.jpg']);
require('images/' . $_GET['test.jpg']);
include('images/' . $_POST['test.jpg']);
include('images/' . $_POST['test.jpg']);include('test.jpg');
?>
· /etc/apache2/mods-available/php5.conf의 jpg 형식 해석기를 php
제목에서 이미 로컬 파일 포함 취약점의 존재를 언급했기 때문에 첫 번째 방법을 사용하여 PHP 스크립트를 실행하는 방법은 매우 간단합니다. 대략적으로 include 또는 변수를 제어하는 주입 방법을 사용하는 것입니다. require. , 스크립트가 실행됩니다.
3.4 로컬 파일 포함/WAF 우회
자, 연구부터 시작하겠습니다. 3.3에서는 작동합니다. 3.4에서는 업로드된 파일을 실행해야 합니다(3.3에서 업로드가 성공하면 파일 경로가 제공됩니다. 내 경로는 /challenges/advanced/uploads/Ac3sk9j.jpg입니다. 동일한지 모르겠습니다. 모두를 위해). 3.3에서 언급한 것처럼 PHP에 include, require 등의 함수가 있으면 이를 이용해 jpg로 PHP 코드를 실행할 수 있다. 3.4에 들어가서 관찰한 후 URL에 매개변수 페이지가 있음을 발견했습니다. 마음대로 수정하려고 시도했지만 당연히 test.php를 찾을 수 없다는 오류 메시지가 표시되었습니다. 그렇다면 목표는 매우 명확합니다. 페이지 매개변수를 수정하고 jpg 파일의 경로를 지정합니다. 활용 경로 중 ..은 상위 폴더를 의미하며, 상대 경로는 ../uploads/Ac3sk9j.jpg로 작성하시면 쉽습니다. 요청을 시도하면 결과는 다음과 같습니다: uploads/Ac3sk9j.jpg.phpcannot 찾을 수 있습니다. 두 가지 불만족스러운 점이 있습니다. 1) ../가 필터링됩니다. 2) 파일 이름이 Ac3sk9j.jpg가 아닌 Ac3sk9j.jpg.php입니다. 따라서 해결책을 찾으십시오.
· 특정 문자열을 필터링하는 경우 가장 간단한 방법은 문자열 바꾸기입니다. 해당 크래킹 방법은 매우 간단합니다. aabb와 유사한 문자열을 함께 연결하기만 하면 됩니다. 중간 ab가 필터링되면 새로운 ab가 생성됩니다. 여기에는….//로 적어주세요. 따라서 stringreplace의 필터링 방법은 not과 동일합니다.
· .php 접미사 문제입니다. 분명히 웹사이트는 모든 요청 경로에 .php 접미사를 추가합니다. Google에서 우회 전략을 검색했는데 크게 두 가지 유형이 있습니다. 1) 최대 파일 경로 길이인 4096바이트를 사용한 다음 /를 임의의 수만큼 추가하여 매우 긴 파일 경로를 구성합니다. 생각해 보니 이렇게 긴 URL은 서버에서 가로채어 414를 반환할 것으로 추정되므로 시도하지 않았습니다. 2) C에서 문자열 종결자를 사용하고 .php 앞에 종결자를 추가하여 잘림을 나타냅니다. 예를 들어 %00을 사용하는 것이 일반적인데 시도해 보았지만 실패했습니다. 나중에 예시에서 찾았어요 위 내용은 보안 무시 해킹 챌린지 문제 해결 아이디어를 요약해서 소개한 것입니다. - 고급 내용의 측면을 포함하여, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.