• 南邮CTF记录


    你帮我一次,我记你终生。

    前言:

    记录一些题,继续学习。主要记录自己不懂得或忘记的,写的不好,还请谅解。
    如想查看完整的writeup,可参考:

    1. NCTF 南京邮电大学网络攻防训练平台 WriteUp
    2. 南京邮电大学网络攻防训练平台writeup

    GBK Injection

    1.记录此题,主要学习关于宽字节注入。
    原理:在GBK编码时,mysql会认为两个字符是一个汉字(在前一个字节的ascii码大于128的情况下)。而经过转义之后的单引号'会变为\',即%5c%27。构造id=1%df%27%23 ,在经过转义传递给mysql时,就是id=1%df%5c%27%23,mysql在解析时,会认为%df%5c是一个汉字,而%27就会闭合掉原本sql语句中的(左)单引号,即select xxx from xxx where id='%df%5c'#'%23用于注释掉原本sql语句中的(右)单引号。这就是宽字节注入的原理。

    2.构造注入:
    先查看数据库:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df%27 union select null,database()--+ sae-chinalover

    然后查表:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df%27 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+ 这个比较过分,有5个表:ctf,ctf2,ctf3,ctf4,news

    因为引号被过滤,按常规的注入,得绕很多。这里猜测flag字段为flag,然后一个一个表查,发现是在表ctf4 语句为:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%d6%27 union select 1,(select flag from ctf4) --+ 更换表名查即可。

    参考:

    深入探究宽字节注入漏洞与修补原理

    /x00

    1.这是一道很纯粹的代码审计题,提示说了有多种做法,故记录一下。
    这是给出的源码:

     view-source:
    
        if (isset ($_GET['nctf'])) {
            if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
                echo '必须输入数字才行';
            else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)   
                die('Flag: '.$flag);
            else
                echo '骚年,继续努力吧啊~';
        }
    
    

    2.分析:

    • @eval@的作用就是忽略报错信息
    • ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的 PHP 函数 ereg()
    • strpos() 函数: 返回字符串在另一个字符串中第一次出现的位置,如果没有找到该字符串,则返回 false PHP strpos() 函数

    3.如何绕过:
    这里传入的nctf要用nctf[],构造一个数组,传入之后,ereg()返回NULL===判断NULLFALSE,是不相等的,所以可以进入第二个判断。strpos()处理数组时,也是返回NULLNULL!==FALSE,条件成立,拿到flag

    其实,在等与不等这块,自己感觉有些混乱了,因为NULL==FALSE,应该也是成立的。所以检查了一下:

    发现确实是相等的,相当于他们是恒等的,PHP的弱类型比较真是可怕。

    4.趁此机会,复习一下弱类型比较:下图写的是函数strcmp()md5()存在的弱类型问题,可通过这些问题进行相关绕过。

    5.最后,直接附上看到的几篇关于PHP弱类型的文章:

    1. PHP中0、空、null和false的总结
    2. php 弱类型总结
    3. PHP弱类型的安全问题详细总结

    上传绕过

    1.遇到这题,说实话,心里想到的是:所有跳过的坑,都得补回来。
    之前做Bugku的时候遇到的文件上传,那个题也是不会,看了别人的writeup后,以为文件上传不难,匆匆地过了。现在想来,真是井底之蛙。
    2.此题,先上传了一个jpg文件,发现提示如下:

    3.再传个php试试:

    对比上图,发现过滤机制是检查扩展名(当扩展名不通过时,上传不了)仔细查看上传后的文件位置,发现存于./uploads目录下。

    4.既然不许上传php文件格式(上传时过滤)又要求上传为php格式文件(上传到服务器后检验),那只能从提示的信息中想办法绕过了。从上面的信息中,知道上传的文件在./uploads目录下,将文件名存于basename字段中,并且通过分割文件名和扩展名来检验,因此,应该是通过extension字段来进行识别。

    5.现在,需要做的就很明确了,上传的文件名应该被截断,分成两部分,把.php的部分存于basename中,后面的.jpg不可进入,否则无法绕过。所以,使用0x00截断.php后的字符:

    6.在burpsuite中进行修改,如图:

    然后修改:

    变成:

    得到flag:

    7.上面写的有些繁琐,主要为了学习文件上传的知识,下面是相关知识的学习:
    关于截断:

    关于文件上传:看了下面几篇文章后,说实话,有的没有看懂。此时,方知关于此知识点的运用真是各式各样,看来只能多实践才能慢慢掌握。

    1. [PHP] 文件上传过程中基于白名单、黑名单、基于MIME的认证以及目录认证
    2. 文件上传漏洞(绕过姿势)
    3. 挖洞姿势 | 深度聊聊PHP下的“截断”问题
    感谢阅读,如有问题,请批评指正,谢谢。
  • 相关阅读:
    软件工程第一个个人小程序
    关于程序的单元测试
    求整数数组中子数组最大的和
    电梯调度程序开发 付亚飞 段兴林
    每天听英语系列一
    去除U盘写保护
    显示pdf格式的图片
    在页面判断起始时间是否大于结束时间
    从页面上灵活增删改查
    柱形图,饼状图,折线图JavaScript
  • 原文地址:https://www.cnblogs.com/clwsec/p/15679887.html
Copyright © 2020-2023  润新知