Rock's blog

兴趣是最好的老师

0%

CG-CTF_解题思路

一、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

本题利用php弱类型比较。php弱类型总结

由于字符串在使用==作为比较符号时,字符串会被转换为数字,故不同的字符串只要转化为的数字的值相等,即可使判断成立。利用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

另存题目中的图片,用Stegsolve中的File Formart分析。

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。

根据提示,用burp抓包,将cookie中的login=0改为login=1

11.MYSQL

题目考察intval()函数,进行查询的$idintval()转型,但是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.变量覆盖

此题考察extract()函数的变量覆盖问题,extract()会将键名当作变量名,值作为变量的值,将变量从数组中导入到当前的符号表中。如果使用默认的EXTR_OVERWRITE模式,并将此函数用于接收用户的输入,则会导致严重的变量覆盖问题。此题中的

if ($pass == $thepassword_123) {
    echo $theflag;
}

就由于用户POSTpass=1&thepassword_123=1而被绕过。

16.伪装者

此题提示只有本地可以访问,尝试在请求头部加client-ip: 127.0.0.1X-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方法提交;还可以使用firefoxhackbar插件进行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