jarvis OJ web题目浅析
2024-10-4 10:11:42 Author: www.freebuf.com(查看原文) 阅读量:1 收藏

0x00 前言:

近期刷到的不错的ctf平台,权当看个乐。

0x01 RE? :

这道题考的有些许的偏门,首先下载附件,名为udf.so.(一大堆字符)。

1647400237_6231552d03cf5f0b0f7f1.png!small?1647400236536

Udf为mysql 的一个扩展接口,通俗来讲就是用户自定义函数。且后缀为.so时,可知道网站所搭建的环境为linux环境。Udf文件利用的话可以使用此语句。

CREATE FUNCTION [自定义函数名称] RETURNS [返回类型]{STRING|INTEGER|REAL} SONAME ["文件名"];

首先我们要找到本机linux中mysql下一个叫做plugin的文件夹。

1647400294_623155666c0db0f8178bb.png!small?1647400293958

(windows环境远程连接linux mysql)

可以看到目录的绝对路径,下一步我们将所下载的文件放入这个目录下。

1647400330_6231558acf0b9645eb243.png!small?1647400330355

根据题目的提示(help_me)执行sql语句查询这个函数值。

1647400356_623155a428537ce6e5d24.png!small?1647400355664

使用getflag方法获取flag、

1647400365_623155ad8a2e4857ee743.png!small?1647400365077

PS:我这里是已经存在这个方法了,并不是语句的问题

0x02 PORT51:

题目链接:http://web.jarvisoj.com:32770/

进入题目,要求用51端口访问该站点。拿到引导以后直接使用curl命令进行访问。

1647400392_623155c8234b652465972.png!small?1647400391701

这道题目没有什么难度,考点也比较单一,命令一把梭就ok。但可能会有报错,个人认为可能是家里的网络没有分配到公网的地址,如果用服务器访问的话就不会有这个问题了。

0x03 LOCALHOST:

题目入口:http://web.jarvisoj.com:32774/

打开题目后告诉我们只能用本地主机访问。

1647400418_623155e2bdda5a7b4c498.png!small?1647400418283

这里考的是一个叫做XFF(X-Forwarded-For)的东西,X-Forwarded-For 是一个 HTTP 扩展头部。通俗来讲,XFF是用来识别通过HTTP代理连接到web服务器的客户端最原始的IP地址和请求头字段。

本题可以抓包修改http请求头,将XFF值设置为127.0.0.1。

1647400430_623155ee44e9c7d5f9864.png!small?1647400430010

0x04 神盾局的秘密:

题目传送门:web.jarvisoj.com:32768

首先打开题目以后,习惯性的看下源代码。

1647400445_623155fd7f30909ba1d90.png!small?1647400445051

访问showimg.php并传递源码中给到的参数。

1647400460_6231560c8769ce88079c1.png!small?1647400460357

将参数值位置进行base64解码,参数值解码后为shieid.jpg,猜测这个位置有任意文件读取漏洞。把showimg.php进行base64编码,传入参数。

1647400478_6231561e02e89ef2cb0cc.png!small?1647400477545

果然读取到了showimg.php的源代码,此文件中做了一些过滤,禁止访问了上级目录。下面来读一下index.php的代码。

1647400487_623156277b6262f0d6157.png!small?1647400487052

Index.php引入了shield.php,直接读。

1647400504_6231563831f4faa5b2ef0.png!small?1647400503780

这个文件中告诉了我们flag的位置,而在showing.php中过滤了pctf,所以我们并不能直接通过。showimg.php来读取这个flag所在的文件,但下面有一个file_get_contents()函数,配合index.php中的unserialize()来配合拿到flag。

构造序列化字符串。

1647400516_623156448e7587ecf681f.png!small?1647400516121

访问index.php,将此序列化串传入class中,查看源代码得到flag。

1647400537_623156595cc54ac94eeb4.png!small?1647400536933

没想到直接访问还会有个假的flag,草率了。

