이 기사에서 공유한 내용은 PHP의 약한 유형 변환에 관한 것입니다. 이 내용은 도움이 필요한 친구들에게 큰 도움이 되기를 바랍니다.
1 서문
최근 CTF 대회에서 PHP 약한 유형에 대한 질문이 여러 번 나왔습니다. PHP 약한 유형과 이를 우회하는 방법을 요약하고 싶습니다.
2 지식 소개
php에는 ==와 ===
1 <?php 2 $a = $b ; 3 $a===$b ; 4 ?>
=== 두 가지 비교 기호가 있습니다. 두 문자열의 타입이 같은지 먼저 판단 후 비교
== 비교 시 문자열 타입을 먼저 동일하게 변환한 후 비교
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行
#🎜 🎜#여기서는 값을 문자열과 비교하면 문자열이 값으로 변환된다고 명시되어 있습니다.
1 <?php 2 var_dump("admin"==0); //true 3 var_dump("1admin"==1); //true 4 var_dump("admin1"==1) //false 5 var_dump("admin1"==0) //true 6 var_dump("0e123456"=="0e4456789"); //true 7 ?> //上述代码可自行测试1 위의 코드 "admin"=을 준수하세요. =0 비교 이때 admin은 숫자값으로 변환되어 강제 변환됩니다. admin은 문자열이므로 변환 결과는 0이므로 당연히 0이 됩니다.
2 "1admin"==1 일 때 비교하면 1admin이 숫자로 변환되어 결과가 1이 되는데 "admin1"==1은 오류, 즉 "admin1"이 0으로 변환되는 이유는 무엇일까요? ? 3 "0e123456"=="0e456789" 0e와 같은 문자열은 서로 비교하면 과학기술법상 숫자로 인식됩니다. 0의 거듭제곱은 0이므로 같습니다#🎜🎜 #
# 🎜🎜#
위 문제에 대해서는 php 매뉴얼을 확인해보니
문자열을 숫자로 처리할 경우 결과와 타입은 다음과 같습니다: 문자열에 '.', 'e', 'E'가 포함되지 않고 해당 숫자 값이 정수 문자열의 범위 내에 있는 경우#문자열은 int로 처리되며, 그 외의 모든 문자열은 int로 처리됩니다. float로 처리되는 경우 문자열의 시작 부분이 해당 값을 결정합니다. 문자열이 유효한 값으로 시작하면 해당 값이 사용됩니다. 그렇지 않으면 해당 값은 0입니다.
1 <?php 2 $test=1 + "10.5"; // $test=11.5(float) 3 $test=1+"-1.3e3"; //$test=-1299(float) 4 $test=1+"bob-1.3e3";//$test=1(int) 5 $test=1+"2admin";//$test=3(int) 6 $test=1+"admin2";//$test=1(int) 7 ?>
이것이 "admin1"==1 =>False인 이유를 설명합니다
3 실제 전투md5 우회( 해시 비교 결함)
1 <?php
2 if (isset($_GET['Username']) && isset($_GET['password'])) {
3 $logined = true;
4 $Username = $_GET['Username'];
5 $password = $_GET['password'];
6
7 if (!ctype_alpha($Username)) {$logined = false;}
8 if (!is_numeric($password) ) {$logined = false;}
9 if (md5($Username) != md5($password)) {$logined = false;}
10 if ($logined){
11 echo "successful";
12 }else{
13 echo "login failed!";
14 }
15 }
16 ?>
질문의 주요 아이디어는 문자열과 숫자 유형을 입력하고 md5 값이 동일하면 다음 명령문을 성공적으로 실행할 수 있습니다 # 🎜🎜#소개 1 0e로 시작하는 배치 md5 문자열은 위에 언급되어 있습니다.
0e는 비교 시 과학적 표기법으로 간주되므로 0e 뒤에 무엇이 오더라도 0의 거듭제곱은 여전히 0입니다#🎜 🎜# .md5('240610708') == md5('QNKCDZO')
우회에 성공했습니다!QNKCDZO 0e830400451993494058024219903391 s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387a 0e848240448830537924465865611904 s214587387a 0e848240448830537924465865611904 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s1885207154a 0e509367213418206700842008763514json 우회
<?php if (isset($_POST['message'])) { $message = json_decode($_POST['message']); $key ="*********"; if ($message->key == $key) { echo "flag"; } else { echo "fail"; } } else{ echo "~~~~"; } ?>json 입력 문자열 , json_decode 함수는 이를 배열로 해독하고 배열의 키 값이 $key 값과 같은지 확인하지만 $key 값을 모릅니다. 그러나 우리는 양식 0=="admin" 우회
최종 페이로드 메시지={"key":0}
array_search is_array 우회1 <?php 2 if(!is_array($_GET['test'])){exit();} 3 $test=$_GET['test']; 4 for($i=0;$i<count($test);$i++){ 5 if($test[$i]==="admin"){ 6 echo "error"; 7 exit(); 8 } 9 $test[$i]=intval($test[$i]); 10 } 11 if(array_search("admin",$test)===0){ 12 echo "flag"; 13 } 14 else{ 15 echo "false"; 16 } 17 ?>위는 내가 작성한 것입니다. 먼저 들어오는 값이 배열인지 확인한 다음 배열의 각 값을 반복하고 배열의 각 값은 admin과 같을 수 없으며 각각을 변환합니다. 값을 int 형식으로 입력한 다음 수신 배열에 admin이 포함되어 있는지 확인합니다. 그렇다면 플래그payload test[]=0을 우회할 수 있습니다다음 array_search# 공식 매뉴얼 소개입니다. 🎜🎜#
mixed array_search ( mixed $needle , array $haystack [, bool $strict = false ] )
$needle, $haystack은 필수, $strict는 선택 사항입니다. 이 함수는 $haystack의 값이 $needle에 있는지 확인하고 해당 키 값을 반환합니다. 세 번째 매개변수의 기본값은 false입니다. true로 설정하면 엄격한 필터링이 수행됩니다.
1 <?php 2 $a=array(0,1); 3 var_dump(array_search("admin",$a)); // int(0) => 返回键值0 4 var_dump(array_seach("1admin",$a)); // int(1) ==>返回键值1 5 ?>
array_search 함수는 ==와 유사합니다. 즉, $a=="admin" 물론 $a=0 물론 세 번째 매개변수가 true이면 우회할 수 없습니다# 🎜🎜#
strcmp 취약점 우회 php -v1 <?php 2 $password="***************" 3 if(isset($_POST['password'])){ 4 5 if (strcmp($_POST['password'], $password) == 0) { 6 echo "Right!!!login success";n 7 exit(); 8 } else { 9 echo "Wrong password.."; 10 } 11 ?>strcmp는 두 문자열을 비교합니다 , str1
payload: 비밀번호[]=xxx
switch Bypass
1 <?php 2 $a="4admin"; 3 switch ($a) { 4 case 1: 5 echo "fail1"; 6 break; 7 case 2: 8 echo "fail2"; 9 break; 10 case 3: 11 echo "fail3"; 12 break; 13 case 4: 14 echo "sucess"; //结果输出success; 15 break; 16 default: 17 echo "failall"; 18 break; 19 } 20 ?>
이 원리는 앞의 원리와 유사하므로 자세히 설명하지 않겠습니다
4 요약
이러한 PHP 약한 유형은 위의 내용은 코드 감사의 중요성을 확인합니다
관련 권장 사항:
#🎜 🎜#PHP에서 var 키워드 사용 예
php 대기열 처리: PHP 메시지 대기열 구현 원리(그림 및 텍스트)
위 내용은 PHP에서 약한 유형 변환 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

절대 세션 시간 초과는 세션 생성시 시작되며, 유휴 세션 시간 초과는 사용자가 작동하지 않아 시작합니다. 절대 세션 타임 아웃은 금융 응용 프로그램과 같은 세션 수명주기의 엄격한 제어가 필요한 시나리오에 적합합니다. 유휴 세션 타임 아웃은 사용자가 소셜 미디어와 같이 오랫동안 세션을 활성화하려는 응용 프로그램에 적합합니다.

서버 세션 고장은 다음 단계를 따라 해결할 수 있습니다. 1. 서버 구성을 확인하여 세션이 올바르게 설정되었는지 확인하십시오. 2. 클라이언트 쿠키를 확인하고 브라우저가 지원하는지 확인하고 올바르게 보내십시오. 3. Redis와 같은 세션 스토리지 서비스가 정상적으로 작동하는지 확인하십시오. 4. 올바른 세션 로직을 보장하기 위해 응용 프로그램 코드를 검토하십시오. 이러한 단계를 통해 대화 문제를 효과적으로 진단하고 수리 할 수 있으며 사용자 경험을 향상시킬 수 있습니다.

session_start () iscrucialinphpformanagingUsersessions.1) itiniteSanewsessionifnoneexists, 2) ResumesAnxistessions, and3) setSasessionCookieForContInuityAcrosrequests, enablingplicationsirecationSerauthenticationAndpersonalizestContent.

