moctf web write-up

一道水题

F12

还是水题

F12
在这里插入图片描述
要输入五个字符,但是maxlength为4,把4改成5,disabled改成abled

访问限制

看题目,只允许使用NAIVE浏览器访问!,burp抓包,在User-Agent后加NAIVE
在这里插入图片描述
go一下,发现回显
在这里插入图片描述
猜测是改语言,百度,想了一会,猜测应该是ZH-HK,放上去
在这里插入图片描述

机器蛇

F12,提示robots.txt,进去在这里插入图片描述
复制,继续访问,F12
在这里插入图片描述

PHP黑魔法

看源码,什么都没有,那就先御剑。没发现。那就再抓包。还是什么都没有,那就只能去看wp。
说有个提示“~”这个,但是我好像没找到提示啊。

那就进index.php~

在这里插入图片描述
这是源码,仔细分析一波,这里有两点重要信息。

  1. a和b是GET方法得到,a不能弱类型相等b
  2. a和b的md5相同

这里涉及到一个知识点,Hash漏洞
描述:

PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。

那我们就找两个不同的字符串,两个字符串md5之后的开头都是0e,那就可以绕过这个相等。

百度,令a=QNKCDZO,b=240610708,提交,get flag

我想要钱

在这里插入图片描述

  1. money长度小于4
  2. money比time()函数值要大,我们百度一下time()

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

  1. money 不是数组

我们可以知道time()返回的是一个挺大的数字,那么要大于这个数字但是又不能长过4,怎么办呢,我们想到科学记数法。提交money=1e10。出flag。

登录就对了

登录框,head显示sqli login,想到sql注入。

在用户名输入1' or 1=1# 密码随意,通过,F12

试了几个常用用户名在密码进行注入都失败了。

文件包含

题目提示文件包含,看到url
在这里插入图片描述
文件包含漏洞

php://filter(本地磁盘文件进行读取)
元封装器,设计用于”数据流打开”时的”筛选过滤”应用,对本地磁盘文件进行读写。
用法:?filename=php://filter/convert.base64-encode/resource=xxx.php 一样。
条件:只是读取,需要开启 allow_url_fopen,不需要开启 allow_url_include;

url中xxx.php改成index.php,返回wrong answer。看不到源代码,再改flag.php。出现一串base64。解密。得flag。

暴跳老板

第一个界面,看源代码,没东西。抓包。还是没有,那就下一个界面。

重新发送界面,F12,没东西,抓包
在这里插入图片描述
看响应包,POST your email by Dear
上面有个Dear:MyBoss。说明dear的值为My boss。那就尝试post数据。
尝试post Dear=MyBoss 没用。尝试了很多,最后面发现一定要在postText后面跟个&。

也就是postText=Dear&Dear=MyBoss。
这里的postText的值随意。

Flag在哪?

点击GET flag,跳转至no_flag.php,改成flag.php,又跳回来,所以这里应该有个重定向的东西,那就把跳转过程停下来,那就抓包。

在这里插入图片描述
这里有个和其他不一样的Follow redirection,重定向。

点,然后出现不同几个页面。

I have a flag
I have a frog
guess where is the flag

联想到那个apple pineapple的唱歌的很火的。
flagfrog.php或者frogflag.php
注意就是这里有重定向,不能直接在url上面改,用burp改,都可以找到flag。

美味的饼干

看题目首先感觉是cookie改cookie一类的东西。

进去登录框,尝试1,1,登陆成功,欢迎1,按F12,只有admin才有flag,那就用admin来登陆.

还是登陆成功,但是并没有看到flag,题目又是和cookie有关,那就抓包先。

在这里插入图片描述
base64,去解密
解得:ee11cbb19052e40b07aac0ca060c23ee

感觉是MD5,md5解密,是user,那就反过来用admin,先md5加密,然后再base64加密,然后替换掉原本的cookie。出flag。

没时间解释了

找不到东西,先抓包,再扫描

扫描到
在这里插入图片描述
进那个最长的。

然后感觉像是上传木马。

但是上传以后访问界面说是too slow,太慢了?什么意思呢?找大佬的wp,说,这是条件竞争漏洞。百度。

