美文网首页
南邮ctf部分 Writeup

南邮ctf部分 Writeup

作者: Smi1e_ | 来源:发表于2018-03-19 22:15 被阅读0次

    常见的术语:

    肉鸡:被植入木马的电脑或者是服务器等联网设备。
    软件木马:远控软件的被控端(exe文件)
    脚本木马:脚本语言编写的被控端(asp、php...)
    拿Webshell(有人也会说是:拿shell):拿到网站的最高权限。
    服务器:提供计算机服务的设备
    {
    物理服务器:实体的。
    虚拟服务器:常见的,远程连接的。
    }
    后门:一栋房子有一扇大门跟一个洞。房子=服务器(个人电脑)、大IP=正常权限、洞=后门。
    IP:代表计算机的一个网络地址(例子:你在北京,这就是你的地址)
    端口:设备与外界通讯交流的出门。(一栋大楼里面有几个房间,房间有几个门
    大楼=IP,房间的门=端口)
    入侵:利用服务器方面漏洞的技术。
    提权:提升权限(拿到了Webshell-》通过Webshell提到服务器的权限,从脚本到服务器)
    压力测试(Ddos、CC攻击):利用流量资源攻击服务器。

    •••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••

    1签到题

    查看源代码就可以找到flag

    2签到2

    查看源代码 image.png

    让我们输入口令zhimakaimen11个字符,而maxlength=10,通过burpsuite中的Reapeater对页面数据进行修改发送。
    maxlength 属性规定输入字段的最大长度,以字符个数计。

    maxlength 属性与 <input type="text"> 或 <input type="password"> 配合使用。


    image.png

    这题不是WEB

    打开有个猫的图片,我直接用记事本打开搜索nctf,可以直接找到


    丘比龙De女神 image.png

    百度MD5:
    “简单地说来,就是一种安全策略,在网络上传输数据的时候,如果你是明文进行的话,那么容易受到截获,所以这样说来时很不安全的,所以引入了MD5机制,可以在传输数据的时候,将数据和密钥进行hash生成一个MD5校验值,附加在数据段的首部,那么在对方收到数据是,会将数据段重新用hash算法进行校验,若两个MD5的校验值相同,那么表示数据在传输的过程中没有收到篡改!

    flag是照片文件的MD5值,我们就下载MD5 Checksum Verifier软件查看图片的MD5值 image.png
    34bc2f23725efa6128f2f3abc0368d92

    AAencode

    先百度AAencode:
    什么是jjencode?
    将JS代码转换成只有符号的字符串
    什么是aaencode?
    将JS代码转换成常用的网络表情。

    神器的JavaScript加密工具aaencode 把js转为颜文字表情符号
    aaencode 加密
    aaencode 解密
    把页面代码放到解密里面解密就可以找到flag

    图种

    图种是什么?通俗来讲就是通过一些小技术将目标文件隐藏于一张图片里面,表面上看起来是一张图片,实际上里面含有其他文件。这种方式可以不受某些网站的限制,便于信息及文件的传递和共享。

    将后缀名改为rar,然后用压缩文件打开发现里面藏着一张gif动态图,打开可以发现一些文字: QQ图片20180112151140.png
    最后一段文字是:都深深的出卖了我,首字母为dssdcmlw

    nctf{dssdcmlw}

    层层递进

    【304 Not Modified:客户端有缓冲的文件并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
    一般的大的站点的图片服务器都有实现HTTP 304 缓存功能。
    这个 304 状态一般主要在用户刷新页面(F5键)的时候触发,当用户在刷新页面的时候,因为原来的页面里的很多图片已经缓存过,客户端的浏览器已经记录了图片的最后更新时间(Last Mod),所以在用户刷新页面的时候,会向服务器提交一个字段:If-Modified-Since: Wed, 08 Sep 2010 21:35:06 GMT
    这个时候,服务器端的程序先取得这个字段的值,然后与服务器上的图片最后修改时间对比,如果相同,就直接返回 304 Not Modified ,然后停止。这样就不用把图片重新传输到客户端,达到节省带宽的目的。】
    打开题目中的网址发现是一个网站的主页,没有其他的提示信息。

    查看源代码: image.png
    iframe 元素会创建包含另外一个文档的内联框架(即行内框架)。
    iframe中的marginwidth定义 iframe 的左侧和右侧的边距。
    marginheight定义 iframe 的顶部和底部的边距。
    scrolling会设置是否在在iframe中显示滚动条。
    border=0会去掉边框。

    你从哪里来

    HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。
    比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

    单身一百年也没用

    当我们直接点击“到这里找KEY”然后再进行抓包时 image.png

    找不到异常,

    当我们先抓包再点击接着再抓包时候会找到302重定向错误代码: image.png
    这时候可以在响应头中找到flag。
    百度302错误代码:302重定向又称之为302代表暂时性转移(Temporarily Moved ),英文名称:302 redirect。 也被认为是暂时重定向temporary redirect),一条对网站浏览器的指令来显示浏览器被要求显示的不同的URL,当一个网页经历过短期的URL的变化时使用。一个暂时重定向是一种服务器端的重定向,能够被搜索引擎蜘蛛正确地处理。

    easy! image.png

    直接base64解码

    BASE64是一种编码方式,通常用于把二进制数据编码为可写的字符形式的数据。
    这是一种可逆的编码方式。
    编码后的数据是一个字符串,其中包含的字符为:A-Z、a-z、0-9、+、/
    共64个字符:26 + 26 + 10 + 1 + 1 = 64。
    【注:其实是65个字符,“=”是填充字符】。

    Keybord

    题目的意思就是键盘,题目也提示看键盘看键盘,那肯定跟键盘有关系。
    直接按照题目给出的字母在键盘上画出来图案就会发现对应的字母。
    nctf{areuhack}

    n次base64

    由题目以及提示说编码次数有点多得知flag被base64加密了数次,于是我用在线base64解密工具多次解密就能得到flag: image.png

    COOKIE

    打开提示的网站后显示please login first!
    这个时候智能抓包,用Burpsuite抓包发现Cookie:login=0

    因为上面有个first 我尝试把login=1;然后重新发送 就得到flag image.png

    文件包含

    文件包含漏洞的利用
    考察PHP封装协议以及PHP文件包含。
    在url中添加?file=php://filter/read=convert.base64-encode/resource=index.php,读取到base64加密的index.php文件
    注解:
    1.php://filter/可用于处理打开的数据流,起到过滤作用。如果源文件为.php则很有可能在前台显示不出来。
    2.此时我们采用的方法是,先让文件转化为base64格式(convert.base64-encode)然后再输出,这样不论是什么格式的文件都可以在前台输出。

    Download~!

    查看页面源代码 图片.png

    发现下载地址是base64编码,需要解码解码后发现是两首歌的名字
    分析两首歌的文件也没有发现什么
    再看看题目和tips


    图片.png
    图片.png
    需要猜到需要下载download.php这个文件,url要用base64编码
    图片.png

    在if条件里面看到4个或者有3个都已经找到了,就差hereiskey.php。就需要对hereiskey.php进行base64编码然后放到url里面就能找到flag。

    MYSQL

    Do you know robots.txt?在网址后面加上robots.txt

    图片.png
    php intval()函数
    获取变量的整数值,允许以使用特定的进制返回。默认10进制
    注:如果参数为整数,则不做任何处理。

    根据TIP和源代码:在网址后输入sql.php?id=1024.1(id只要是1024.后面任意数值都可以)就能找到flag 图片.png

    sql injection 3

    SQL注入
    宽字节注入,双字节绕过
    MYSQl宽字节注入

    /x00

    图片.png
    非常重要的php正则表达式详解
    @的意思是忽略报错信息
    PHP ereg()函数
    PHP strpos()函数
    PHP中0、空、null和false的总结
    空字符串(''),false,NULL和0是值相等而类型不一样!

    第一种方法:ereg处理数组,所以这里nctf这里要用nctf[],构造一个arr[],传入之后,ereg是返回NULL的,===判断NULL和FALSE,是不相等的,所以可以进入第二个判断,strpos处理数组时,也是返回NULL,注意这里的是!==,NULL!==FALSE,条件成立,拿到flag
    我们还是先说数组 ereg是处理字符串的,所以,按照原理,我们将nctf构造一个arr[],传入之后,ereg是返回NULL的,===判断NULL和FALSE,是不相等的,所以可以进入第二个判断,而strpos处理数组,直接返回NULL,注意这里的是!==,NULL!==FALSE,条件成立,拿到flag。
    第二种:ereg的字符串截断漏洞。遇到%00则默认为字符串的结束。
    传nctf=1%00%23biubiubiu 接收到1后被截断,后面也有所需要的#biubiubiu,条件成立,拿到flag!

    html url编码
    为什么要进行URL编码
    URL中编码URL特殊字符

    bypass again

    图片.png
    由代码可以知道首先判断a与b的值是否为空,如果不为空就比较a是否!=b,注意这里的!=是弱类型的,如果不想等就继续判断a的MD5值是否等于b的MD5值,如果相等就给出flag
    第一种方法:提交两个加密后0e开头的字符串

    如果我们定义的相等是== 而不是===,试下 字符串 240610708跟QNKCDZO
    所有类似的字符串得到的md5如果是0e打头的,一些语言(PHP)会做隐式转换,当做int类型计算,得到的结果是 0,最后导致0==0,判定为true

    第二种方法:md5不能处理数组结构的数据。出错返回null,NULL==NULL。index.php?a[]=1&b[]=2

    变量覆盖

    变量覆盖漏洞
    CTF之php变量覆盖漏洞

    图片.png
    点开显眼的source.php文件, 图片.png
    发现if$pass==$thepassword_123就显示flag。那么就让它们两个相等。 图片.png

    PHP是世界上最好的语言 图片.png

    PHP eregi函数
    如果传进去的id含有hackerDJ就exit(),并且之后会对idURL解码一次再判断与hackerDJ是否相等,如果相等就给出flag。
    Url编码,传输过去默认会解码一次,所以我们不能只加密一次,需要加密两次

    图片.png
    图片.png

    伪装者

    WEB安全-伪造X-Forwarded-For绕过服务器IP地址过滤
    $_SERVER[“HTTP_X_FORWARDED_FOR”] 获得的值是HTTP中 X-Forwarded-For
    $_SERVER[“HTTP_CLIENT_IP”] 获得的值是HTTP中 Client-Ip( client-ip书写测试结果:服务器为window环境,则client-ip可以大小写混写。服务器环境为linux,则client-ip必须全部大写)
    $_SERVER[“REMOTE_ADDR”] 获得的值为 最后一个跟你的服务器握手的IP,可能会是代理IP或者其他
    $_SERVER[“HTTP_REFERER”] 获得的值为 HTTP中的Referer

    Headers

    关于HTTP协议,一篇就够了

    图片.png

    上传绕过

    要求上传JPG PNG GIF后缀的文件,上传了PNG图片又要求PHP后缀文件

    image.png
    我们需要把上传的PNG图片让他识别为PHP文件。
    截断上传漏洞
    典型漏洞归纳之上传漏洞 用burp截断上传文件时候的包在uploads/后面加一个123.php然后发送 image.png
    image.png

    发现basename等于路径后面的123.php加上了文件名,说明是通过basename判断文件类型的。所以让basename的后缀等于php就可以了。

    所以在123.php后面加一个00截断 image.png 在/uoloads/和123.php加个空格便于找到对应的16进制编码,然后将其改为00 image.png image.png

    pass check

    PHP strcmp函数
    strcmp($pass,$pass1)
    strcmp(array,string)=null=0
    当不同类型的变量进行比较的时候就会存在变量转换的问题,在转换之后就有可能会存在问题。

    图片.png
    HTTP常见Content-Type比较 图片.png
    用Burp添加POST参数 需要加Content-Type,hackbar应该是会自动添加上去。
    首先,只有使用POST方法的时候enctype才生效,GET方法默认使用application/x-www-form-urlencoded编码方法。

    HTML meta 中的Content-Type定义的数据类型和编码主要用于网页内容处理时,比如浏览器解析网页内容,或者搜索引擎的爬虫。

    Form表单中的enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
    默认地,表单数据会编码为 "application/x-www-form-urlencoded"。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值)。

    起名字真难

    图片.png 因为if ( ($digit >= $one) && ($digit <= $nine) )所以输进去的key不能是数字,但是最后还得等于$number == '54975581388' 图片.png
    ‘54975581388’的16进制是‘ccccccccc’
    所以?key=0xccccccccc

    密码重置

    url中user1=Y3RmdXNlcg%3D%3D,对他进行base64解码发现是ctfuser,而题目要求的是admin。对admin编码 图片.png
    然后用burp截断改包 图片.png

    PHP反序列化

    <?php
    class just4fun {
        var $enter;
        var $secret;
    }
    
    if (isset($_GET['pass'])) {
        $pass = $_GET['pass'];
    
        if(get_magic_quotes_gpc()){
            $pass=stripslashes($pass);
        }
    
        $o = unserialize($pass);
    
        if ($o) {
            $o->secret = "*";
            if ($o->secret === $o->enter)
                echo "Congratulation! Here is my secret: ".$o->secret;
            else 
                echo "Oh no... You can't fool me";
        }
        else echo "are you trolling?";
    }
    ?>
    

    关于get_magic_quotes_gpc()函数
    PHP stripslashes() 函数
    PHP之:序列化和反序列化-serialize()和unserialize()
    PHP引用(&)使用详解
    PHP 的引用允许你用两个变量来指向同一个内容
    $a->enter=&$a->secret;

    <?php   
    class just4fun {  
        var $enter;  
        var $secret;  
        function just4fun()  
        {  
            $a->enter=&$a->secret;
        }  
    }  
    echo serialize(new just4fun());  
    ?>
    
    代码跑一下 图片.png

    ?pass=O:8:"just4fun":2:{s:5:"enter";N;s:6:"secret";N;}

    综合题

    把javascrip转换为jsfuck代码,其中只包含六个不同的字符:!()+[]
    转换网址:http://jscrew.it/
    把网页中的jsfuck代码转换之后是1bc29b36f623ba82aaf6724fd3b16718.php

    图片.png 图片.png
    百度history of bash
    history介绍及bash命令快速调用
    命令记录.bash_history 图片.png 下载这个zip文件 图片.png

    密码重置2

    查看页面源代码可以找到邮箱:admin@nuptzj.cn
    根据提示:linux下一般使用vi编辑器,并且异常退出会留下备份文件。
    可能会存在备份文件,一般情况下备份文件一般都是myfile.txt~或者是.myfile.txt.swp,经过测试发现存在.submit.php.swp文件。
    内容:

    
    ........这一行是省略的代码........
    
    /*
    如果登录邮箱地址不是管理员则 die()
    数据库结构
    
    --
    -- 表的结构 `user`
    --
    
    CREATE TABLE IF NOT EXISTS `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `username` varchar(255) NOT NULL,
      `email` varchar(255) NOT NULL,
      `token` int(255) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
    
    --
    -- 转存表中的数据 `user`
    --
    
    INSERT INTO `user` (`id`, `username`, `email`, `token`) VALUES
    (1, '****不可见***', '***不可见***', 0);
    */
    
    
    ........这一行是省略的代码........
    
    if(!empty($token)&&!empty($emailAddress)){
        if(strlen($token)!=10) die('fail');
        if($token!='0') die('fail');
        $sql = "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'";
        $r = mysql_query($sql) or die('db error');
        $r = mysql_fetch_assoc($r);
        $r = $r['num'];
        if($r>0){
            echo $flag;
        }else{
            echo "失败了呀";
        }
    }
        
    

    根据条件 只要token长度等于10,并且等于0就会给出flag。
    让token=0000000000和邮箱一起提交


    PHP代码执行函数总结
    php 弱类型总结
    PHP弱类型的安全问题详细总结

    相关文章

      网友评论

          本文标题:南邮ctf部分 Writeup

          本文链接:https://www.haomeiwen.com/subject/yeprbxtx.html