欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

drops夏令营 第四天主要做了web题

程序员文章站 2022-03-04 19:46:10
...

1./X00

drops夏令营 第四天主要做了web题

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 '骚年,继续努力吧啊~';
    }

第一个if里的条件  nctf只能是数字,第二个if里的条件  nctf字符串里包含#biubiubiu,怎么办?

方法一:因为ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配。

get提交数据情况下,url数据传输中一些特殊符号会被转义,导致后台无法正常获取数据。解决方法是针对特殊字符转义为ASCII码值。参考https://blog.csdn.net/zhpengfei0915/article/details/19156441 

故nctf=2%00%23biubiubiu  就可以了。

drops夏令营 第四天主要做了web题

方法二:使用数组的形式绕过,ereg是处理字符串的,所以,按照原理,我们将nctf构造一个arr[]  (payload为:nctf[]=1),传入之后,ereg是返回NULL的,===判断NULL和FALSE,是不相等的,所以可以进入第二个判断,strpos处理数组时,也是返回NULL,注意这里的是!==,NULL!==FALSE,条件成立,拿到flag

drops夏令营 第四天主要做了web题

相关查询:

PHP 函数 ereg()

语法

    int ereg(string pattern, string originalstring, [array regs]);

定义和用途

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

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

^[1-9] 以1到9的某位数字开头

+表示可以有多个,$匹配结尾

strpos() 函数查找字符串在另一字符串中第一次出现的位置。

注释:strpos() 函数对大小写敏感。

注释:该函数是二进制安全的。

相关函数:

  • stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写)
  • strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
  • strrpos() - 查找字符串在另一字符串中最后一次出现的位置(区分大小写)

 

2.看看源代码吧。

drops夏令营 第四天主要做了web题

fn+f12查看源代码,如下图,可看到p1,p2加密了。

eval(unescape(p1) + unescape('%35%34%61%61%32' + p2));

drops夏令营 第四天主要做了web题

用记事本把加密的部分合在一起记下来,然后找个unescape在线查询工具进行解密。

drops夏令营 第四天主要做了web题

drops夏令营 第四天主要做了web题

蓝色部分字符粘贴到submit里,得到key

drops夏令营 第四天主要做了web题

3.JSPFUCK??????答案格式CTF{**} 字母大写

drops夏令营 第四天主要做了web题

看一下源代码,把这些代码,放进控制台console里,回车,就OK了。

drops夏令营 第四天主要做了web题

4.矛盾

drops夏令营 第四天主要做了web题

drops夏令营 第四天主要做了web题

使用is_numeric遇到%00截断的漏洞,这里构造

http://120.24.86.145:8002/get/index1.php?num=1%00

 

php intval()函数漏洞,is_numeric() 漏洞,绕过回文判断

Intval函数获取变量整数数值
Intval最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上, intval(‘1000000000000’) 会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。

这个有个应用就是在判断数值是不是回文上,如果参数为2147483647,那么当它反过来,由于超出了限制,所以依然等于2147483647。即为回文。

is_numeric()  判断变量是否为数字或数字字符串,不仅检查10进制,16进制是可以。

is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。所以,查看函数发现该函数对对于第一个空格字符会跳过空格字符判断,接着后面的判断!

该函数还可能造成sql注入,例如将‘1 or 1'转换为16进制形式,再传参,就可以造成sql注入

intval($req["number"])=intval(strrev($req["number"]))  如果要求不是回文,但又要满足这个条件,可以用科学计数法构造0=0:number=0e-0%00

原文:https://www.cnblogs.com/GH-D/p/8085676.html

drops夏令营 第四天主要做了web题

5.我说的是真的

drops夏令营 第四天主要做了web题

先查了查源代码,发现什么都没有,最后抓包,在历史记录,回应里找到key。

drops夏令营 第四天主要做了web题

 

相关标签: ctf