it-swarm-korea.com

테스트 PHP 폼 주입

양식을 통해 입력하는 매우 작은 PHP 앱을 작성 중입니다. 첫 번째 개정에서 예상 할 수 있듯이, 코드는 입력을 피하거나 이탈하지 않습니다.

if( $_POST["var"] != "" ) {
    print "Current value: ".$_POST["var"]."\n";
}

그러나 PHP 코드 ("; print phpinfo();, "등)를 주입하려고하면 실행하는 대신 다시 에코됩니다.

htmlspecialchars, addcslashes, mysqli_real_escape_string 등을 사용하여 입력을 정리하는 방법을 알고 있지만 사용하기 전에 임의의 PHP 코드?

내 컴퓨터에 PHP Suhosin 패치 (Ubuntu 10.10)가 설치되어 있음을 알았습니다. 입력이 자동으로 이스케이프 처리되거나 제염 될 수 있습니까?

7
Andrew

이 코드의 경우 PHP 주입을 기대하지는 않지만 대신 XSS (Cross-Site Scripting)를 살펴 보겠습니다.

예를 들어 다음을 주입하십시오.

<script> alert('woot Security.SE rulez!');</script>
9
AviD

응용 프로그램이 include (), require (), eval (), create_function () 또는 인터프리터를 호출하는 유사한 함수를 사용하지 않는 한 "PHP 주입"은 불가능합니다. 또는 응용 프로그램이 .php, .phtml 또는 기타 PHP 등록 된 파일 확장자)로 끝나는 PHP 경로의 파일에 기록하는 경우.

그러나 AviD에서 지적한 것처럼 예제에서 마크 업 및 스크립트 삽입이 가능합니다.

"Tamper Data"를 다운로드 해보십시오. 웹 응용 프로그램에 대한 주입 공격을 쉽게 수행 할 수 있도록하는 Firefox 부가 기능입니다. 자신을 알지 못하는 경우 시도 할 수있는 기본 공격도 있습니다!

4
Mark E. Haase

참고로 stripcslashes를 사용하지 않을 수도 있습니다 .XSS를 유발할 수도 있습니다.

설명하겠습니다 : stripslashes vs stripcslashes

stripslashes는 유형에 관계없이 모든 백 슬래시를 제거합니다

stripcslashes는 16 진 문자를 제외한 모든 백 슬래시를 제거하므로, 다음과 같은 방법으로 stripcslashes를 사용하는 함수에 대해 XSS 공격을 수행 할 수 있습니다.

\\x3c\\x73\\x63\\x72\\x69\\x70\\x74\\x3e\\x61\\x6c\\x65\\x72\\x74\\x28\\x27\\x58\\x53\\x53\\x21\\x27\\x29\\x3b\\x3c\\x2f\\x73\\x63\\x72\\x69\\x70\\x74\\x3e

Stripcslashes 함수로 평가하면 다음과 같은 결과가 발생합니다. alert ( 'XSS!');

이것은 실제로 인기있는 Wordpress 플러그인 (Platinum SEO <= 1.3.7)에서 발견 된 취약점이었습니다)

가치보다 더 많은 문제를 일으킬 수 있으므로 사용하기 전에 사용중인 기능에 대한 조사를 수행하십시오.

addcslashes () 사용에도 적용됩니다. 원하지 않는 코드를 강제로 평가할 수 있습니다.

$>php -r 'echo addcslashes("\x41", "A..z");' 
\A   

그리고 잘못된 XSS 문자열에 사용되는 기본 예는 다음과 같습니다.

> php -r 'echo addcslashes("\x3c\x73\x63\x72\x69\x70\x74\x3e\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x21\x27\x29\x3b\x3c\x2f\x73\x63\x72\x69\x70\x74\x3e", "/");'   
<script>alert('XSS!');<\/script>

보시다시피, 여전히 경고를 실행합니다.

Mehaase가 확인했듯이 include (), require (), eval (), system ()과 같은 것을 사용하지 않고 PHP 코드를 호출 할 수있는 방법은 없습니다. PHP 임의 코드 실행)보다 사용자 입력에 system ()을 사용하고 있습니다.

2
DarkMantis