一、Misc
1.丘比龙De女神
gif图片中嵌套去掉头部的加密zip压缩包。
2.Remove Boyfriend
流量分析中的导出两个py代码和jpg图片,将图片中的字符代入py代码执行,得出结果
3.MD5
通过py脚本中的hashlib库来生成md5值,通过re库来匹配给定md5值。注意md5的update()方法是不断将新的字符串拼接到之前的字符串后计算md5值,不是使用新字符串来计算md5值。
import hashlib
import re
charList = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
pattern = r"e9032\w\w\wda\w\w\w08\w\w\w\w911513\w0\w\w\wa2"
plainText1 = "TASC"
plainText2 = "O3RJMV"
plainText3 = "WDJKX"
plainText4 = "ZM"
for ch1 in charList:
for ch2 in charList:
for ch3 in charList:
string = plainText1+ch1+plainText2+ch2+plainText3+ch3+plainText4
md5 = hashlib.md5(string.encode()).hexdigest()
if re.match(pattern, md5):
print(md5)
exit(0)
二、Web
1.签到题
右键查看源码
2.签到2
修改输入框字符长度限制,成功提交口令zhimakaimen
3.md5 collision
由于字符串在使用==
作为比较符号时,字符串会被转换为数字,故不同的字符串只要转化为的数字的值相等,即可使判断成立。利用python写一个脚本即可找到这样的字符串。
import hashlib
import re
from itertools import permutations
import time
charList = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
pattern = r"^0e([0-9]{30})"
startTime = time.time()
for k in range(2,10):
print("length=%d" %(k),end="\t")
for item in permutations(charList,k):
item=''.join(item)
md5_value = hashlib.md5(item.encode()).hexdigest()
if re.match(pattern,md5_value):
print(item)
print(md5_value)
exit(0)
print("Time used :%fs" %(time.time()-startTime))
4.这题不是WEB
5.文件包含
用php://filter/convert.base64-encode/resource=index.php
即可解出。
6.AAencode
用burp
抓取homura.cc/CGfiles/aaencode.txt
把里面的内容放到AAEncode解码器中。
7.单身二十年
用burp
抓取请求,发现页面从/web8/search_key.php
通过<script>window.location="./no_key_is_here_forever.php"; </script>
跳转到了/web8/no_key_is_here_forever.php
。flag隐藏在/web8/search_key.php
中。
8.单身一百年也没用
这里的flag隐藏在index.php
的response的头部
9.php decode
直接将给出的php代码运行,或是将编码的shell解码出来打印,都可以看到flag。
10.COOKIE
根据提示,用burp抓包,将cookie中的login=0
改为login=1
。
11.MYSQL
题目考察intval()
函数,进行查询的$id
被intval()
转型,但是if语句中的判断条件是直接获取get请求,故尝试使用值大于1024小于1025的小数。
12./x00
题目考察php中ereg()
函数的\00
截断漏洞,被匹配的字符串如果包含\00
会被截断,后面的字符串不再参与匹配。需要构造
?nctf=1%00%23biubiubiu
注意这里的#
被URL编码为%23
是为了不被解析为URL中的锚
。
13.GBK Injection
利用常见的宽字节注入漏洞,注意本题过滤了where子句中的'
,可用hex编码绕过。或者直接用sqlmap也可以跑出来。
14.bypass again
此题目依旧考察php弱类型,两字符串使用==
比较时均会先转型为数字,再比较。转型规则见3.md5 collision。直接使用上题的字符串即可。
15.变量覆盖
if ($pass == $thepassword_123) {
echo $theflag;
}
就由于用户POST
了pass=1&thepassword_123=1
而被绕过。
16.伪装者
此题提示只有本地可以访问,尝试在请求头部加client-ip: 127.0.0.1
和X-Forwarded-For: 127.0.0.1
,发现client-ip: 127.0.0.1
有效。
17.上传绕过
此题尝试\00
截断,在/uploads/
后添加1.php jpg
,中间的空白需要用hex编辑为00
,即能上传成功。不必修改filename="1.jpg"
。
18.SQL注入1
看源码,即可解题。
user=admin%27%29%23&pass=Password
19.pass check
该题目考察srtcmp()
,当函数发生错误时,会显示警告并返回0。提交数组进行比较引发strcmp()
报错即可。
pass[]=
注意在提交请求时要使用POST请求提交。可以直接在burp中修改请求;也可以自己在html中添加form表单,并使用POST方法提交;还可以使用firefox
的hackbar
插件进行POST提交。
20.起名字真难
仔细阅读题目给出的源码,大意是将$_GET
得到的字符串按位转化为对应的ASCII码,并判断该ASCII码是否介于1~9
的ASCII码之间,如果在则返回false
,否则判断该字符串的值是否与54975581388
相等,相等则返回true
。可以想到利用16进制字符串绕过。而且54975581388
的16进制恰好是0xccccccccc
,该字符串的每一位都符合函数判断条件。
21.密码重置
观察题目的URL/web13/index.php?user1=Y3RmdXNlcg==
,发现Y3RmdXNlcg==
为ctfuser
的base64编码,故将user1
的参数换为admin
的base64编码,并将post的用户名修改为admin
提交如下:
22.SQL Injection
通过查看页面源代码得到该题的源码,发现代码使用了stripslashes()
删除用户提交的\
构成的转义符号。同时使用htmlentities($str, ENT_QUOTES)
将用户提交的'
和"
转义为html实体。故尝试提交:
username=\\&password=||1%23
拼接后的查询语句为:
SELECT * FROM users WHERE name='\' AND pass='||1#';
但是这样并不能成功注入,猜测是由于get_magic_quotes_gpc()
返回为0,所以stripslashes()
未执行,故修改为:
username=\&password=||1%23
成功提交。
注:查看网页源代码是个好习惯,本题中的html实体编码在普通网页中看不出来。
23.SQL注入2
查看php源码,发现可以使用union注入。
if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
echo "<p>Logged in! Key: ntcf{**************} </p>";
}
题目通过比较查询出的密码和用户输入的密码比对来验证,故可以通过union select
人为添加查询结果,并提交密码。这样两个参数均可以被控制。故提交如下:
user=%27union+select+md5%28%27pass%27%29 %23&pass=pass
24.综合题
访问题目链接,发现是JSFuck编码,将该编码放到浏览器的console中执行,页面显示
访问该文件
/web3/b0b0ad119f425408fc3d45253137d33d/1bc29b36f623ba82aaf6724fd3b16718.php
显示
查看响应的头部发现
由于linux下会将历史命令保存在用户/home
目录下的.bash_history
中,故尝试访问该文件。
/web3/b0b0ad119f425408fc3d45253137d33d/.bash_history
找到以下历史命令:
zip -r flagbak.zip ./*
猜测该目录下存在flagbak.zip
,故访问:
/web3/b0b0ad119f425408fc3d45253137d33d/lagbak.zip
下载解压出flag.txt
,拿到flag。
25.密码重置2