XSS 공격을 효과적으로 방지하고 사용자 세션 정보를 보호 할 수 있기 때문에 httponly 플래그를 설정하는 것은 세션 쿠키에 중요합니다. 구체적으로, 1) httponly 플래그는 JavaScript가 쿠키에 액세스하는 것을 방지합니다. 2) PHP 및 Flask에서 SetCookies 및 Make_response를 통해 깃발을 설정할 수 있습니다. 3) 모든 공격으로부터 방지 할 수는 없지만 전체 보안 정책의 일부가되어야합니다.

phpssessionssolvetheproblemofmainingstateacrossmultiplehtttprequestsbystoringdataontheserversociatingititwithauniquessessionid.1) theStoredAserver-side, 일반적으로, 일반적으로 and insessionsecietoretoretrievedata.2) sessionsenhances

phpsessionscanstorestrings, 숫자, 배열 및 객체 1.Strings : TextDatalikeUsernames.2.numbers : integorfloatsforcounters.3.arrays : listslikeshoppingcarts.4.objects : complexStructuresThatareserialized.

세션 재생은 세션 고정 공격의 경우 사용자가 민감한 작업을 수행 할 때 새 세션 ID를 생성하고 이전 ID를 무효화하는 것을 말합니다. 구현 단계에는 다음이 포함됩니다. 1. 민감한 작업 감지, 2. 새 세션 ID 생성, 3. 오래된 세션 ID 파괴, 4. 사용자 측 세션 정보 업데이트.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.