HTTP协议

1.概念与简介

HTTP协议是Hyper TextTransfer Protocol(超文本传输协议)的缩写,主要用于网页的传输,现在也常应用网络
API的开发(Restful API)。

浏览器通过HTTP协议和服务器交流。
浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。

HTTP默认端口号为80,但是你也可以改为8080或者其他端口。

HTTP是无连接的:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应
答后,即断开连接。采用这种方式可以节省传输时间。

HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以
通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。

HTTP是无状态的:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果
后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不
需要先前信息时它的应答就较快。

2.开发者工具的使用

NetWork板块 记录了浏览器与服务器的所有通信

3.http的消息结构 请求与响应

请求
地址和关键词: 例如 GET https://www.baidu.com
请求头(header):用来描述请求和发送者的一些信息
请求参数:以百度为例,要搜索的关键词

响应
响应代码:200表示成功,404表示不存在等
响应头 (header):描述响应内容的一些信息
响应内容:HTML,JSON,图片等

请求 响应均可以在F12-NetWork找到.

一个很好用看请求的网站httpbin.org/get
通过这个网站可以更简单的查看请求的详细信息。
可以通过Python代码模拟各种请求参数和header,发送给这个网站,再来验证发送的是否正确

4.完整的网页请求过程

一个网页,通常是分多次请求的,一般的过程为:
先请求网页文本,也就是HTML
根据HTML中的指定的地址,请求其他内容,最常见的是:样式表,JavaScript,图片等
所以在chrome中可以看到很多个请求.

注意:我们用代码发送请求,一行代码只能发送一次请求,也就是获得了最基本的HTML。
有的网站在第一次的HTML中没有包含真实的数据,真实的数据是通过后续请求获得的,所以有时候你用代码
去请求发现获得的网页没有内容。

解决这个问题办法通常有两个:
分析各个请求,找到关键的后续请求,用代码发送后续关键请求获取数据。通常,我们没必要像浏览器一样发
送所有后续靖求,找到关键请求就够了。
使用selenium等浏览器驱动,模拟真实的浏览器操作,发送后续所有请求。

5.请求的具体过程

5.1请求行

下面例子的第一行就是请求行(后面几行支持请求行),它包含几个关键信息:
请求方法:例子中是GET,表示你要干什么
请求的资源地址:例子中是/hello.txt,结合下面的Host(ww.example.com)就可以拼接处完整的地址
使用的HTTP协议的版本号
HTTP协议有多个版本,现在主要用1.1,HTTP2也有一些应用
例:
GET /hello.txt HTTP/1.1
User-Agent:cur1/7.16.3 1ibcur1/7.16.3 0penSsL/0.9.71 zlib/1.2.3
Host:www.example.com
Accept-Language: en, mi

5.2请求方法

根据HTTP标准,HTTP请求可以使用多种请求方法,这些方法表示这个请求要做什么。

最常用的请求方法是:
GET请求表示不要获取内容,它不会修改服务器上的数据
POST请求表示要提交内容,通常会修改服务器上的内容

GET请求的参数
GET请求的参数都是放在URL中的,只有GET请求才在网址上可见.
请求参数是以键值对的形式出现,一般形式为:
网址的后面紧跟着是一个问号
问号的后面是一对对参数,形式为:参数1=参数1的值
多个参数之间用&符号隔开
举例:https://www.example.com/page1?参数1=参数1的值&参数2=参数2的值

POST请求的参数
POST请求的参数放在请求体中
网页上看不见
但可以通过chrome开发者工具或者抓包工具看见
格式举例:
GET /hello.txt HTTP/1.1
User-Agent:cur1/7.16.3 1ibcur1/7.16.3 0penssL/0.9.71 zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
[name’:麦叔’,‘特征’:‘帅’,‘争标’:一个美丽的城市’}

5.3请求头

服务器通常通过请求头来:判定请求是否合法,这是基本的反爬措施。
爬虫通常需要添加多个请求头来模拟真实的网页请求判断用户是否登陆了,
一般通过Cookie这个特殊的请求头的内容来判定,只要我们给出合理的Cookie,
服务器就认为我们是登录过了

请求头最重要的几个是:
User-Agent 代表发起访问是什么浏览器。如果不写,基本会被判定为爬虫,直接被拒了
Cookie 里面记录了登录信息,或者上次请求服务端设置的信息,也是常用的反爬判定点
Referer 表示这次请求是从哪里点过来的,有的网站不允许你直接访问某个网页,必须是从它的其他网页点过
来才行、这时候就要设置一个Referer值,模拟是从别的网页点过来的情况

