南邮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下的“截断”问题
posted @ 2021-12-12 17:28  煊奕  阅读(97)  评论(0编辑  收藏  举报