ctfshow-web11(session绕过)

php代码审计:

复制代码
function replaceSpecialChar($strParam){
             $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
             return preg_replace($regex,"",$strParam);
        }

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

该函数的用法:

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

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

复制代码
if(strlen($password)!=strlen(replaceSpecialChar($password))){
            die("sql inject error");

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

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

果然报我们预期的错误

继续看后面的代码:

复制代码
if($password==$_SESSION['password']){
            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}

相关推荐
Amo Xiang8 分钟前
《100天精通Python——基础篇 2025 第18天:正则表达式入门实战,解锁字符串处理的魔法力量》
python·正则表达式·re
FreeBuf_7 小时前
GNU Screen 曝多漏洞:本地提权与终端劫持风险浮现
安全·web安全·gnu
Lucky小小吴7 小时前
木马查杀篇—Opcode提取
php·opcode·木马查杀
邪恶的贝利亚10 小时前
《ffplay 读线程与解码线程分析:从初始化到 seek 操作,对比视频与音频解码的差异》
ffmpeg·php·音视频
廖圣平11 小时前
美团核销 第三方接口供应商 (含接口文档)
开发语言·数据库·php
sunsineq12 小时前
[超级简单]讲解如何用PHP实现LINE Pay API!
开发语言·php·linepay
新老农12 小时前
php数据导出pdf,然后pdf转图片,再推送钉钉群
pdf·php·钉钉
上海合宙LuatOS12 小时前
全栈工程师实战手册:LuatOS日志系统开发指南!
java·开发语言·单片机·嵌入式硬件·物联网·php·硬件工程
it技术分享just_free12 小时前
软考教材重点内容 信息安全工程师 第24章 工控安全需求分析与安全保护工程
web安全·网络安全·信息安全·系统安全·软考
mooyuan天天13 小时前
upload-labs通关笔记-第2关 文件上传之MIME绕过
web安全·文件上传·文件上传漏洞·mime·upload-labs靶场