NSSCTF-Web题目11

目录

[[鹤城杯 2021]EasyP](#[鹤城杯 2021]EasyP)

1、题目

2、知识点

3、思路

[[SWPUCTF 2022 新生赛]numgame](#[SWPUCTF 2022 新生赛]numgame)

1、题目

2、知识点

3、思路


[鹤城杯 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}


这篇文章就先写到这里,哪里不足的或者哪里不懂的欢迎指正

相关推荐
小镇程序员3 小时前
vue2 src自定义事件
前端·javascript·vue.js
AlgorithmAce6 小时前
Live2D嵌入前端页面
前端
nameofworld6 小时前
前端面试笔试(六)
前端·javascript·面试·学习方法·递归回溯
前端fighter6 小时前
js基本数据新增的Symbol到底是啥呢?
前端·javascript·面试
GISer_Jing6 小时前
从0开始分享一个React项目:React-ant-admin
前端·react.js·前端框架
川石教育6 小时前
Vue前端开发子组件向父组件传参
前端·vue.js·前端开发·vue前端开发·vue组件传参
GISer_Jing7 小时前
Vue前端进阶面试题目(二)
前端·vue.js·面试
乐闻x8 小时前
Pinia 实战教程:构建高效的 Vue 3 状态管理系统
前端·javascript·vue.js
weixin_431449688 小时前
web组态软件
前端·物联网·低代码·编辑器·组态
橘子味小白菜8 小时前
el-table的树形结构后端返回的id没有唯一键怎么办
前端·vue.js