1.信息收集:

 你能验证这个网站吗?

怎样验证这个网站呢?网站是由前端,后端,数据库,服务器,域名,其他组件(图像、视频、第三方API、安全认证等)组成;

还有一个信息,这个题目的名称是PHP2

那php和这个网站的关系是什么?

PHP2是服务器端脚本语言,主要用于处理和生成网页的内容,当用户访问一个网站时,PHP脚本会在服务器上执行,生成动态的HTML页面,然后将页面发送给用户的浏览器进行显示。

按照这个思路找到php脚本的路径,保存在什么文件;

总之:可能考察 php语言在网站上运行的脚本文件;

2.按照思路:

常见的 PHP 脚本通常是保存在以 .php 为扩展名的文件上。这些文件可以存储在web 服务器的文档根目录中,以便通过浏览器访问和执行;经典的示例文件名:可能是 index.phpscript.php实际上可以选择任何合法的文件名作为 PHP 脚本的文件名。

1.尝试index.php文件:

能够正常访问,意味着存在这样脚本文件;

2.尝试script.php文件:

意味着根本不存在这样脚本文件;

总之:知道了php脚本文件是:index.php

这个脚本文件是在服务器上运行的,不是在客户端浏览器上,我们得知道这个脚本文件里的代码,也就是说找到脚本源代码,php文件源代码通常在phps文件,尝试一下:

果然在这里,通常不可能访问到一般网站的脚本路径,更不用说是脚本的源代码;

总之:可能考察php脚本在服务器上运行,php脚本文件的经典路径;更重要的是php源码审计;

3.代码审计:

<?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?

 代码核心在:

$_GET[id] = urldecode($_GET[id]);   //通过get请求得到参数id的值,再对其进行url解码
if($_GET[id] == "admin")    //url 解码后的值等于"admin" 成立

知识点:

urldecode是PHP函数,解码经过URL编码的字符串,解码回原始的形式;URL编码中某些字符被替换为%后跟两个十六进制形式这是为了确保 URL 中的特殊字符不会与 URL 结构冲突。例如,空格字符在 URL 中被编码为 %20,而 & 字符被编码为 %26,%字符被编码为%25

操作:

脚本里的urldecode:可以对"admin"部分或者对全部进行编码,对a进行编码:%61;id=%61dmin

又因为编码后参数%61dmin中存在特殊字符%,浏览器会自动进行URL解码,所以我们对%进行编码:%25

最终id==%2561bmin

也就是所对这个php脚本通过get请求给参数id赋值;这个脚本自动运行;

尝试结果:

得到了flag; 

总之:考察PHP代码审计,PHP函数;反向思维解决问题;

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