• CG-CTF(3)


      CG-CTF

      https://cgctf.nuptsast.com/challenges#Web

      续上~

      

      第十四题:GBK Injection

     

      是一道注入题;

      分析:题目提示了GBK,GBK是一种多字节的编码,两个字节代表一个汉字,而在PHP+MySQL的环境中,存在宽字节注入漏洞,即PHP将“'”转义为“’”,编码之后为%5c%27,而如果我们输入%d5(或%df等),%d5%5c将组合出一个汉字,保留了%27的单引号闭合功能,造成转义失效,从而实现注入;

      思路:首先验证一下单引号是否被转义,以及是否存在宽字节注入;

     

     

      的确存在宽字节注入;

      对表的列数进行判断;

     

      可以判断当前查询表有两列;

      用length(database())Δnumber判断数据库名长度;

     

      数据库名的长度为14位;

      用ascii(substr(database(),1,1)) Δnumber来猜解数据库名;

     

     

     

     

      得到数据库名为“sae-chinalover”;

      用(select count(table_name) from information_schema.table where table_schema=database())Δnumber来猜解表的数量;

      得到表的数量为6;

      用 (select table_name from information_schema.tables where table_schema=database() limit 0,1)来猜解表名;

      得到6个表名,猜测flag应该在“gbksqli”这个表里;

      用(select*from gbksqli)来获取表中的数据;

     

      取得flag(干杯~);

      P.S.:在猜解表名的时候,才反应过来有回显,因此在猜解数据库名的时候其实不用一个个猜解,直接用union select null,database()#就能看到数据库名字。。。

     

     

      第十五题:/x00

     

      分析代码:

      用了两个函数ereg()和strpos();

      ereg():

        语法:int ereg(string pattern, string originalstring, [array regs])

        用途:ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。

        参数定义:

          可选的输入参数规则包含一个数组的所有匹配表达式,他们被正则表达式的括号分组。

      strops():

        语法:strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) : int

        用途:查找字符串首次出现的位置

        参数定义:

          haystack:

            在该字符串中进行查找。

          needle:

            如果 needle 不是一个字符串,那么它将被转换为整型并被视为字符的顺序值。

           offset:

            如果提供了此参数,搜索会从字符串该字符数的起始位置开始统计。 如果是负数,搜索会从字符串结尾指定字符数开始。

        返回值:

          返回needle存在于haystack字符串起始的位置(独立于offset)。同时注意字符串位置是从0开始,而不是从1开始的。如果没找到 needle,将返回 FALSE。

     

      正则表达式分析:^[1-9]+$

        ^:表达式开始;

        $:表达式结束;

        [1-9]:数字1-9的范围;

        +:重复一次或多次;

     

      整段代码的含义:输入nctf的值,若不为1-9的数字,返回“必须输入数字才行”,若为1-9的数字,且找到了“#biubiubiu”,则返回flag,若没找到“#biubiubiu”,则返回“骚年,继续努力吧啊~”;

     

      思路1:题目提示为/00,可以想到%00截断,确实,在函数ereg()中,遇到%00则默认字符串结束,那么尝试构造nctf=1%00%23biubiubiu;

     

      取得flag(干杯~);

      思路2:函数ereg(),在输入为数组时,其返回值并不为false;

     

     

      可以看到$bbb的返回值为true,而$aaa的返回值并不为false而是报错;

      故可以用构造数组来绕过函数ereg();

     

     

      同理,可以绕过函数strpos();

      尝试构造nctf[]=1;

     

      取得flag(干杯~);

     

      未完待续~

  • 相关阅读:
    面试官问我:三次握手与四次挥手是怎么完成的?我竟然只回答出一半...
    狡猾的 AI 工程师,编个故事都能骗 2 亿人民币
    拒绝遗忘:高效的动态规划算法
    推荐几个优质 IT 公众号
    刚爆火就下线的 ZAO 换脸,背后是另一场技术人的狂欢
    面试前复习!关于 CPU 的一些基本知识总结
    面试官:为什么 MySQL 的索引要使用 B+ 树,而不是其它树?比如 B 树?
    为什么程序猿 996 会猝死,而企业家 007 却不会?
    图解 LeetCode 难题:「和至少为 K 的最短子数组」
    从外由内剖析一道腾讯面试算法题
  • 原文地址:https://www.cnblogs.com/Dio-Hch/p/11891149.html
Copyright © 2020-2023  润新知