0x00 前言:
近期刷到的不错的ctf平台,权当看个乐。
0x01 RE? :
这道题考的有些许的偏门,首先下载附件,名为udf.so.(一大堆字符)。
Udf为mysql 的一个扩展接口,通俗来讲就是用户自定义函数。且后缀为.so时,可知道网站所搭建的环境为linux环境。Udf文件利用的话可以使用此语句。
CREATE FUNCTION [自定义函数名称] RETURNS [返回类型]{STRING|INTEGER|REAL} SONAME ["文件名"];
首先我们要找到本机linux中mysql下一个叫做plugin的文件夹。
(windows环境远程连接linux mysql)
可以看到目录的绝对路径,下一步我们将所下载的文件放入这个目录下。
根据题目的提示(help_me)执行sql语句查询这个函数值。
使用getflag方法获取flag、
PS:我这里是已经存在这个方法了,并不是语句的问题
0x02 PORT51:
题目链接:http://web.jarvisoj.com:32770/
进入题目,要求用51端口访问该站点。拿到引导以后直接使用curl命令进行访问。
这道题目没有什么难度,考点也比较单一,命令一把梭就ok。但可能会有报错,个人认为可能是家里的网络没有分配到公网的地址,如果用服务器访问的话就不会有这个问题了。
0x03 LOCALHOST:
题目入口:http://web.jarvisoj.com:32774/
打开题目后告诉我们只能用本地主机访问。
这里考的是一个叫做XFF(X-Forwarded-For)的东西,X-Forwarded-For 是一个 HTTP 扩展头部。通俗来讲,XFF是用来识别通过HTTP代理连接到web服务器的客户端最原始的IP地址和请求头字段。
本题可以抓包修改http请求头,将XFF值设置为127.0.0.1。
0x04 神盾局的秘密:
题目传送门:web.jarvisoj.com:32768
首先打开题目以后,习惯性的看下源代码。
访问showimg.php并传递源码中给到的参数。
将参数值位置进行base64解码,参数值解码后为shieid.jpg,猜测这个位置有任意文件读取漏洞。把showimg.php进行base64编码,传入参数。
果然读取到了showimg.php的源代码,此文件中做了一些过滤,禁止访问了上级目录。下面来读一下index.php的代码。
Index.php引入了shield.php,直接读。
这个文件中告诉了我们flag的位置,而在showing.php中过滤了pctf,所以我们并不能直接通过。showimg.php来读取这个flag所在的文件,但下面有一个file_get_contents()函数,配合index.php中的unserialize()来配合拿到flag。
构造序列化字符串。
访问index.php,将此序列化串传入class中,查看源代码得到flag。
没想到直接访问还会有个假的flag,草率了。
0x05 Login:
进入题目中,抓包分析一下。
返回头中提示了我们一条sql语句,这里对sql就不做过多的赘述了。语句中的可控点就是包在md5函数中的$pass。在这里我们要先了解下md5函数,当他的第二个参数为true时,会返回原始的16字符二进制的格式,那么我们可不可以利用这个问题构造一个万能密钥进行登录呢。
这里可以看到,aaaa被转成了字母数字+亿点点乱码。那么这里就需要了解一个特殊的字符串了——ffifdyop,这个字符串在经过md5函数转换后,变成了'or'6[乱码]。直接本地测试一下,看看结果。
本地测试是ok的,题目一把梭。
0x06 IN A Mess:
题目入口:http://web.jarvisoj.com:32780/
拿到题目抓包访问,发现注释中提示index.phps。我们直接访问。
可以看到他需要三个参数 a,b,id。
首先a这里我们可以用php://input,再POST一个1112 is a nice lab!,或者可以直接用data:,1112 is a nice lab!
b只需要字符个数大于5,用%00绕过eregi函数就可以;
Id这里是一个非常草率的弱比较;
最后传入这三个参数进行访问。
他给个一个比较迷惑的东西,起初还以为是flag,交了半天才发现是目录,继续访问。
这里简单测试了一下,发现过滤了空格和/**/,我们使用/*[任意字符]*/进行绕过,测试字段数,字段数为3正常显示,字段数为4,显示不正常。
确定了字段数以后开始爆数据库名,在这里网上很多wp都使用了双写进行绕过,其实也可以利用其他被过滤的字符进行绕过。
可以看到这里利用from就绕过了限制,并且其回显为是3的位置,查询数据库名。
查询表名,这里因为引号被过滤了,先使用database函数拿到表名。
查列名,这里使用hex编码绕过引号执行语句。
得到了表名列名,下面开始查询flag值。
0x07 flag在管理员手里:
题目链接:http://web.jarvisoj.com:32778/
进入题目后进行搜集,在相应头中发现了两条set cookie。由此可以得知这道题目应该是与这两条信息有关系的,接着我们来试着找下源码,找源码常见的也就几种方式,源代码中没有提示,我们直接访问下robots.txt试一下。
显然是没有的,再来试一试这个出题人很喜欢的一种套路,访问index.php~下载源码。文件直接打开就可以看到顺序是倒过来的源码,也可以用linux vim-r命令恢复文件。在恢复文件前需要先把后缀更改为.swp。为了便于观看,这里用kali恢复一下文件。
简单分析一下源码,role参数这里需要传入一个序列化后的admin,而hsh需要role反转后与$salt拼接的md5值,这里是一道哈希长度拓展攻击的考点,简单来说就是我们知道服务器给cookie中的值,我们称之为hash1,hash1中存在salt,我们可以做一次hash1和admin的MD5运算从而得到hash2,此时将hash2赋值给hsh就符合了代码的要求。
计算可以编写python脚本来运行,也可以利用hashpump这个工具进行。
得到最终flag。
0x08 Chopper:
这道题题目可能有点问题,在网上搜出的wp也不能复现。这边就不做过多的赘述了。
0x09 Easy Gallery:
题目入口:http://web.jarvisoj.com:32785/
进入题目,在index.php?page=submit中发现了一个上传点。
抓包更改文件名进行测试,先上传一个空文件试试。
编码格式导致有些许的不美观,总体来说问题不大。这边判断他是判断了文件头
添加了一个GIF89a,成功的绕过了这个过滤,下一步我们直接再其中上传php代码。
上传的php代码是没有什么问题的,我们在view中可以通过这个ID拿到文件路径,这里的文件路径为uploads/1646740311.jpg,现在可以利用url地址中的page传递我们上传文件的路径。
代码中在文件名后拼接了一个.php的后缀,这里我们利用%00来进行绕过,不过发现还是没有拿到flag。
可以看到,这里还是报了一个没有文件的错误。初步推测是代码中过滤了<?php之类的字符,我们用另一种方法上传文件。
访问这个文件,得到了flag。
PS:这里本来是怕eval被过滤,上传phpinfo测试一下,没想到直接得到flag了。
0x10 Simple Injection:
题目入口:http://web.jarvisoj.com:32787/
根据题目提示,很简单的注入,输入账号密码抓包进行访问。
这里可以看到,当username为admin时,会提示密码错误。而赋值为其他值时,则会报用户名错误,所以本题考的应该是布尔盲注。我们来测试一下这个注入点是不是再username的位置。
成功找到注入点,代码中对空格进行了过滤,出题人老作风了这属于。下一步就可以进行爆破了,编写python脚本进行注入。
Md5解密。
正常登录得到flag。
0x11 api调用:
题目入口:http://web.jarvisoj.com:9882/
进入题目查看源代码,在代码中看到了XMLHttpRequest,分析应该是与xml有关了,点击go抓包,可以看到json格式的发送的数据。
这边把content-Type改为application/xml,将发送的json数据更改为我们xml格式的数据信息。读取题目中提示的/home/ctf/flag.txt的信息。
0x12 PHPINFO:
题目入口:http://web.jarvisoj.com:32784/
打开题目,这个文件乍一看没有什么问题,正常传入数据也是不可控的,但是在第二行中。ini_set('session.serialize_handler', 'php');这句话一出现我们就考虑到是不是php中的session反序列化,下面我们传入一个参数查看一下他的phpinfo中的设置。
我们直接跳到关于session的设置。
PHP内置了多种处理器用于存取$_SESSION数据时对数据进行序列化和反序列化。其中常用的有三种,其中在php 5.5.4以前默认选择的是php,在5.5.4之后是php_serialize。当session序列化选择器与默认的不同的话就可能会产生漏洞。另外,session.upload_progress.enabled为On,这里启用了该配置项,POST一个和session.upload_progress.name同名变量的时候。
PHP会将文件名保存在$_SESSION中session反序列化的条件都已经存在了,现在我们只需要构造一个上传和post同时开始的表单进行提交。
这边随便上传一个文件进行抓包,提前构造好序列化字符串,这里存在一个双引号会被转义的问题,我们要在前面加上\,另外还要在开头加上|。
这边我们将文件名修改为我们所构造的反序列化串,可以看到我们成功的得到了flag文件所在的位置,这里需要回过头来看一下session文件存储的路径。
拿到这个路径,构造下一步的反序列化串,这里我们用file_get_centents()函数将文件写入字符串中最后echo出来。
0x13 admin:
题目入口:http://web.jarvisoj.com:32792/
进入题目环境,源代码中没有任何提示,考虑信息泄露问题,访问robots.txt。
直接访问看看。
这里给了一个假flag,结合题目我们查看一下cookie。
直接更改为1拿到flag。
0x14 WEB?:
题目入口:http://web.jarvisoj.com:9891/
拿到题目后查看源码,发现这里的密码使用js进行验证的,其中引入了一个叫做app.js的文件可以跟进看一下。
打开后先在线格式化一下,既然是密码那我们搜索一下password。
跟进checkpass。
跟进__checkpass__REACT_HOT_LOADER__
矩阵??编写脚本解出flag。
0x15 inject:
题目入口:http://web.jarvisoj.com:32794/
根据题目提示,先找源码,robots.txt文件不存在。出题人老套路访问index.php~
审计代码,其中 ` ` 的作用就是防止字段为关键字时会报错的问题,而在语句中加入反引号并不会使语句报错这里只要构造出desc `test` ` [union联合注入语句] 就可以进行sql注入。但是结果只回显第一条,这里用到limit来实现数据可显。
得到了数据库,我们开始查表,题目中过滤了单引号,我们干脆不使用单引号注入,一条一条查数据。
显然这么多表中第一个就是flag存放的表名,接下来同样的方式开始查列名。
表名列名都有了,现在可以直接查数据。
0x16 babyphp:
题目入口:http://web.jarvisoj.com:32798/
进入题目,在about界面发现了三个类似提示的东西,其中git考虑到存在git泄露,访问git目录。
这里并没有报404的错误,说明存在git目录,利用git扫描工具尝试得到php源码。查看关键部分。
<?php if (isset($_GET['page'])) { $page = $_GET['page']; } else { $page = "home"; } $file = "templates/" . $page . ".php"; assert("strpos('$file', '..') === false") or die("Detected hacking attempt!"); assert("file_exists('$file')") or die("That file doesn't exist!"); ?>
这里存在一个危险函数assert。Assert($assertion,[$description])——检查指定的assertion并在结果为false时采取适当的行动(如果不为false就会执行此语句),了解了这个函数我们就可以直接构造payload?page='.system('cat templates/flag.php').'查看源代码拿到flag。