0x05 Login:

题目入口:web.jarvisoj.com:32772

进入题目中,抓包分析一下。

1647419550_6231a09e522c20499d38b.png!small?1647419549863

返回头中提示了我们一条sql语句,这里对sql就不做过多的赘述了。语句中的可控点就是包在md5函数中的$pass。在这里我们要先了解下md5函数,当他的第二个参数为true时,会返回原始的16字符二进制的格式,那么我们可不可以利用这个问题构造一个万能密钥进行登录呢。

1647419565_6231a0ad1ba843d621fd0.png!small?1647419564480

这里可以看到,aaaa被转成了字母数字+亿点点乱码。那么这里就需要了解一个特殊的字符串了——ffifdyop,这个字符串在经过md5函数转换后,变成了'or'6[乱码]。直接本地测试一下,看看结果。

1647419573_6231a0b51decb6036d686.png!small?1647419572503

本地测试是ok的,题目一把梭。

1647419584_6231a0c0645333fda27e6.png!small?1647419583953

0x06 IN A Mess:

题目入口:http://web.jarvisoj.com:32780/

拿到题目抓包访问,发现注释中提示index.phps。我们直接访问。

1647419593_6231a0c9ba199f19a5089.png!small?1647419593109

可以看到他需要三个参数 a,b,id。

首先a这里我们可以用php://input,再POST一个1112 is a nice lab!,或者可以直接用data:,1112 is a nice lab!

b只需要字符个数大于5,用%00绕过eregi函数就可以;

Id这里是一个非常草率的弱比较;

最后传入这三个参数进行访问。

1647419634_6231a0f2be0df34b859ff.png!small?1647419634283

他给个一个比较迷惑的东西,起初还以为是flag,交了半天才发现是目录,继续访问。

1647419645_6231a0fd560b9d40f8aee.png!small?1647419644820

这里简单测试了一下,发现过滤了空格和/**/,我们使用/*[任意字符]*/进行绕过,测试字段数,字段数为3正常显示,字段数为4,显示不正常。

1647419670_6231a1166675e97bae4f6.png!small?16474196698541647419675_6231a11b96b9c581c072a.png!small?1647419675177

确定了字段数以后开始爆数据库名,在这里网上很多wp都使用了双写进行绕过,其实也可以利用其他被过滤的字符进行绕过。

1647419685_6231a12575cc8dc32e28e.png!small?1647419684996

可以看到这里利用from就绕过了限制,并且其回显为是3的位置,查询数据库名。

1647419689_6231a129618030c94955b.png!small?1647419688983

查询表名,这里因为引号被过滤了,先使用database函数拿到表名。

1647419693_6231a12d2da510eef4835.png!small?1647419692714

查列名,这里使用hex编码绕过引号执行语句。

1647419698_6231a132d1d9628d17e37.png!small?1647419698337

得到了表名列名,下面开始查询flag值。

1647419703_6231a137b80454b07e9b7.png!small?1647419703223

0x07 flag在管理员手里:

题目链接:http://web.jarvisoj.com:32778/

进入题目后进行搜集,在相应头中发现了两条set cookie。由此可以得知这道题目应该是与这两条信息有关系的,接着我们来试着找下源码,找源码常见的也就几种方式,源代码中没有提示,我们直接访问下robots.txt试一下。

1647419716_6231a144b564a3d1e1f86.png!small?1647419716119

显然是没有的,再来试一试这个出题人很喜欢的一种套路,访问index.php~下载源码。文件直接打开就可以看到顺序是倒过来的源码,也可以用linux vim-r命令恢复文件。在恢复文件前需要先把后缀更改为.swp。为了便于观看,这里用kali恢复一下文件。

1647419770_6231a17aa261f8c7348c6.png!small?1647419770164

