MOCTF-WEB-writeup
好菜,除了简单的几个题,自己会做,难的都是看老大WP完成的,太菜了
啥姿势都不会,就此记录一下,供日后查看及反省。菜鸡的自我修养
0x01 一道水题
题目链接:http://119.23.73.3:5001/web1/
直接F12了解一下,get flag:moctf{easy_source_code}
0x02 还是水题
题目链接:http://119.23.73.3:5001/web2/
F12查看源码。
修改之后,输入moctf提交就可以行了。get flag:moctf{break_the_html}
0x03 访问限制
题目链接:http://119.23.73.3:5001/web3/
BP抓包,将代理的浏览器设置为NAIVE,重新发包。get flag:moctf{http_header_1s_easy}
0x04 机器蛇
题目链接:http://119.23.73.3:5001/web4/
F12查看源码
然后访问robots.txt
最后访问图中的地址,即可获得Flag
get flag:moctf{g0Od_r0bots_txt}
0x05 PHP黑魔法
题目链接:http://119.23.73.3:5001/web5/
这题,输了index.php,看不到任何东西,也不会跳转到其他页面,题目给的提示也没说php~
我太难了
根据大佬们之前做的,访问index.php~,查看源码
<!DOCTYPE html> <!--html lang="zh-CN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <?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>"; ?> </body> </html-->
根据源码,知道需要GET传参的a和b不能相等,而且md5之后的a=b,从这 if(md5($a)==md5($b)) 中的==可以知道,可以利用MD5特性来解决
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
可以用两种方法绕过
1、直接将需要传参的值赋成如下就行了,md5之后是相等的:
QNKCDZO 240610708 s878926199a s155964671a s214587387a s214587387a sha1(str) sha1('aaroZmOk') sha1('aaK1STfY') sha1('aaO8zKZF') sha1('aa3OFF9m')
//比如说URL传参为
//http://119.23.73.3:5001/web5/index.php?a=240610708&b=QNKCDZO
2、利用MD5不能处理数组的特性绕过也行
//这里根据题意,a,b不相等,md5($a)==md5($b),如下传参也行,URL中的69,自己随意改,不相等就行
http://119.23.73.3:5001/web5/index.php?a[]=6&b[]=9
最后的flag为:moctf{PHP_1s_b4st_language}
0x06 我想要钱
题目链接:http://119.23.73.3:5001/web6/
打开得到源码
<?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!"; ?> Wrong Answer!
代码审计。想要获得Flag,需要满足三个条件:
//money的长度小于4、money的值大于time、最后不能为数组
if(strlen($money)<=4&&$money>time()&&!is_array($money))
money使用科学计数就可以了,长度小,也得以很大
比如?money=3e9
get flag:moctf{I_ne4d_much_m0ney}
0x07 登录就对了
题目链接:http://119.23.73.3:5002/index.php
构造万能密码,直接就可以登录成功,登录成功之后,F12查看源码即可获得Flag,get flag:moctf{SQLi_Log_1n_4asy}
这里讲的万能密码还不错:https://www.freebuf.com/column/150063.html
0x08 文件包含
题目链接:http://119.23.73.3:5001/web8/index.php?file=welcome.txt
查看源码,发现有一个flag.php,根据题目文件包含,可以用php://filter伪协议来读取flag的内容
payload: ?file=php://filter/read=convert.base64-encode/resource=flag.php
关于php://filter伪协议的相关知识,这里说的不错 https://www.leavesongs.com/PENETRATION/php-filter-magic.html
打开之后会得到一串字符,直接base64解码即可看到flag
get flag:moctf{f1le_includ4_e5sy}
0x09 暴跳老板
题目链接:http://119.23.73.3:5006/web1/
hint:老板暴跳如雷,骂道:你怎么又没有按照我的意愿发邮件?
发啥都不管用,只会这样弹窗
BP抓包试试
根据题目提示,安装他说的发送,以及弹窗,应该用Dear的名义发送MyBoss过去
get flag:moctf{00.oo_BBoo_0os}
0x10 Flag在哪?
题目链接:http://119.23.73.3:5001/web7/
打开网页,有一个getflag的链接,点击去啥也没有,There is no flag!
御剑扫一波,扫不到东西,BP打开,抓包试试。可以看到Response里面
Location有新的链接地址,复制发包,最后又回到了最开始的位置,果然
人不能忘了初心,如果人人都初心哥,是不是可以迎娶白富美了(嘤嘤嘤)
想不到,看看表哥们的姿势。
emmmmmmm 歌曲?
好吧,将之前得到的组合一下flagfrog.php,访问,即可获得flag
之前获得的
/where_is_flag.php
/flag.php
/I_have_a_frog.php
/I_have_a_flag.php
/no_flag.php
get flag:moctf{wh4re_1s_The_F149}
0x11 美味的饼干
题目链接:http://119.23.73.3:5001/web9/
登录页面,直接使用admin登录就可以登录成功,密码都不需要。BP抓包看看
而且题目为美味的饼干 emmmm cookie?
多次登录BP,发现这里的Cookie是一个定值
%3D 是等号(=),base64解码一波
发现里面的字符都是0-9,a-f,MD5解密,解密之后为user,前面用户输入的是admin,这里解密出来为user,那么将admin先进行md5加密,再base64加密,然后添加到cookie继续发包即可获得flag
get flag:moctf{Co0kie_is_1nter4sting}
0x12 没时间解释了
题目链接:http://119.23.73.3:5006/web2/index2.php
御剑扫描,发现新大陆。
访问试试
提交之后,得到一串字符:Flag is here,come on~ http://119.23.73.3:5006/web2/uploads/1338ecebb918f207a7de77008477d150d892c8d4/flag
访问之后,Too Show,不管提交什么,他前面的地址都一样,但是访问的时候,又看不到,应该是提交之后,服务器再很短的时间又给删除了。
所以,去访问的时候总是得不到想要的。本题考查的是条件竞争,直接利用BP里面的Intruder模块进行爆破,来获取
需要进行两次抓包,同时发送包,来达到短时间获取
先抓提交页面的包
然后设置Payload,选择Null payload,下面的continue indefinitely就是持续发送,一直请求设置完成之后,开始攻击(start attack)
开始攻击之后,放在后台,让他持续发送。接下来继续抓第二个包。
和上面一样的设置,然后发送攻击。
get flag:moctf{y0u_n4ed_f4st}
0x13 死亡退出
代码审计
<?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,里面为一个php代码,退出功能。
接着是以post的方式获取变量c,这里 .= 表示他会和上面变量c的内容链接起来。
除了post变量c,下面还post了file,那么就是需要同时传c和file来获取flag吧
接下来是函数 file_put_contents:
file_put_contents()函数把一个字符串写入文件中。 该函数访问文件时,遵循以下规则: 1.如果设置了FILE_USE_INCLUDE_PATH,那么将检查* filename *副本的内置路径 2.如果文件不存在,将创建一个文件 3.打开文件 4.如果设置了LOCK_EX,那么将锁定文件 5.如果设置了FILE_APPEND,那么将移至文件末尾。否则,将会清除文件的内容 6.向文件中写入数据 7.关闭文件并对所有文件解锁 如果成功,该函数将返回写入文件中的字符数。如果失败,则返回错误。
未完待续