CTF入门 WECALL 2

什么是PHP文件?

PHP文件可以包含文本,HTML,CSS,JavaScript和PHP代码
PHP代码在服务器上执行,结果以纯HTML格式返回到浏览器
PHP文件的扩展名为“ .php”

PHP可以做什么?

PHP可以生成动态页面内容
PHP可以在服务器上创建,打开,读取,写入,删除和关闭文件
PHP可以收集表单数据
PHP可以发送和接收Cookie
PHP可以添加,删除,修改数据库中的数据
PHP可用于控制用户访问
PHP可以加密数据
使用PHP,您不仅可以输出HTML。您可以输出图像,PDF文件甚至Flash电影。您还可以输出任何文本,例如XHTML和XML。

PHP脚本可以放在文档中的任何位置。
PHP脚本的开头<?php和结尾是 ?>

PHP文件的默认文件扩展名是“ .php”。
一个PHP文件通常包含HTML标记和一些PHP脚本代码。

PHP语句以分号(;)结尾。

在PHP中,关键字(例如if, else,while, echo等),类,函数,和用户定义的函数是不区分大小写。

所有变量名称均区分大小写

comment
//
#
/* */

在PHP中,变量以$符号开头,后跟变量名称

与其他编程语言不同,PHP没有用于声明变量的命令。它是在您首次为其分配值时创建的。

在函数外部声明的变量具有全局范围,并且只能在函数外部访问
在函数内声明的变量具有局部范围,只能在该函数内访问
global关键字用于在函数内部访问一个全局变量。

为此,请global在变量之前(在函数内部)使用关键字

PHP also stores all global variables in an array called $GLOBALS[index]. The index holds the name of the variable. This array is also accessible from within functions and can be used to update global variables directly.

通常,当一个函数完成/执行时,它的所有变量都会被删除。但是,有时我们希望不删除局部变量。我们需要它来做进一步的工作。
为此,请static在首次声明变量时使用关键字
然后,每次调用该函数时,该变量仍将具有自上次调用该函数以来所包含的信息。
注意:该变量仍然是函数的局部变量。

差异很小:echo没有返回值,而print返回值为1,因此可以在表达式中使用。echo可以采用多个参数(尽管这种用法很少见),而print可以采用一个参数。echo比快一点print。

PHP is Fun!"; echo "Hello world!
"; echo "I'm about to learn PHP!
"; echo "This ", "string ", "was ", "made ", "with multiple parameters."; ?>
字符串可以是引号内的任何文本。可以使用单引号或双引号

整数数据类型是-2,147,483,648和2,147,483,647之间的非十进制数。
PHP var_dump()函数返回数据类型和值

首先,我们必须声明一个对象类。为此,我们使用class关键字。类是可以包含属性和方法的结构:
model = "VW"; } } // create an object $herbie = new Car(); // show object properties echo $herbie->model; ?>

如果创建的变量没有值,则会自动为其分配值NULL。
也可以通过将值设置为NULL来清空变量:

关于PHP的注意事项之一是它提供了自动数据类型转换。
因此,如果将整数值分配给变量,则该变量的类型将自动为整数。然后,如果将字符串分配给相同的变量,则类型将更改为字符串。

整数可以以三种格式指定:十进制(基于10的),十六进制(基于16的-带有0x前缀)或八进制(基于8的-带有0前缀)

(int),(integer)或intval()函数通常用于将值转换为整数。

有效的常量名称以字母或下划线开头(常量名称前没有$符号)。

注意:与变量不同,常量在整个脚本中自动为全局变量。
define(name, value, case-insensitive)
在PHP7中,您可以使用define()函数创建一个Array常量。

. Concatenation $txt1 . $txt2 Concatenation of $txt1 and $txt2
.= Concatenation assignment $txt1 .= $txt2 Appends $txt2 to $txt1

该foreach循环仅适用于数组,用于循环遍历数组中的每个键/值对。

句法
foreach ($array as $value) {
code to be executed;
}
对于每次循环迭代,当前数组元素的值都分配给$ value,并且数组指针移动一个,直到到达最后一个数组元素。

要指定,strict我们需要设置declare(strict_types=1);。这必须在PHP文件的第一行。
这为我们提供了一个在声明函数时指定所需数据类型的选项,并且通过添加strict 声明,如果数据类型不匹配,它将抛出“致命错误”。

关联数组是使用分配给它们的命名键的数组。
有两种创建关联数组的方法:
$age = array(“Peter”=>”35”, “Ben”=>”37”, “Joe”=>”43”);
要么:
$age[‘Peter’] = “35”;
$age[‘Ben’] = “37”;
$age[‘Joe’] = “43”;
然后可以在脚本中使用命名的键:

$cars = array (
array(“Volvo”,22,18),
array(“BMW”,15,13),
array(“Saab”,5,2),
array(“Land Rover”,17,15)
);
"; echo $cars[1][0].": In stock: ".$cars[1][1].", sold: ".$cars[1][2].".
"; echo $cars[2][0].": In stock: ".$cars[2][1].", sold: ".$cars[2][2].".
"; echo $cars[3][0].": In stock: ".$cars[3][1].", sold: ".$cars[3][2].".
"; ?>

sort() -以升序排列数组
rsort() -以降序排列数组
asort() -根据值以升序对关联数组进行排序
ksort() -根据键以升序对关联数组进行排序
arsort() -根据值以降序对关联数组进行排序
krsort() -根据键以降序对关联数组进行排序

用于在使用method =“ post”提交HTML表单后收集表单数据。$ _POST也广泛用于传递变量。

$_SERVER[‘PHP_SELF’] Returns the filename of the currently executing script
$_SERVER[‘REQUEST_METHOD’] Returns the request method used to access the page (such as POST)

PHP $ _GET是一个PHP超级全局变量,用于在使用method =“ get”提交HTML表单后收集表单数据。

$ _GET还可以收集在URL中发送的数据。

使用GET方法从表单发送的信息对所有人都是可见的(所有变量名和值都显示在URL中)。GET对发送的信息量也有限制。限制约为2000个字符。但是,由于变量显示在URL中,因此可以为页面添加书签。在某些情况下这可能很有用。

GET可以用于发送非敏感数据。
注意:绝对不要将GET用于发送密码或其他敏感信息!

使用POST方法从表单发送的信息对于其他人是不可见的 (所有名称/值都嵌入在HTTP请求的正文中),并且对要发送的信息量没有限制。

此外,POST支持高级功能,例如在将文件上传到服务器时支持多部分二进制输入。
但是,由于变量未显示在URL中,因此无法为页面添加书签。

$ _ SERVER [“ PHP_SELF”]将提交的表单数据发送到页面本身,而不是跳转到另一个页面。这样,用户将在与表单相同的页面上收到错误消息。

htmlspecialchars()函数将特殊字符转换为HTML实体。这意味着它将用&lt;替换<和>之类的HTML字符。和&gt;。这样可以防止攻击者通过以表格形式注入HTML或Javascript代码(跨站点脚本攻击)来利用代码。

从用户输入数据中删除不必要的字符(多余的空格,制表符,换行符)(使用PHP trim()函数)
从用户输入数据中删除反斜杠(\)(使用PHP stripslashes()函数)

使用PHP empty() 函数

1
2
3
4
5
6
7
8
9
10
11
12
13
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Name: <input type="text" name="name">
<span class="error">* <?php echo $nameErr;?></span>
<br><br>
E-mail:
<input type="text" name="email">
<span class="error">* <?php echo $emailErr;?></span>
<br><br>
Website:
<input type="text" name="website">
<span class="error"><?php echo $websiteErr;?></span>
<br><br>
Comment: <textarea name="comment" rows="5" cols="40">

preg_match()函数在字符串中搜索模式,如果存在模式,则返回true,否则返回false。
正则表达式

include和require语句相同,但失败时除外:
require 将产生致命错误(E_COMPILE_ERROR)并停止脚本

include 只会产生警告(E_WARNING)并且脚本将继续

该readfile()函数读取文件并将其写入输出缓冲区。

该fclose()功能用于关闭打开的文件。
结束所有文件后,关闭所有文件是一种良好的编程习惯。您不希望在服务器上到处运行打开的文件占用资源!

该feof()功能检查是否已达到“文件结尾”(EOF)。

该fopen()函数还用于创建文件。可能有些混乱,但是在PHP中,使用与打开文件相同的功能创建文件。

$filename = ‘pages/‘.(isset($_GET[“file”])$_GET[“file”]:”welcome”).’.html’;

? :

isset()函数检查是否设置了变量,这意味着必须声明该变量并且该变量不能为NULL。

die()函数是exit()函数的别名。

eval()函数将字符串评估为PHP代码。
dirname()函数返回父目录的路径。
in_array()函数在数组中搜索特定值。

注意:如果搜索参数是字符串,并且类型参数设置为TRUE,则搜索区分大小写。

WECHALL LFI

?file=page/jhkd.html
?file=../../solution.php%00
%00 后的字符不算,已经更改
../ 遍历目录

switch ($which)
{
case 0:
case 1:
case 2:
require_once $which.’.php’;
break;
default:
echo GWF_HTML::error(‘PHP-0817’, ‘Hacker NoNoNo!’, false);
break;
}
which=0,1,2 都执行require_once