题目来源:2023MOECTF
题目简述
先来看题,很经典的一个文件上传:

Debug
看起来没什么问题,那就先debug一下,先上传一个正常的文件,发现返回了地址,点击查看观察地址组成,发现这个地址被images.php处理过,不能直接利用:

尝试访问一个不存在的地址,发现返回错误:

发现有函数file_get_contents(),搜索发现,此函数可能会导致文件包含或者目录穿越,尝试发现有目录穿越漏洞,以下是关于目录穿越的知识:
什么是目录遍历?
目录遍历(目录穿越)是一个Web安全漏洞,攻击者可以利用该漏洞读取运行应用程序的服务器上的任意文件。 这可能包括应用程序代码和数据,后端系统的登录信息以及敏感的操作系统文件。
在某些情况下,攻击者可能能够在服务器上写入任意文件,(如,FFFTP是一款小型的FTP客户端软件。FFFTP客户端没有正确地验证FTP服务器所返回的LIST命令响应中包含有目录遍历序列(斜线)的文件名,如果用户受骗从恶意的FTP服务器下载的目录包含有带有恶意文件名的文件的话,就可能导致向用户系统的任意位置写入文件)从而允许他们修改应用程序数据或行为,并最终完全控制服务器。
漏洞原理
若web要显示一个商品的图像,有时候开发者会用通过HTML加载,如:
Read More
题目来源:2023MOECTF
题目简述
用浏览器访问,发现是这样,结合题目给的附件,应该是要发送json数据来得到flag:

思路过程
查看附件,发现给出了/register,/login,/flag等地址,判断是要我们注册用户,登录后用get请求得到flag,使用postman发送json数据,方便快捷。先试了一下附件给出的账号,注册发现用户已存在,而且登录密码也不正确,所以需要自己注册一个用户:



注册和登录都返回ok,但是获取flag时返回了一个假flag,并提示我们不是admin,根据题目cookie,判断问题出在cookie上,查看cookie发现有一个token,内容如下:
token=eyJ1c2VybmFtZSI6ICJodXN0bGVyIiwgInBhc3N3b3JkIjogIjEyMzQ1NiIsICJyb2xlIjogInVzZXIifQ==
看着末尾的两个大等号,说明这有可能时base64,进行base64解码后的数据是这样的:
{"username": "hustler", "password": "123456", "role": "user"}
显然,我们将role的值改为admin,即:
{"username": "hustler", "password": "123456", "role": "admin"}
Read More
题目来源:2023MOECTF
题目概述

一道经典的文件上传,看到这个思路马上就来了,就是上传一个php一句话木马,然后用蚁剑回连
初步尝试
我们先抓个包看看,这里有一个小插曲,就是如果我用127.0.0.1这个环回地址来访问,burp是抓不到包的,用局域网中的ip加端口号来访问就可以抓到包,配置好burp和浏览器的代理,先任意上传一个文件,得到如下提示:

抓包并修改文件后缀为png发现能够上传,说明这是一个前端验证,很好绕过
我们再次尝试,这次传一个符合要求的文件:


发现上传成功,并返回了一个地址,但是直接访问这个地址会返回404,根据抓包结果以及题目的hint,猜想正确地址应该只有upload以及后面的url,尝试发现可以访问。
那么,我们是不是只要通过抓包修改后缀绕过前端,就可以上传php木马了呢?
进一步尝试
首先我们先构造一个一句话木马,使用文本编辑器编写,完成后将后缀改为png,下面附上一句话木马的基本知识:
什么是一句话木马
一句话木马就是只需要一行代码的木马,短短一行代码,就能做到和大马相当的功能。为了绕过waf的检测,一句话木马出现了无数中变形,但本质是不变的:木马的函数执行了我们发送的命令。
我们如何发送命令,发送的命令如何执行?
Read More
题目来源:2023MOECTF
题目概述
题目给了一个pyc文件,我们尝试在线反编译后获得源文件:
import base64
from string import *
str1 = 'yD9oB3Inv3YAB19YynIuJnUaAGB0um0='
string1 = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba0123456789+/'
string2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
flag = input('welcome to moectf\ninput your flag and I wiil check it:')
enc_flag = base64.b64encode(flag.encode()).decode()
enc_flag = enc_flag.translate(str.maketrans(string2, string1))
if enc_flag == str1:
print('good job!!!!')
else:
print('something wrong???')
exit(0)
分析加密
审计程序逻辑发现,程序的具体逻辑是,我们输入一个字符串,然后程序对这个字符串进行base64编码,然后通过某个映射加密这组字符串,然后将这组字符串和str1对比,如果相同即为flag,所以str1这个变量即是加密后的flag,我们需要对str1进行逆向。
我们要反向映射str1这个字符串,查找发现,maketrans函数的作用是创建一个将string1用string2替换的映射表,而maketrans就是使用这个映射表处理字符串。那么转念一想,我们反向映射,只要将函数中string1和string2的位置交换,创建一个将string2用string1来替换的映射表,再用这个新的映射表来处理str1,不就反映射成功了吗?
编写POC
说干就干,修改了以下题目的py脚本,反向映射str1,脚本如下:
import base64
from string import *
str1 = 'yD9oB3Inv3YAB19YynIuJnUaAGB0um0='
string1 = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba0123456789+/'
string2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
f=str1.translate(str.maketrans(string1,string2))
print(f)
运行得到反映射结果:

