ctfshow【萌新赛】
本文最后更新于:2023年8月25日 下午
ctfshow【萌新赛】
给她
从名字看就像git源码泄露,我们先用dirmap扫描一下:

果然是git源码泄露,我们使用githack 下载泄露的源码:

这里学到一个新的函数:sprintf() 

签到题
| 1 |  | 
看到system就会想到命令执行,我们可以使用分号;去分隔命令。
payload:
| 1 |  | 
假赛生
提示:register.php login.php 大佬们别扫了
index.php
| 1 |  | 
根据提示,我们访问register.php可以进行注册,访问login.php可以进行登录
我们先分析一下源代码index.php,我们首先需要 $name==='admin' ,$name是注册的时候设置的session值
只有我们注册的用户为admin才可以绕过第一层
这里有一个tips:
mysql的
char、varchar、text类型进行等值比较时,会忽略末尾的空格
例如:

末尾的空格被忽略了,我们还是查询出了数据
我们再插入一条数据看看:

我们发现插入的用户名:leekos     后面的空格也被自动去除了
如果我们想要精确查询,可以使用
like关键字,不会忽略末尾的空格
根据以上分析,我们知道了,我们可以创建名为: admin  (后面有一个空格)的用户,这样就可以以admin身份登录了


成功登录,但是我们需要绕过第二层过滤:
| 1 |  | 
preg_replace_callback() 函数作用是匹配到了 /\w\W*/ 就会执行函数:function(){die("not allowed!");}
参数c 直接为空就行

萌新记忆

没什么东西,我们使用dirsearch扫一下:

发现 /admin/ 目录,我们访问一下,发现是一个登录页面,应该是sql注入

经过测试,我们发现用户名为:admin,并且只有用户名这里有注入点,
当用户名正确时,回显:密码错误。当用户名错误时,回显:用户名/密码错误
很明显这里需要使用 布尔盲注
我们先使用 fuzz看一下过滤了哪些字符:

发现:or、select、union等被过滤了
但是:<、()、substr、length、|| 没有被过滤,我们可以使用 || 去代替or
这里注入需查询的方式和以往不同,这里只需要查询出admin的密码即可
用户名admin的密码字段为:p
我们首先使用length查询出密码的长度
| 1 |  | 

| 1 |  | 

此时说明密码长度为 17位
接下来我们需要使用脚本去获得密码了:
| 1 |  | 
然后登录得到flag