6.响应的具体过程

6.1状态码

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所
在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
HTTP状态码的英文为HTTP Status Code。

下面是常见的HTTP状态码:
200-请求成功
301-资源(网页等)被永久转移到其它URL
404-请求的资源(网页等)不存在
500-内部服务器错误

HTTP状态码由三个数字组成,第一个数字定义了状态码的类型,后两个数字表示具体的状态。HTTP状态码共分为
5种类型:
分类
分类描述
1**
信息,服务器收到请求,需要请求者继续执行操作
2**
成功,操作被成功接收并处理
3**
重定向,需要进一步的操作以完成请求
4**
客户端错误,请求包含语法错误或无法完成请求
5**
服务器错误,服务器在处理请求的过程中发生了错误

6.2响应头

同请求头 需要则查表.

7.黑神话CTF WP

点击”开始挑战”后,依次按图片修改网页的参数即可.
这是图片
这是图片
这是图片
这是图片
这是图片
这是图片

PHP基础语法

环境的配置 (由于有C++基础,从序号一开始只叙述PHP与C++相比需要注意之处:)

这是图片
这是图片

1.PHP基础格式

2.变量定义

$<变量名>= (无需输入数据类型)

PHP的主要执行对象更多是字符串 不是字符

3.运算符

x xor y 代表异或
如果 x 和 y 有且仅有一个为 true,则返回 true

类型比较
松散比较:使用两个等号 == 比较,只比较值,不比较类型。
严格比较:用三个等号 === 比较,除了比较值,也比较类型。

4.输出

echo 可以输出一个或多个字符串
print 只允许输出一个字符串,返回值总为 1
print_r():专门用于打印变量的详细信息,尤其适合数组和对象,会以可读性强的格式展示其内部结构,且执行时返回true

5.数组

$cars=array(“Hello”,”CTF”);
echo “I like “ . $cars[0] . “ “ . $cars[1] . “.”;(体现了echo输出多个字符串.)

除了用array,还可以使用 [] 定义数组

$z = [‘H’,’e’,’l’, ‘l’, ‘o’];
$z[0] = ‘H’;
$z[1] = ‘r’;
$z[2] = ‘l’;
$z[3] = ‘l’;
$z[4] = ‘o’;

6.魔术常量

形如 FILE 这样的 XXX 预定义常量,被称为魔术常量。
FILE //返回文件的完整路径和文件名

highlight_file(FILE); //代码高亮的显示当前文件内容

7.表单数据 $_<名称>[‘变量名’]

$_GET —— 接受 GET 请求传递的参数。

示例:example.com/index.php?book=HELLOCTF,你可以使用 $_GET[‘book’] 来获取相应的值。

$_POST —— 接受 POST 请求传递的参数。

示例:对 example.com/index.php 进行 POST 传参,参数名为 book 内容为 HelloCTF,你可以使用 $_POST[‘book’] 来获取相应的值。

$_REQUEST —— 接受 GET 和 POST 以及 Cookie 请求传递的参数。

示例:

如果你通过 URL 传递了一个参数 example.com/index.php?key=value_from_get,你可以通过 $_REQUEST['key'] 获取这个值。
如果你通过 POST 方法提交了一个表单,其中有一个名为 key 的字段且其值为 value_from_post,你也可以通过 $_REQUEST['key'] 获取这个值。
同时,如果你设置了一个名为 key 的 cookie,其值为 value_from_cookie,你还是可以使用 $_REQUEST['key'] 来获取这个值。

8.内建函数

文件操作函数:

include(): 导入并执行(着重,是并执行!)指定的 PHP 文件。例如:include('config.php'); 会导入并执行 config.php 文件中的代码。

require(): 类似于 include(),但如果文件不存在,则会产生致命错误。

include_once(), require_once(): 与 include 和 require 类似,但只导入文件一次。

fopen(): 打开一个文件或 URL(而不执行)。例如:$file = fopen("test.txt", "r"); 会以只读模式打开 test.txt。

file_get_contents(): 读取文件的全部内容到一个字符串。例如:$content = file_get_contents("test.txt");

file_put_contents(): 将一个字符串写入文件。例如:file_put_contents("test.txt", "Hello World!");

代码执行函数:

