>  기사  >  운영 및 유지보수  >  스마티 SSTi 사용 방법

스마티 SSTi 사용 방법

WBOY
WBOY앞으로
2023-05-15 11:37:061030검색

문제 설명

질문은 XFF 헤더를 읽기 위한 API를 제공합니다. 페이지 하단에 Build With Smarty라는 단어가 있는데 Smarty 엔진으로 작성되었다고 판단할 수 있습니다.

기본적으로는 이 페이지에는 SSTi 가능성이 존재합니다

Smarty SSTi怎么用

xff 헤더를 127.0.0.1에서 127.0.0{1+2}으로 변경하면 다음 결과가 나타납니다

ssti는 의심의 여지가 없습니다

Smarty SSTi怎么用

최종 페이로드는 다음과 같습니다.

X-Forwarded-For: {if var_dump(file_get_contents ('/flag')) }{/if}

Smarty SSTi怎么用

Smarty SSTI Utilization

Smarty는 PHP를 기반으로 개발되었습니다. Smarty의 SSTI를 활용하는 방법입니다. 일반적인 플라스크의 SSTI와는 매우 다릅니다.

취약점 확인

일반적으로 {$smarty.version}을 입력하면 반환된 smarty 버전 번호를 확인할 수 있습니다. 이 질문의 Smarty 버전은 3.1.30

Smarty SSTi怎么用

General Usage

Smarty는 {php}{/php} 태그를 사용하여 그 안에 포함된 PHP 명령을 실행하는 것을 지원합니다. 가장 일반적인 아이디어는 태그를 먼저 테스트하는 것입니다. . 하지만 이 주제에 관한 한, {php}{/php} 태그를 사용하면 오류가 보고됩니다.

Smarty SSTi怎么用

Smarty3의 공식 매뉴얼에는 다음과 같은 설명이 있습니다:

Smarty가 {php} 태그를 버렸습니다. , 사용하지 않는 것이 좋습니다. Smarty 3.1에서는 {php}를 SmartyBC에서만 사용할 수 있습니다.

이 질문은 Smarty 클래스를 사용하므로 다른 방법을 찾을 수 밖에 없습니다.

{literal} 태그

공식 매뉴얼에서는 이 태그에 대해 다음과 같이 설명하고 있습니다.

{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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제