Web

2018-08-12  本文已影响25人  kur0mi

这是 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
关于 攻击方法见我的 另一篇文章

上一篇下一篇

猜你喜欢

热点阅读