이 기사는 CTF의 일반적인 PHP 취약점에 대해 소개합니다(그림 및 텍스트 요약). 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
보통 이런 질문을 많이 접하는데, 기억력이 나쁘면 잊어버리기 쉬우니, 기억력이 깊어질 수 있도록 꼼꼼히 정리해볼게요! ! !
一. md5() 취약점, PHP가 해시 문자열을 처리할 때 "!=" 또는 "=="를 사용하여 해시 값을 비교하고 각각 "0E"로 시작합니다. 해시 값 모두 0으로 해석되므로 해싱 후 서로 다른 두 비밀번호의 해시 값이 "0E"로 시작하면 PHP는 두 비밀번호가 동일하다고 간주하여 둘 다 0입니다.
다음은 md5 처리 후 0e로 시작하는 몇 가지 예입니다.
s878926199a
0e545993274517709034328855841020
s155964671a
0e34276841682245152497411 72 54469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
실험을 해보자:
결과. . . 예상했던대로
따라서 md5로 암호화된 문자열을 제어할 수 있는 경우(즉, 입력을 제어할 수 있는 경우) 취약점이 발생할 수 있습니다! ! !
물론, 더 흥미로운 점은 md5가 배열을 처리할 수 없다는 것입니다. 다음도 실험입니다.
두 개의 서로 다른 배열을 전달합니다.
경고가 있더라도 여전히 우회할 수 있다는 것을 알 수 있습니다(경고를 표시하고 싶지 않은 경우 앞에 @ 기호를 추가하세요):
하지만 배열을 처리할 때 무엇이 반환될지 모르므로 시도해 보세요.
var_dump():
은 비어 있습니다! ! ! 배열을 처리할 때 NULL 값이 반환된다는 점에 유의하세요.
md5(str)==0을 우회하는 방법은 여러 가지가 있습니다. 요약하자면:
0 또는 0e로 시작하면
배열
을 우회합니다. 예, 예를 들어 "c9f0f895fb98ab9159f51fd0297e236d"==0이 설정되었습니다! ! ! , 문자열을 정수로 변환하는 데 사용됩니다! ! ! , 처음에 숫자가 없으면 0으로만 변환 가능! !
II. strcmp() 함수 취약점,
strcmp() 함수는 두 문자열을 비교하는 데 사용됩니다.
strcmp (string$ str1, string$ str2)
parameter str1 first string.str2 first 두 문자열. str1이 str2보다 작으면 둘이 같으면 0을 반환합니다. 이 함수 매개변수(객체, 배열 등)에 잘못된 매개변수가 있으면 오류가 보고되고 0이 반환됩니다! ! ! (이 취약점은 5.3 이전의 PHP에 적용됩니다. 이 컴퓨터에서 시도했지만 수행할 수 없음을 발견했습니다. 무슨 일이 일어났는지 모르겠습니다.) 다음은 BUGKU 코드로 감사된 질문의 예입니다.
그림과 같이 strcmp 취약점에 따라 배열을 전달해 보세요.
배열을 전달하면 strcmp 오류가 발생하고 반환되므로 우회됩니다! ! ! strcmp()와 동일한 또 다른 함수 strcasecmp()가 있습니다. strcmp()는 대소문자를 구분하지만 strcasecmp()는 모두 동일한 방식으로 우회할 수 있습니다.
위 내용은 CTF의 일반적인 PHP 취약점 소개(그래픽 요약)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!