Can you anthenticate to this website?
实验原理
php代码审计
实验目的
- get参数请求
- url编码知识
- 服务器解码
- phps文件
实验步骤
尝试目录扫描找到index.phps文件
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
发现并不行,因为编码 %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
成功得到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”,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符。