目 录CONTENT

文章目录

【CTF-web】攻防世界-php2

geekrabbit
2022-03-23 / 0 评论 / 2 点赞 / 1,052 阅读 / 1,599 字 / 正在检测是否收录...
温馨提示:
创作不易,转载请注明出处

image.png

Can you anthenticate to this website?

实验原理

php代码审计

实验目的

  • get参数请求
  • url编码知识
  • 服务器解码
  • phps文件

实验步骤

尝试目录扫描找到index.phps文件
image.png

image.png

php代码审计

<?php
if("admin"===$_GET[id]) {                  //如果get请求字符为输出admin
  echo("<p>not allowed!</p>");             //输出not allowed!
  exit();
}

$_GET[id] = urldecode($_GET[id]);           //get请求经过urldecode解码
if($_GET[id] == "admin")                    //如果参数为admin
{
  echo "<p>Access granted!</p>";           //输出flag
  echo "<p>Key: xxxxxxx </p>";
}
?>

Can you anthenticate to this website?

构造payloadhttp://111.200.241.244:62407/?id=%61%64%6D%69%6E
image.png

发现并不行,因为编码 %61%64%6D%69%6E 经过浏览器后被解码变成了admin

将%61%64%6D%69%6E再进行编码得到%25%36%31%25%36%34%25%36%44%25%36%39%25%36%45

image.png
成功得到flag

实验收获

phps是什么?
phps即为 PHP Source。PHP Source 由 The PHP Group 发布,是最通用的关联应用程序。

phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替。其实,只要不用php等已经在服务器中注册过的MIME类型为文件即可,但为了国际通用,所以才用了phps文件类型。

它的MIME类型为:text/html, application/x-httpd-php-source, application/x-httpd-php3-source。

为什么url要进行编码

针对“name1=value1&name2=value2”我们来说一下客户端到服务端的概念上解析过程:
上述字符串在计算机中用ASCII吗表示为:
6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532。
6E616D6531:name1
3D:=
76616C756531:value1
26:&
6E616D6532:name2
3D:=
76616C756532:value2
服务端在接收到该数据后就可以遍历该字节流,首先一个字节一个字节的吃,当吃到3D这字节后,服务端就知道前面吃得字节表示一个key,再想后吃,如果遇到26,说明从刚才吃的3D到26子节之间的是上一个key的value,以此类推就可以解析出客户端传过来的参数。

现在有这样一个问题,如果我的参数值中就包含=或&这种特殊字符的时候该怎么办。
比如说“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么实际在传输过程中就会变成这样“name1=va&lu=e1”。我们的本意是就只有一个键值对,但是服务端会解析成两个键值对,这样就产生了奇异。

如何解决上述问题带来的歧义呢?解决的办法就是对参数进行URL编码

URL编码只是简单的在特殊字符的各个字节前加上%,例如,我们对上述会产生奇异的字符进行URL编码后结果:“name1=va%26lu%3D”,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符。

2
博主关闭了所有页面的评论