简单分析一下源码,role参数这里需要传入一个序列化后的admin,而hsh需要role反转后与$salt拼接的md5值,这里是一道哈希长度拓展攻击的考点,简单来说就是我们知道服务器给cookie中的值,我们称之为hash1,hash1中存在salt,我们可以做一次hash1和admin的MD5运算从而得到hash2,此时将hash2赋值给hsh就符合了代码的要求。

计算可以编写python脚本来运行,也可以利用hashpump这个工具进行。

1647419841_6231a1c1f23f5ccc50ec0.png!small?1647419841483

得到最终flag。

0x08 Chopper:

这道题题目可能有点问题,在网上搜出的wp也不能复现。这边就不做过多的赘述了。

0x09 Easy Gallery:

题目入口:http://web.jarvisoj.com:32785/

进入题目,在index.php?page=submit中发现了一个上传点。

1647419859_6231a1d38cf8b1168137c.png!small?1647419858942

抓包更改文件名进行测试,先上传一个空文件试试。

1647419865_6231a1d98d398d47a0051.png!small?1647419865265

编码格式导致有些许的不美观,总体来说问题不大。这边判断他是判断了文件头

1647419875_6231a1e35b30f81319cfd.png!small?1647419874947

添加了一个GIF89a,成功的绕过了这个过滤,下一步我们直接再其中上传php代码。

1647419884_6231a1ec5883bd2c8e00d.png!small?1647419883921

上传的php代码是没有什么问题的,我们在view中可以通过这个ID拿到文件路径,这里的文件路径为uploads/1646740311.jpg,现在可以利用url地址中的page传递我们上传文件的路径。

1647419895_6231a1f7077fa18fb9c95.png!small?1647419894384

代码中在文件名后拼接了一个.php的后缀,这里我们利用%00来进行绕过,不过发现还是没有拿到flag。

1647420016_6231a27054e36f4797855.png!small?1647420015723

可以看到,这里还是报了一个没有文件的错误。初步推测是代码中过滤了<?php之类的字符,我们用另一种方法上传文件。

1647420031_6231a27fd5fc67f138dff.png!small?1647420031439

访问这个文件,得到了flag。

1647420039_6231a287948d61e39d497.png!small?1647420038980

PS:这里本来是怕eval被过滤,上传phpinfo测试一下,没想到直接得到flag了。

0x10 Simple Injection:

题目入口:http://web.jarvisoj.com:32787/

根据题目提示,很简单的注入,输入账号密码抓包进行访问。

1647420053_6231a295d345787a6307a.png!small?1647420053424

这里可以看到,当username为admin时,会提示密码错误。而赋值为其他值时,则会报用户名错误,所以本题考的应该是布尔盲注。我们来测试一下这个注入点是不是再username的位置。

1647420058_6231a29aef0c9e6a8dd4e.png!small?1647420058533

1647420086_6231a2b6d53fce60b4516.png!small?1647420086375

成功找到注入点,代码中对空格进行了过滤,出题人老作风了这属于。下一步就可以进行爆破了,编写python脚本进行注入。

1647420118_6231a2d6372922ecfe496.png!small?1647420117696

Md5解密。

1647420124_6231a2dc5d8f3a3ab2b99.png!small?1647420123743

正常登录得到flag。

1647420128_6231a2e041b72c15ef81d.png!small?1647420127803

0x11 api调用:

题目入口:http://web.jarvisoj.com:9882/

进入题目查看源代码,在代码中看到了XMLHttpRequest,分析应该是与xml有关了,点击go抓包,可以看到json格式的发送的数据。

1647420138_6231a2eaae1d23948704d.png!small?1647420138246

这边把content-Type改为application/xml,将发送的json数据更改为我们xml格式的数据信息。读取题目中提示的/home/ctf/flag.txt的信息。

1647420144_6231a2f0a8af461290fed.png!small?1647420144287

0x12 PHPINFO:

题目入口:http://web.jarvisoj.com:32784/

打开题目,这个文件乍一看没有什么问题,正常传入数据也是不可控的,但是在第二行中。ini_set('session.serialize_handler', 'php');这句话一出现我们就考虑到是不是php中的session反序列化,下面我们传入一个参数查看一下他的phpinfo中的设置。

