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

1./X00

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  就可以了。

相关查询:

PHP 函数 ereg()

语法

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

定义和用途

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

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

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

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

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

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

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

相关函数:

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

2.看看源代码吧。

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

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

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

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

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

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

4.矛盾

使用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

5.我说的是真的

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

猜你喜欢

转载自blog.csdn.net/yumengzth/article/details/81125605