0x00 题目分析
浏览一遍页面,在about页面,获得如下信息
![](http://upload-images.jianshu.io/upload_images/3372127-0a9e6f95c57f7ab1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
访问 .git/ ,页面存在。
![](http://upload-images.jianshu.io/upload_images/3372127-9387c09ac1a48c5a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
使用githack扒下来。得到源码,进行代码审计。
分析得到:
1.flag在flag页面,要看源码才能看到。
2. 参数过滤了 ../ 也就是限定了只能在本目录
3. exists函数 对文件的存在进行判定。
0X01 解题思路
理清思路,要看源码,有哪几种方法。
1.系统命令执行,cat 等函数
2.函数执行,show_source 等
3.将文件打包 ,下载下来。
这里最有可能的就是函数执行了,虽然下面有一个 “require_once” 但是由于上面两个语句的限制,不存在远程包含。
将代码扔进软件自动审计。
![](http://upload-images.jianshu.io/upload_images/3372127-dc555a957cdeed76.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
很显然,关键就在assert函数,网上查找相关资料。
函数介绍参考以下页面:
https://www.douban.com/note/217557007/
对这个函数的理解就是,这个函数会执行括号里面的语句,括号里面的句子的布尔真值不是true时候,就会提示warning。
下面是对这个函数的测试。
![](http://upload-images.jianshu.io/upload_images/3372127-6a603a720d608496.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](http://upload-images.jianshu.io/upload_images/3372127-8bb8afa29da37e15.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
当为true的时候就没有提示。
![](http://upload-images.jianshu.io/upload_images/3372127-a8639f6747fadd38.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
所以,这一题。
注意闭合前后单引号,括号等。可得参数应为
page=1' ) == (show_source('templates/flag.php')) ;//
![](http://upload-images.jianshu.io/upload_images/3372127-e53862ac776f6e47.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
网上找到一种这样的:
page=' and die(highlight_file('templates/flag.php')) or '
这种写法的是利用第二个assert,最后的句子为:
![](http://upload-images.jianshu.io/upload_images/3372127-427f9a430ac8e4eb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
执行了三个语句,里面那个 “or” 也可替换为“and”
![](http://upload-images.jianshu.io/upload_images/3372127-a6baff39310d8d6c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
0x02 小结
神奇的php函数:assert ,这个函数可以用来写马过狗,但一句话过狗太简单了。
有什么问题不先问问神奇的海螺呢?
继续学习~~