1647420157_6231a2fde9693992ba3b6.png!small?1647420157618

我们直接跳到关于session的设置。

1647420162_6231a3027332752ce775d.png!small?1647420162065

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同时开始的表单进行提交。

1647420170_6231a30a23002b5ee0f6c.png!small?1647420169531

这边随便上传一个文件进行抓包,提前构造好序列化字符串,这里存在一个双引号会被转义的问题,我们要在前面加上\,另外还要在开头加上|。

1647420179_6231a3136271db1ce20ca.png!small?1647420179138

这边我们将文件名修改为我们所构造的反序列化串,可以看到我们成功的得到了flag文件所在的位置,这里需要回过头来看一下session文件存储的路径。

1647420187_6231a31b5373ab542bdf8.png!small?1647420186690

拿到这个路径,构造下一步的反序列化串,这里我们用file_get_centents()函数将文件写入字符串中最后echo出来。

1647420193_6231a321cca8dcb391ca1.png!small?1647420193580

0x13 admin:

题目入口:http://web.jarvisoj.com:32792/

进入题目环境,源代码中没有任何提示,考虑信息泄露问题,访问robots.txt。

1647420204_6231a32c34b8f03972c93.png!small?1647420203607

直接访问看看。

1647420208_6231a330607b22cc26be5.png!small?1647420207774

这里给了一个假flag,结合题目我们查看一下cookie。

1647420211_6231a333d15f7f81844fd.png!small?1647420211289

直接更改为1拿到flag。

0x14 WEB?:

题目入口:http://web.jarvisoj.com:9891/

拿到题目后查看源码,发现这里的密码使用js进行验证的,其中引入了一个叫做app.js的文件可以跟进看一下。

1647420219_6231a33be1612f8219a98.png!small?1647420219314

打开后先在线格式化一下,既然是密码那我们搜索一下password。

1647420227_6231a343d1a14bef80592.png!small?1647420227467

跟进checkpass。

1647420232_6231a348264502c3836e8.png!small?1647420231575

跟进__checkpass__REACT_HOT_LOADER__

1647420237_6231a34dc8a7315a9da9e.png!small?1647420237323

矩阵??编写脚本解出flag。

1647420292_6231a384d65f3655bfe4d.png!small?1647420292236

0x15 inject:

题目入口:http://web.jarvisoj.com:32794/

根据题目提示,先找源码,robots.txt文件不存在。出题人老套路访问index.php~

1647420304_6231a3907ce08fc1bb180.png!small?1647420303883

审计代码,其中 ` ` 的作用就是防止字段为关键字时会报错的问题,而在语句中加入反引号并不会使语句报错这里只要构造出desc `test` ` [union联合注入语句] 就可以进行sql注入。但是结果只回显第一条,这里用到limit来实现数据可显。

1647420309_6231a3952d474f1fe09a3.png!small?1647420308751

得到了数据库,我们开始查表,题目中过滤了单引号,我们干脆不使用单引号注入,一条一条查数据。

1647420316_6231a39c29bbe75d3f17a.png!small?1647420315795

显然这么多表中第一个就是flag存放的表名,接下来同样的方式开始查列名。

1647420325_6231a3a57fceb42d31829.png!small?1647420325109

表名列名都有了,现在可以直接查数据。

1647420329_6231a3a9edbf70bbd2122.png!small?1647420329544

0x16 babyphp:

题目入口:http://web.jarvisoj.com:32798/

进入题目,在about界面发现了三个类似提示的东西,其中git考虑到存在git泄露,访问git目录。

1647420337_6231a3b1d5d48b264e442.png!small?1647420337283

这里并没有报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。

1647420342_6231a3b6df2434fb5e539.png!small?1647420342288


文章来源: https://www.freebuf.com/articles/web/325177.html
如有侵权请联系:admin#unsafe.sh