目录
[[鹤城杯 2021]EasyP](#[鹤城杯 2021]EasyP)
[[SWPUCTF 2022 新生赛]numgame](#[SWPUCTF 2022 新生赛]numgame)
[鹤城杯 2021]EasyP
1、题目
2、知识点
php代码审计
3、思路
打开题目,出现一段代码,我们对代码进行审计
这里出现了很多不懂的函数,下面进行解释
$_SERVER()是一个包含了文件头、路径等信息的数组
例如url:http://127.0.0.1/dir/test.php?id=1
$_SERVER['PHP_SELF']:获取当前执行url的文件
执行结果:/dir/test.php
$_SERVER['REQUEST_URI']:获取当前执行url的文件还有参数
执行结果:/dir/test.php?id=1
basename()函数:简而言之就是取url中最后一个文件
例如上面的例子,执行结果:/test.php
basename 函数有这样一个特性:在使用默认语言环境设置时,basename() 会删除文件名开头的非 ASCII 字符。
了解了这些函数,接下来就审计一下代码
1、
if (isset($_POST['guess'])) {
$guess = (string) $_POST['guess'];
if ($guess === $secret) {
$message = 'Congratulations! The flag is: ' . $flag;
} else {
$message = 'Wrong. Try Again';
}
}
这一段代码就是通过POST方式上传guess变量,且跟secret变量的值强比较,但是secret变量的值我们不知道,所以这一个也没法突破
2、if (preg_match('/utils\.php\/*$/i', $_SERVER['PHP_SELF'])) {
exit("hacker :)");
}
if (preg_match('/show_source/', $_SERVER['REQUEST_URI'])){
exit("hacker :)");
对上传的url进行正则比较,不能有utils.php、show_source,/i的作用是大小写都可以
3、if (isset($_GET['show_source'])) {
highlight_file(basename($_SERVER['PHP_SELF']));
exit();
上传一个show_source变量
PHP参数解析特性PHP会自动将参数转换为有效的变量名:
1.删除空白符
2.将特殊字符**
[+ .
**转化成下划线_
利用这个特性,就可以绕过对show_source的过滤
所以我们构造payload:
http://node4.anna.nssctf.cn:28798/index.php/utils.php/哈哈?show[source=1
basename(http://node4.anna.nssctf.cn:28798/index.php/utils.php/哈哈?show\[source=1)
结果为:/哈哈
这样就绕过了对utils\.php的检测
?show[source=1 执行结果为:show_source=1
注:这里需要加上index.php,这里不懂为什么需要加上index,可能是题目的设计
得到flag:NSSCTF{3f08c921-26a9-459f-b947-8a0254cbdfdb}
[SWPUCTF 2022 新生赛]numgame
1、题目
2、知识点
php代码审计
3、思路
打开题目
根据题目提示,发现到不了题目结果,右键打不开源码,用开发者模式打开会自动关闭网页
先打开开发者模式中的控制台,再访问url就可以看到源码
得到源码
翻看源码
发现NSSCTF{TnNTY1RmLnBocA==},以为是flag,结果不是,看着像base64编码,进行解码
Base64解码 Base64编码 UTF8 GB2312 UTF16 GBK 二进制 十六进制 解密 - The X 在线工具 (the-x.cn)
解码得到:NsScTf.php
访问这个页面,得到源代码
审计代码:
需要我们用get上传一个p参数,然后调用call_user_func()
call_user_func()
上面定义了一个nss类,类中有一个ctf函数,意思就是p参数的值就是ctf函数,然后
call_user_func(ctf)执行这个ctf函数
那么怎么使用类中的函数呢,php中使用双冒号::
在php中双冒号(::)操作符是一种范围解析操作符,又作用域限定操作符。它是对类中的方法的静态引用,可以访问静态、const和类中重写的属性与方法
if (preg_match("/n|c/m",$_GET['p'], $matches))
源代码中还对n和c进行了过滤,但是发现没有对大小写进行检测,所以我们可以大写来绕过检测
构造payload:
/NsScTf.php/?p=NSS2::Ctf
没有回显内容,右键查看源码
得到flag:NSSCTF{061771ca-0a8e-443f-8e5d-9782103ab52e}
这篇文章就先写到这里,哪里不足的或者哪里不懂的欢迎指正