http://t.cn/RDNm7Mb
Web
Makeit
打开页面发现在URL里有page包含参数,应该是a文件包含,后面再验证下,然后看到下面,说开发时用到了 git , PHP ,bootstrap ,这个git字眼,要引起重视,可能存在git源码泄露。
那就先试试,
在原路径下加上 .git/
,果然读出来了,那我们用githack 把源码下下来看看
下载地址:https://github.com/lijiejie/GitHack
然后cd 进入githack-master的目录
python GitHack.py http://xxxxxx/.git/
就把源码下到了 githack 下的以站点命名的文件夹
点开发现有个flag.php,因为是git的模板所以这里应该并没有放flag的值,到这里就可以想到文件包含读取flag.php的内容。
然后我们读源码,index.php
这里有个strpos()函数,查找字符串在另一字符串里第一次出现的位置
assert()函数中的为字符串所以把字符串当做PHP 代码来执行,表达式是否成立返回TRUE or FALSE
*经常看到这样的语句:
f
i
l
e
=
f
o
p
e
n
(
file = fopen(
file=fopen(filename, ‘r’) or die("抱歉,无法打开:
f
i
l
e
n
a
m
e
"
)
;
o
r
在
这
里
是
这
样
理
解
的
,
因
为
在
P
H
P
中
并
不
区
分
数
据
类
型
,
所
以
filename"); or在这里是这样理解的,因为在PHP中并不区分数据类型,所以
filename");or在这里是这样理解的,因为在PHP中并不区分数据类型,所以file既可以是int也可以bool,所以这样的语句不会报错。但其处理过程可能有些朋友不大明白。
其实在大多数的语言中, bool or bool这样的语句中,如果前一个值为真后一个值就不会再判断了。这里也是的,所以如果fopen函数执行正确的话,会返回一个大于0的int值(这其实就是“真”),后面的语句就不会执行了。如果fopen函数执行失败,就会返回false,那么就会判断后面的表达式是否为真了。
结果执行了die()之后,不管返回什么,程序都已经停止执行了,并且显示指定的出错信息,也就达到了调试的目的。
就这样。 *
所以当前面的get传进的page参数中如果含有 ” … “,那么前面的strpos()函数就返回一个出现的位置,等式就不成立,那么执行or 后面的语句 die()。
因此看到这里有assert()可以代码执行,
因此构造一个payload, sa' , 'a') === false") or system("cat templates/flag.php");//
看起来这个payload perfect ,首先把strpos()的单引号闭合,然后呢就判断FALSE,执行后面的系统命令,把templates下的flag.php打印出来,后面的都给注释了
但是呢,输入发现payload不起作用。求大佬讲解后,明白了这个原理:
从代码层来看, 插入的数据// 本来是一个字符串,就是不具备注释作用的,但是assert函数对这个字符串做了代码执行 //才有了注释作用 所以这两个的执行是有先后顺序的 只有 assert闭合合法//才能发挥作用,所以输入的 " ,并不能闭合,也只是当做字符串所以就是并没有闭合,
所以就这条语句不能执行后面的系统命令,没办法闭合assert(),无法对===FALSE判断,
构造一个新的payload sa' , 'a') or system(" cat templates/flag.php ");//
补全之后就是,assert(“strpos('sa' , 'a') or system("cat templates/flag.php");//','..') === false") or die(".......)
这里就是strpos函数返回一个非FALSE的值,自然后面的system函数就不会执行,所以想在这个assert函数执行后面我们自己的命令就可以换一个逻辑用 and 或者在strpos里换一个字符串使得返回的是FALSE,因此这个payload有多种,
还要考虑此题有两个assert断言函数,因此在下面那个file_exists()里也可以执行我们想的命令。
总结:
1.此题为git泄露加源码审计加代码执行,所以要对能执行特定代码或系统命令的函数在审计时应该特别关注,弄清楚参数传递时的具体流程,当触发点有多个时搞清楚是哪个触发点我们需要利用,还是需要联合利用触发。
2.对参数中的特殊符号需弄清楚是否有特殊含义,还是只是字符串,比如// 注释符,“ 引号等是否有闭合的功能
MISC
XMAN通行证
放题后惊喜发现,这应该是道签到题。
拿到通行证才开始王者之路,相当于签了到就开了征途。好吧,暂且相信。下载后就是一个TXT文本,明显里面是一个base64编码的字符串,
直接解码
好了,到这里啦,就开始后面的疯狂实验。
首先这个不符合flag的常规格式,一般的大括号都应该在最后出现,这让我们想起了栅栏密码,不妨一试,这一试就一上午过去了。
最后得到这么几个还过得去的
然而,并没有发现有哦什么,然后真的是无助了。
这里发现了一个新大陆,国内和国外的栅栏竟然不一样,
http://www.practicalcryptography.com/ciphers/classical-era/rail-fence/
http://ctf.ssleye.com
这个解密工具也是根据国外的栅栏算法进行的
在线解的栅栏网站,国外的栅栏式“ V ”型进行解密,而国内一般是矩形的排列
7个作为一栏,然后在底部的是两栏共用,最后按照行从左至右的顺序进行加密
所以加密后的结果就是 kzna{blnl_abj_lbh_trg_vg}
变换成了类似 flag{} 的形式,然后想着凯撒解密
get。
PS:
此题的知识盲区就是对栅栏密码的了解只在矩形形式上,国外哪种V型不了解,而且是用其进行加密,以后遇到类似的可以试着不一定是解密,也可能是加密。
FILE
下载下来后是一个img镜像文件,听大佬说一般此类题是文件恢复,首先在Ubuntu里用file命令查看下文件类型
具体的参数参考:http://man.linuxde.net/file
发现只有一个ext4的数据包
这就得恢复看看,这里提到一个工具extundelete 一个恢复工具 https://www.cnblogs.com/yuhuLin/p/7027253.html
extundelete -- restore-all task_file.img
执行这个命令恢复然后会生成一个RECOVERED_FILES文件夹里面存放着恢复的文件
cd进去,查看文件 ls -al
查看当前所有的文件和文件夹包括隐藏的
发现有个jpg文件 ,查看
get。
总结:主要是一个文件恢复的操作,这个恢复工具Windows上需要装diskgenius,比较麻烦,建议在Linux里装直接apt-get install了就好了