Web

作者: kur0mi | 来源:发表于2018-08-12 19:54 被阅读25次

    这是 ISITDTU 的一些 web 题目

    来自 ISITDTU CTF 2018 部分Web题目Writeup
    这里仅做一下总结

    1. LZ
    <?php 
    
    include "config.php"; 
    $number1 = rand(1,100000000000000); 
    $number2 = rand(1,100000000000); 
    $number3 = rand(1,100000000); 
    $url = urldecode($_SERVER['REQUEST_URI']); 
    $url = parse_url($url, PHP_URL_QUERY); 
    if (preg_match("/_/i", $url))  
    { 
        die("..."); 
    } 
    if (preg_match("/0/i", $url))  
    { 
        die("..."); 
    } 
    if (preg_match("/\w+/i", $url))  
    { 
        die("..."); 
    }     
    if(isset($_GET['_']) && !empty($_GET['_'])) 
    { 
        $control = $_GET['_'];         
        if(!in_array($control, array(0,$number1))) 
        { 
            die("fail1"); 
        } 
        if(!in_array($control, array(0,$number2))) 
        { 
            die("fail2"); 
        } 
        if(!in_array($control, array(0,$number3))) 
        { 
            die("fail3"); 
        } 
        echo $flag; 
    } 
    show_source(__FILE__); 
    
    
    
    
    ?>
    

    LZ考点是 parse_url 的漏洞
    parse_url 会将一个 url 解析为一个包含各部分的数组
    但是解析失败时会返回 False

    利用这点我们可以直接绕过之后的三个过滤

    payload: ///?_=a

    1. Friss
      题目为服务端的一个 curl
      试一下 file 协议提示需要 localhost,用 file://localhost/etc/shadow 绕过,可以看到没有再报错
      接下来我们读取源码 file://localhost/var/www/html/index.php
      读取成功,页面源码找到 源代码
    <?php
    include_once "config.php";
    if (isset($_POST['url'])&&!empty($_POST['url']))
    {
        $url = $_POST['url'];
        $content_url = getUrlContent($url);
    }
    else
    {
        $content_url = "";
    }
    if(isset($_GET['debug']))
    {
        show_source(__FILE__);
    }
    
    
    ?>
    

    接下来就是愉快的代码审计了
    接着读取 config.php

    <?php
    
    
    $hosts = "localhost";
    $dbusername = "ssrf_user";
    $dbpasswd = "";
    $dbname = "ssrf";
    $dbport = 3306;
    
    $conn = mysqli_connect($hosts,$dbusername,$dbpasswd,$dbname,$dbport);
    
    function initdb($conn)
    {
        $dbinit = "create table if not exists flag(secret varchar(100));";
        if(mysqli_query($conn,$dbinit)) return 1;
        else return 0;
    }
    
    function safe($url)
    {
        $tmpurl = parse_url($url, PHP_URL_HOST);
        if($tmpurl != "localhost" and $tmpurl != "127.0.0.1")
        {
            var_dump($tmpurl);
            die("<h1>Only access to localhost</h1>");
        }
        return $url;
    }
    
    function getUrlContent($url){
        $url = safe($url);
        $url = escapeshellarg($url);
        $pl = "curl ".$url;
        echo $pl;
        $content = shell_exec($pl);
        return $content;
    }
    initdb($conn);
    ?>
    

    可以看到 flag 就在 数据库中 flag表 secret 字段中放着!
    审计 getUrlContent 函数
    看到在服务器上执行了 curl 命令,并且参数可控
    利用 gopher 协议可以攻击内网 mysql 造成 ssrf
    关于 攻击方法见我的 另一篇文章

    相关文章

      网友评论

          本文标题:Web

          本文链接:https://www.haomeiwen.com/subject/xqsqvftx.html