关于GJCTF 可以看看这个帖子 https://blog.csdn.net/qq_27180763/article/details/84329839
本文章经GJCTF作者授权发表 原创 是我个人对这个CTF的解题思路
① http://www.czlgjbbq.top/GJCTF/brute.php GJCTF{anjjPONFAkg}
访问这个网址
研究了一下,发现session值很像base64加密后的内容
T1RJMk5UTT0=解密一次后OTI2NTM=解密两次后 92653
于是这个五位数密码就是92653了(这个密码对于不同的访问应该是不一样的 不过都是这个二次base64过程)
输入进去 顺利拿到flag
② http://www.czlgjbbq.top/GJCTF/boom.php GJCTF{AxafKIOHJHOI}
要找到两个不等的文本 然而md5和base64都相同
根据md5的漏洞:两个开头为0E的md5都会被解释为0,md5不能处理数组。
s878926199a和s155964671a的md5都开头为0E,在php中判定相同(安全的方法是===)
但是光md5相同也是不行的 还需要base64相同
但是因为它们都不能处理数组
所以我提交了?number1[]=1&number2[]=2 成功拿到flag
③ http://www.czlgjbbq.top/GJCTF/number_question.php GJCTF{agyugfzxxsaf}
可以看出 这是让提交一个非数字的类型但是满足$num==1的
于是get提交?num=1+
④ http://www.czlgjbbq.top/GJCTF/re_getflag.php GJCTF{AJDJGpj2a9898ASX00}
根据提示 是考正则表达式绕过的 构造一个符合条件的正则表达式
/key.key.....key:/./.keyb,/i
原正则:"/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i"
从前到后分解:
/key --> 匹配/key
.* --> 匹配至少一个点
key --> 匹配key
.{4,7} --> 匹配至少4个至多7个点
key: --> 匹配key:
\/.\/ --> 匹配\.\
(.*key) --> 匹配至少一个点后面跟key
[a-z] --> 匹配a-z之间的任意一个字符
[[:punct:]] --> 匹配任意一个英文标点
/i --> 匹配/i
⑤ http://www.czlgjbbq.top/GJCTF/login.php GJCTF{RandLpsxQQQ}
我注册了一个用户名密码都为1的账号 登录后显示然并卵 你说气人不气人!
看来普通账户是不行的 必须登录admin 这出题人真狡猾 一看就是个职业骗子 我试一试admin
我猜它的admin在sql语句里 之前听说过希腊字符的sql一个bug 这次试试
找一个ǎ作为a的替代
成功获取flag
⑥ http://www.czlgjbbq.top/GJCTF/inspect.php GJCTF{A8B52JV0A01JC1_UUQ}
真菜 写个这样的html还用dw写
发现这里最多输入一位数 但是要满足这个条件需要很多位 直接暴力改maxlength
就像这样
⑦ http://www.czlgjbbq.top/GJCTF/strcmpass.php GJCTF{A66COoda0ap9966azx}
这是让我越过strcmp函数?总不可能一下子猜到flag吧
直接越过?payload[]=a
⑧ http://www.czlgjbbq.top/GJCTF/ihchange.php GJCTF{ASX192GJ220a001ps}
刚开始没想出来什么和$number能判断相等 后来想到用16进制来表达这个数
然后这时正好满足不在0到9里 没试过别的进制行不行
于是提交0xFFEEDDAA即可
⑨ http://www.czlgjbbq.top/GJCTF/brute2.php GJCTF{wolubenweimeiyoukaigua}
计算结果居然在cookie里 我提交
我无语了 我再提交几次计数器只会计数
于是写了个获取cookie的函数 试试能不能自动获取密码
function getCookie(name)
{
var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
if(arr=document.cookie.match(reg))
return unescape(arr[2]);
else
return null;
}
document.getElementsByTagName("input")[0].value=getCookie("password");
document.getElementsByTagName("input")[1].click();
然后我用按键精灵刷脚本
1次留念 太感人了
然后flag就拿到了 肯定有简单的方法(我的意思是 能做一个批量提交) 这里采取了最暴力的(按键精灵)方法
⑩ http://www.czlgjbbq.top/GJCTF/extract.php GJCTF{Sc1551Vrgrxxappbf}
提示是变量覆盖 先阅读一下PHP代码
为什么我按了一下提交按钮就出flag了……可能是出bug了
11 http://www.czlgjbbq.top/GJCTF/easy_sql1.php GJCTF{tql!tql!niubi!}
这很明显是个sql注射题
我们构造user=’admin’ 把后面注释掉 不用判断密码
在用户名里输入admin’)# 密码随便输(反正也会被md5和注释掉)
12 http://www.czlgjbbq.top/GJCTF/input.php GJCTF{AcE_TQL_getflag}
意思是让我get提交一个文件名内容为getflag
我把这个文件上传到我的服务器上 然后设置get表单参数 提交!
13 http://www.czlgjbbq.top/GJCTF/passwordrenew.php GJCTF{I_am_5upermAn}
看到那里有给value的base64内容 我一解析发现内容就是GJCTF 由此可见这个参数应该是用来校验用户名的
我要是改了用户名为admin 这个也需要改成admin的base64:YWRtaW4=
密码随便输 拿flag
14 http://www.czlgjbbq.top/GJCTF/easyaduit.php GJCTF{You_A4e_@_Good_Hacker}
发现substr() 传进去一个数组即可
差一点哦
说明已经越过日爆md5了,但是差一点
需要绕过file_get_contents()函数 这里可以采取data伪协议 当然也可以把文件放我服务器里
但是无论哪种方式 都需要传字母 但是前面又不能传字母 这个字母检验能不能绕过呢?
我们发现 如果同时GET和POST提交同一个参数 那么POST的参数对于$_REQUEST优先 因此 我们可以“挂羊头卖狗肉”绕过字母检验 再POST提交一个flag用于骗过检验