再使用base64解码,得到flag:

Read More
题目来源:其他CTF
题目简述

大致就是一个“买”unicorn的商店,尝试购买,发现价格处只能填写一个字符,并且最后一个商品要1337四位数的价格,显然,题目要求我们使用一个字符来购买这个四位数价格的商品
思路简析
我们先什么都不输入,尝试寻找报错:

发现需要输入一个只占一个字符的unicode字符,那么有没有只占一个字符,但又能表示1337以上的数字的unicode字符呢?找到这样一个网站:https://www.compart.com/en/unicode 查到这个数值表示10000的字符:

由于提交要使用url编码,所以把0xE1 0x8D 0xBC换成%E1%8D%BC即可
拿flag


得到flag
反思总结
1.有时候会遇到一些很刁钻的知识点,不懂真的做不出来
Read More
来源:其他CTF
题目简述

审计代码,题目大意是让我们将username变为admin就会给flag
思路过程
我们需要传入参数,但是遇到这种改怎么传参呢?我们注意到源代码有if($_GET['user'])
这样一段,这样的代码就是php获取网址后的参数的,比方这里就是获取user的值,那么我们传参时就可以写?user=需要传入的数据
这种结构是可以直接写在网址后面的。
知道了如何传参,那我们要传入什么数据呢?我们注意到,题目里有一个unserialize()
函数,这就是反序列化函数,那什么是序列和反序列呢?以下摘录网络的解释:
php程序为了保存和转储对象,提供了序列化的方法。php序列化是为了在程序运行的过程中对对象进行转储而产生的。序列化可以将对象转换成字符串,但仅保留对象里的成员变量,不保留函数方法。
php序列化的函数为serialize,可以将对象中的成员变量转换成字符串。
反序列化的函数为unserilize,可以将serialize生成的字符串重新还原为对象中的成员变量。
将用户可控的数据进行了反序列化,就是PHP反序列化漏洞。
序列化
序列化的目的是方便数据的传输和存储。
Read More
题目来源:2023MOECTF
题目简述

满足题目的5点要求即可得到flag
使用Postman
要满足这些要求,有一个十分好用的工具叫postman,它是一个浏览器插件,也有exe的版本,这里我选用了exe版本的postman
使用post请求
直接修改postman的设置,如图:

满足use parameter: UwU=u
在postman的params一栏里设置,也可以直接在网站后面加:

满足post form: Luv=u
Read More
设计思路
灵感来源于watch dogs里面的黑客无人机,以树莓派+pixhawk为主体,搭载大疆F450机架,配以2000毫安锂电池,可以凭借pixhawk出色的飞控能力,以及树莓派优秀的运算能力,在空中完成近源渗透,人脸识别,数据转发(星链),无人机送货等多项功能。
注意:建议先给pixhawk和树莓派刷入固件,调试好各项参数(根据情况可以无线调试,建议先调试完可以无线调试的项目),再组装飞机(gps,电机电调调试必须先组装好飞机),不一定要按照文章顺序来做
材料准备
大概要这些

F450机架(动力套装)
如果懂得焊接可以更自由的购买电机电调来组装,不懂焊接的建议直接咸鱼(淘宝上很少或者没有组装好的)买F450的动力套装,因为动力套装插上飞控就可以操作,不需焊接,购买前请注意是否真的不需要焊接。


减震板
Read More
题目来源:2023MOECTF
题目简述


题目给出了一个网站,点击左侧相应的汽车名字就会出现相应的图片和数据。一看没什么问题,那么我们就上burp,给浏览器设置代理,访问192.168.1.101,为什么不是127.0.0.1呢?因为访问这个回环地址burp抓不到包,原因未知但可以使用就好了。

观察发现,当我们点击左侧汽车名字的时候,实际上我们是post了相应的请求,抓包修改相应位置的汽车名后发现会跳转到不同的汽车页面。思路这就来了:如果我们post一些其他的东西上去,是否会有突破口?
尝试突破
首先,我先post了一个不存在的汽车名称:

Read More
题目来源:2023MOECTF
题目简述



大概是要我们输入一个叫fd的东西来读取文件,也就是只要我们输入正确的fd就可以得到flag,那什么是fd呢?
FD,即“文件描述符”,以下是摘录于知乎的简述:
fd是什么?
fd是File descriptor的缩写,中文名叫做:文件描述符。文件描述符是一个非负整数,本质上是一个索引值(这句话非常重要)。
什么时候拿到的fd?
当打开一个文件时,内核向进程返回一个文件描述符( open
系统调用得到 ),后续 read
、write
这个文件时,则只需要用这个文件描述符来标识该文件,将其作为参数传入 read
、write
。
fd 的值范围是什么?
在 POSIX 语义中,0,1,2 这三个 fd 值已经被赋予特殊含义,分别是标准输入( STDIN_FILENO ),标准输出( STDOUT_FILENO ),标准错误( STDERR_FILENO )。
Read More