• ctfshow-web11(session绕过)


    php代码审计:

    1. function replaceSpecialChar($strParam){
    2. $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
    3. return preg_replace($regex,"",$strParam);
    4. }

    首先定义了一个函数,主要是使用preg_replace函数对我们提交的内容进行正则匹配

    该函数的用法:

    preg_replace (正则表达式, 替换成什么内容, 目标字符串)

    这里如果匹配到regex里面的内容就会将其替换为空,以此来替换掉一些SQL关键字和特殊字符,防止SQL注入。

    1. if(strlen($password)!=strlen(replaceSpecialChar($password))){
    2. die("sql inject error");

    strlen() 函数用来返回字符串的长度,如果提交的password和经过正则匹配替换后的字符串长度不相等,就会输出 sql inject error,die函数来终止脚本并显示错误消息。

    我们可以验证一下:输入 password 为 select

    果然报我们预期的错误 

     

    继续看后面的代码:

    1. if($password==$_SESSION['password']){
    2. echo $flag;

     该代码通过比较输入的密码和 $_SESSION['password'] 的值来进行身份验证,这意味着只有当两者完全相等时,才会显示 $flag 的值。

    $_SESSION["Session名称"] 用来读取Session变量信息

    当在代码中设置了session时,在http请求的消息头中会携带一个名为PHPSESSID的cookie,其值是一个32位16进制的字符串。每个客户端向服务器请求时都会产生一个不同的值,如果清除掉浏览器的cookie,再次刷新页面将会重新设置一个PHPSESSID的值。服务端接收到这个cookie,根据其值在服务器中找到对应的session文件,从而实现保持与客户端链接状态的信息,其中session中存储着序列化的session键值等信息。

    可以看到,我使用不同浏览器请求,它的session值都是不一样的 

    试了一下,如果直接将password改为抓到包里的session值是不行的

    由于这里的限制并不严格,我们通过输入空密码,抓包后将session值删除,即可实现绕过

    发包成功后直接回显flag

    ctfshow{3da8ca9d-3db3-4821-aa65-570242968a50}

  • 相关阅读:
    Git要提交到B分支。但是误提交到A分支,然后推送到远程仓库。然后撤回并重新提交到B分支。
    纯 Java 撸个后台管理系统,这框架用起来贼好
    v-if和v-for的优先级是什么?
    Golang中的包和模块设计
    无代码开发卡片视图入门教程
    SpringEvent的介绍以及实例
    datalist 是什么?以及作用是什么?
    数据中心电力供应,请掌握这个技能!
    .NET 6 轻量级 WebApi 框架 FastEndpoints 入门
    凉鞋的 Unity 笔记 202. 变量概述与简介
  • 原文地址:https://blog.csdn.net/Myon5/article/details/133719457