Web
2018-08-12 本文已影响25人
kur0mi
这是 ISITDTU 的一些 web 题目
来自 ISITDTU CTF 2018 部分Web题目Writeup
这里仅做一下总结
- 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
- 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
关于 攻击方法见我的 另一篇文章