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 就可以了。
方法二:使用数组的形式绕过,ereg是处理字符串的,所以,按照原理,我们将nctf构造一个arr[] (payload为:nctf[]=1)
,传入之后,ereg是返回NULL的,===判断NULL和FALSE,是不相等的,所以可以进入第二个判断,strpos处理数组时,也是返回NULL,注意这里的是!==,NULL!==FALSE,条件成立,拿到flag
相关查询:
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。
上一篇: jquery如何让按钮不可用
推荐阅读