大概意思是说,你把上传速度太快太多,就起冲突了,然后内存就可能泄露什么的,从中进行攻击。

开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,而且他们忽视了并行服务器会并发执行多个线程,这就会导致意想不到的结果。
线程同步机制确保两个及以上的并发进程或线程不同时执行某些特定的程序段,也被称之为临界区(critical section),如果没有应用好同步技术则会发生“竞争条件”问题。在我理解就是两只哈士奇(线程)同时去抢一个丢出去的飞盘(资源),不知道到底哪只能抢到,此处便形成了竞争。

步骤有点复杂就不想讲了,下次有心情的时候再补出来吧。

死亡退出

这题按照wp来走但是最后面的F12注释就是出不来flag,我也很无奈啊
在这里插入图片描述

这题是利用伪协议来查看源码,php://filter。但是在执行的时候,比如会把c存入到tmp.php运行,执行exit,退出文件。那就要想方法绕过。

在包含HTML、PHP语言的的网页中,通常会在进行解析XML将PHP的语法当作为XML,而导致解析错误。为了防止这样的错误产生,php引入了php://filter协议流,通过该协议流可以将php的代码经过base64再编码一遍来避免此类冲突的产生。

这个协议可以将需要执行的php代码使用base64上传,再利用php:filter协议流进行base64解码执行。

这里怎么理解呢,我们把tmp.php文件,用php://filter协议看作是要base64解码的文件,再去执行tmp.php。

在这里插入图片描述
因为这里是 c.是把post到的数据连接在原本的C上面,那么我们的操作应该是用base64编码后的操作。

<?php system('cat flag.php');?>

将上面这个进行base64编码,其中这里有一个要注意的是,base64编码是每8个一组,所以这里只有7个字母,需要多一个字母去填补然后再解码,才会不影响我们的操作.

file=php://filter/write=convert.base64-decode/resource=tmp.php

这个和我们有一个很常见的文件包含漏洞很像,放上来对比一下

 ?file=php://filter/read=convert.base64-encode/resource=xxx.php 

没错,一个是read,一个是write。

具体操作自己感受。

火眼金睛

每两秒钟更新一次,然后查找moctf。上脚本。

简要说步骤。把respond的text部分截下来,然后一部分一部分去到只剩下那些字母。然后用count()统计出数字,提交。

import requests
import re
url="http://119.23.73.3:5001/web10/index.php"
url2='http://119.23.73.3:5001/web10/work.php'
r=requests.session()
cont=r.get(url).text #将get到的数据以文本形式显示出来
'''cont=re.findall("<textarea rows = '30' cols = '100'>(.*?)</textarea>",text) #匹配出计算表达式,
cont=''.join(cont) #列表转字符串,因为eval()接收的参数类型为string, bytes or code object
print(cont)'''
num=cont.count('moctf', 0,len(cont))-1
print(num)
data={
    "answer":num
} #构造post数据
print(data)
ans=r.post(url2,data=data)
print(ans.content)

注释掉的部分是我一步步的验证,作为新手稳妥一点好。

哦对,还有一个要注意的地方是post数据的页面是在work.php,这里我弄很久没注意到,相当难受。

unset

在这里插入图片描述
很可怕的源码,我们先仔细读一遍过去。

http://www.secevery.com:4321/bugs/wooyun-2014-063895
这个主要是利用了Destoon 20140530最新版超全局变量覆盖导致的安全问题。

  1. 首先有一个waf(),从字面意思看就是防火墙,这里是传入的键名中不能有字符flag。
  2. 接下来就是恐怖的foreach的一串东西了,这里看到$$k,想到变量覆盖

这里的逻辑是 如果 post get cookie 请求中的$ $ key和$ value相等 就unset掉$$key

如果我们向1.php?x=1提交一个POST请求 内容为_GET[x]=1

因为?x=1 所以$_GET内容为 array('x'=>'1')

当开始遍历$_POST的时候 $__k是_GET[x] 所以 $ $ __k 就是 $_GET[x]也就是array('x'=>'1')

$__v是POST上来的一个数组 内容也是array('x'=>'1')

$$__k == $__v成立所以 我们的超全局变量 $_GET就这么华丽丽的被unset了

原文地址:https://www.cnblogs.com/vstar-o/p/12582937.html