질문은 XFF 헤더를 읽기 위한 API를 제공합니다. 페이지 하단에 Build With Smarty라는 단어가 있는데 Smarty 엔진으로 작성되었다고 판단할 수 있습니다.
기본적으로는 이 페이지에는 SSTi 가능성이 존재합니다
xff 헤더를 127.0.0.1에서 127.0.0{1+2}으로 변경하면 다음 결과가 나타납니다
ssti는 의심의 여지가 없습니다
최종 페이로드는 다음과 같습니다.
X-Forwarded-For: {if var_dump(file_get_contents ('/flag')) }{/if}
Smarty는 PHP를 기반으로 개발되었습니다. Smarty의 SSTI를 활용하는 방법입니다. 일반적인 플라스크의 SSTI와는 매우 다릅니다.
일반적으로 {$smarty.version}을 입력하면 반환된 smarty 버전 번호를 확인할 수 있습니다. 이 질문의 Smarty 버전은 3.1.30
Smarty는 {php}{/php} 태그를 사용하여 그 안에 포함된 PHP 명령을 실행하는 것을 지원합니다. 가장 일반적인 아이디어는 태그를 먼저 테스트하는 것입니다. . 하지만 이 주제에 관한 한, {php}{/php} 태그를 사용하면 오류가 보고됩니다.
Smarty3의 공식 매뉴얼에는 다음과 같은 설명이 있습니다:
Smarty가 {php} 태그를 버렸습니다. , 사용하지 않는 것이 좋습니다. Smarty 3.1에서는 {php}를 SmartyBC에서만 사용할 수 있습니다.
이 질문은 Smarty 클래스를 사용하므로 다른 방법을 찾을 수 밖에 없습니다.
공식 매뉴얼에서는 이 태그에 대해 다음과 같이 설명하고 있습니다.
{literal}을 사용하면 템플릿 영역의 문자가 그대로 출력될 수 있습니다. 이는 페이지의 Javascript 또는 CSS 스타일시트가 Smarty 구분 기호로 인해 잘못 구문 분석되는 것을 방지하는 데 자주 사용됩니다.
그런 다음 php5 환경의 경우
<script language="php">phpinfo();</script>
를 사용하여 PHP 코드 실행을 구현할 수 있지만 이 질문의 질문 환경은 PHP7이므로 이 방법은 유효하지 않습니다.
self를 통해 Smarty 클래스를 가져온 다음 정적 메서드를 호출하여 파일을 읽고 쓰는 방식은 인터넷의 많은 기사에서 채택되었습니다.
Smarty 클래스의 getStreamVariable 메소드 코드는 다음과 같습니다.
public function getStreamVariable($variable) { $_result = ''; $fp = fopen($variable, 'r+'); if ($fp) { while (!feof($fp) && ($current_line = fgets($fp)) !== false) { $_result .= $current_line; } fclose($fp); return $_result; } $smarty = isset($this->smarty) ? $this->smarty : $this; if ($smarty->error_unassigned) { throw new SmartyException('Undefined stream variable "' . $variable . '"'); } else { return null; } }
이 메소드는 파일을 읽고 해당 내용을 반환할 수 있으므로 self를 사용하여 Smarty 객체를 가져오고 이 메소드를 호출할 수 있습니다. 많은 기사에 제공된 페이로드의 형식은 {self::getStreamVariable("file:///etc/passwd")}입니다. 그러나 이 페이로드를 사용하면 다음 오류가 발생합니다.
Fatal error: Uncaught --> Smarty Compiler: Syntax error in template "string:Current IP:{ self: :getStreamVariable('file:///etc/passwd')}" 정적 클래스 'self'는 정의되지 않았거나 보안 설정에 의해 허용되지 않습니다. <-- /var/www/html/smarty/libs/sysplugins/에 던져짐 smarty_internal_templatecompilerbase.phpon line 12
이 이전 버전의 Smarty의 SSTI 활용 방법은 새 버전의 Smarty에는 적용되지 않음을 알 수 있습니다. 또한 이 정적 메서드는 Smarty 버전 3.1.30에서 공식적으로 삭제되었습니다. 해당 기사에서 쉘 작성을 위해 언급된 Smarty_Internal_Write_File 클래스의 writeFile 메소드도 같은 이유로 사용할 수 없습니다.
{if} 태그
공식 문서에서 이 설명을 참조하세요:
Smarty의 {if}
条件判断和PHP的if 非常相似,只是增加了一些特性。每个{if}
必须有一个配对的{/if}
. 也可以使用{else}
和{elseif}
모든 PHP 조건식 및 함수는 ||, &&, is_array () 등과 같이 if 내에서 사용할 수 있습니다. .
모든 PHP 함수를 사용할 수 있는데, 이를 이용해 코드를 실행할 수 있나요?
서두에서 언급했듯이
는 getshell 이후 파일을 통해 읽혀집니다. 이 질문에서 SSTI를 유발하는 코드는 다음과 같이 단순화됩니다.
display("string:".$ip); }여기에서는 대신 문자열이 사용되는 것을 볼 수 있습니다. 주입으로 이어지는 smarty 템플릿의 수 Smarty 태그를 직접 구문 분석하고 실행하여 SSTI가 발생합니다.
위 내용은 스마티 SSTi 사용 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!