eval(): 执行字符串中的 PHP 代码。例如:eval('$x = 5;'); 会设置变量 $x 的值为 5。

assert(): 用于调试,检查一个条件是否为 true。

system(), shell_exec(), exec(), passthru(): 执行外部程序或系统命令。例如:system("ls"); 会执行 ls 命令并显示输出。

反序列化函数:

unserialize(): 将一个已序列化的字符串转换回 PHP 的值。例如:$array = unserialize($serializedStr); 可以将一个序列化的数组字符串转换为数组。

数据库操作函数:

mysql_query(), mysqli_query(): 发送一个 MySQL 查询。例如:$result = mysql_query("SELECT * FROM users");

其他函数:

preg_replace(): 执行正则表达式搜索和替换。例如:$newStr = preg_replace("/apple/i", "orange", $str); 会将 $str 中的 "apple" 替换为 "orange"。

create_function(): 创建匿名的 lambda 函数。例如:$func = create_function('$x', 'return $x + 1;');

preg_match('/PHP/', $str)字符串匹配

cat 路径 阅读文件

PHP命令执行

一 命令执行函数介绍(怎么运行,运行条件,参数(重点),能否回显(重点))

(相似函数:1,3;2,4,5;6,7)
1.system函数(执行命令并体现返回值)
system(string $command,int &$return_var =?(该参数可选))
command:执行command参数所指定的命令,并且输出执行结果(的所有行).
如果提供return_var参数,则外部命令执行后的返回状态(1/0等)将会被设置到此变量中。

2.exec函数(执行指令并体现执行的输出和返回值(不直接打印))
exec(string $command,array &$output =?(可选),int &$return var=?(可选))
command参数:要执行的命令。注意:单独使用时只有最后一行结果返回并且打印,其他的行不会回显
output 参数:用命令执行的输出填充此数组,每行输出填充数组中的一个元素。即逐行填充数组。
return_var参数:同上 表示返回值.
后两个参数可以借用print_r输出结果.
exec(ls);
print_r(output);
即可显示ls的输出结果

3.passthru函数(执行命令并输出二进制数据.在安全渗透测试中与system无差别.)
passthru(string $command, int &$return_var =?)
command参数:执行的命令,并且输出执行结果(的所有行)。
输出二进制数据,并且需要直接传送到浏览器。

4.shell_exec函数(执行命令,返回命令的输出(为值但不直接打印))
shell_exec(string cmd)
cmd参数:要执行的命令。
环境执行命令,并且将完整的输出以字符串的方式返回。
借用echo、print等输出结果
echo shell_exec(cmd)

5.``函数
与shell_exec功能相同,这里不赘述.

6.popen函数(执行命令,返回值特殊)
popen(string $command, string $mode)
command参数:要执行的命令。
mode参数:模式。r表示阅读,w表示写入。
popen函数返回值是一个写入的文档,遵循fgets获取内容→print_r输出内容
a = popen(“ls”,’r’);
$s=fgets($a);
print_r($s);
才可以把内容输出

7.proc_open函数(执行命令,返回值特殊)
proc_open($command,$descriptor_spec,$pipes,
$cwd,$env_vars,$options)
一般只修改command参数
不直接回显

8.pcntl_ехес(使用前需安装模块)
pcntl_exec(string $path, array $args =?,array
$envs =?)
path必须时可执行二进制文件路径或一个在文
件第一行指定了一个可执行文件路径标头的
脚本(比如文件第一行是#!/usr/local/bin/perl
的perl脚本)。
args是一个要传递给程序的参数的字符串数组。
envs是一个要传递给程序作为环境变量的字符
串数组。这个数组是key=>value格式的,key
代表要传递的环境变量的名称,value代表该
环境变量值。
在当前进程空间执行指定程序。

二 RCE Level0-8 WP

0 进入界面即得flag
这是图片
1 post修改如图变量
这是图片
2 先用get改action为’r’,获得随机的函数,再改成submit并用该函数的正确语法填充content,提交即得
flag
这是图片
3 post修改如图变量
这是图片
4 输ip加分号使得两个命令先后运行,获得flag
这是图片
5 get修改如图变量
这是图片
6 用八进制避开字符检测键入命令,先找到flag的路径,再获得flag
这是图片
这是图片
7 空格符如图代替 其余同第六题 抓住检测的字符是什么以尝试替换
这是图片
8 get修改a变量 后加分号屏蔽代码中的屏蔽
这是图片