Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Cara menggunakan Smarty SSTi

Cara menggunakan Smarty SSTi

WBOY
WBOYke hadapan
2023-05-15 11:37:061093semak imbas

Perihalan masalah

Soalan menyediakan api untuk membaca pengepala XFF terdapat perkataan Bina Dengan Smarty di bahagian bawah halaman Ia boleh ditentukan bahawa ia ditulis menggunakan enjin Smarty.

Pada asasnya ia berfungsi Tentukan kemungkinan SSTi pada halaman ini

Smarty SSTi怎么用

Tukar pengepala xff daripada 127.0.0.1 kepada 127.0.0{1+2} dan yang berikut keputusan akan muncul

ssti Tidak syak lagi

Smarty SSTi怎么用

Muatan akhir ialah

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

Smarty SSTi怎么用

Penggunaan SSTI Smarty

Smarty dibangunkan berdasarkan PHP menggunakan SSTI Smarty adalah sama dengan SSTI kelalang biasa.

Pengesahan Kerentanan

Secara amnya, anda boleh melihat nombor versi smarty yang dikembalikan dengan memasukkan {$smarty.version}. Versi Smarty bagi soalan ini ialah 3.1.30

Smarty SSTi怎么用

Penggunaan Umum

Smarty menyokong menggunakan tag {php}{/php} untuk melaksanakan perintah php yang dibalut , idea yang paling konvensional ialah menguji teg terlebih dahulu. Tetapi setakat topik ini, menggunakan teg {php}{/php} akan melaporkan ralat:

Smarty SSTi怎么用

Manual rasmi Smarty3 mempunyai penerangan berikut:

Smarty telah menamatkan teg {php} dan amat disyorkan untuk tidak menggunakannya. Dalam Smarty 3.1, {php} hanya tersedia dalam SmartyBC.

Soalan ini menggunakan kelas Smarty, jadi kami hanya boleh mencari jalan lain.

Teg {literal}

Manual rasmi menerangkan teg ini seperti berikut:

{literal} boleh menyebabkan aksara dalam kawasan templat dikeluarkan seperti sedia ada . Ini sering digunakan untuk melindungi lembaran gaya Javascript atau CSS pada halaman daripada dihuraikan secara salah disebabkan oleh pembatas Smarty.

Kemudian untuk persekitaran php5, kita boleh menggunakan

<script language="php">phpinfo();</script>

untuk melaksanakan pelaksanaan kod PHP Walau bagaimanapun, persekitaran soalan soalan ini ialah PHP7, jadi kaedah ini tidak sah.

Kaedah statik

Dapatkan kelas Smarty melalui kendiri dan kemudian panggil kaedah statiknya untuk membaca dan menulis fail, yang digunakan oleh banyak artikel di Internet.

Kod kaedah getStreamVariable kelas Smarty adalah seperti berikut:

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;
      }
  }

Anda boleh melihat bahawa kaedah ini boleh membaca fail dan mengembalikan kandungannya, jadi kami boleh menggunakan diri untuk mendapatkan Smarty object dan panggil kaedah ini , muatan yang diberikan dalam banyak artikel adalah dalam bentuk: {self::getStreamVariable("file:///etc/passwd")}. Walau bagaimanapun, menggunakan muatan ini akan mencetuskan ralat berikut:

Ralat maut: Tidak ditangkap --> Ralat sintaks dalam templat "rentetan: IP Semasa:{self::getStreamVariable('file:///etc/passwd')}" kelas statik 'self' tidak ditentukan atau tidak dibenarkan oleh tetapan keselamatan <-- dibuang ke dalam /var/www/html/ smarty/ libs/sysplugins/smarty_internal_templatecompilerbase.phpon line 12

Ia boleh dilihat bahawa kaedah penggunaan SSTI versi lama Smarty ini tidak boleh digunakan pada versi baharu Smarty. Selain itu, kaedah statik ini telah dipadamkan secara rasmi dalam versi Smarty 3.1.30. Kaedah writeFile kelas Smarty_Internal_Write_File yang disebut dalam artikel tersebut untuk menulis shell tidak boleh digunakan atas sebab yang sama.

{if} tag

Saya melihat penerangan ini dalam dokumentasi rasmi:

Smarty's {if} penghakiman bersyarat sangat serupa dengan PHP jika, dengan hanya tambahan beberapa ciri. Setiap {if} mesti mempunyai padanan {/if} Anda juga boleh menggunakan {else} dan {elseif} Semua ungkapan dan fungsi bersyarat PHP boleh digunakan di dalam jika, seperti ||, atau, &&, dan, is_array() , dsb.

Memandangkan semua fungsi PHP boleh digunakan, bolehkah kita menggunakan ini untuk melaksanakan kod kita?

Seperti yang dinyatakan pada permulaan

Kod kelemahan soalan

dibaca melalui fail selepas getshell Kod yang menyebabkan SSTI dalam soalan ini dipermudahkan seperti berikut:

display("string:".$ip);
}

Anda dapat melihat bahawa rentetan digunakan dan bukannya templat pintar, yang menyebabkan teg Smarty yang disuntik dihuraikan dan dilaksanakan secara langsung, menghasilkan SSTI.

Atas ialah kandungan terperinci Cara menggunakan Smarty SSTi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam