2019-05-04

php的序列化和反序列化:serialize()和unserialize()函数的作用是把复杂的数据类型压缩到一个字符串中来传输

例如:我们要传输一个数组

$stooges = array``(``'Moe'``,``'Larry'``,``'Curly'``);

$new = serialize(``$stooges``);

print_r(``$new``);``echo "
"``;

print_r(unserialize(``$new``));

这个数组里有三个元素,这三个元素有不同的数据类型,因此我们可以通过这个序列化函数将数组的键值和大小分别存储起来,这个例子的输出结果便是:结果:a:3:{i:0;s:3:"Moe";i:1;s:5:"Larry";i:2;s:5:"Curly";}

在进行传递这些序列化的数据时会对这些数据进行urlencode进行传输

详细请见:https://www.jb51.net/article/105463.htm

php伪协议的利用

php伪协议的利用常常和我们的文件包含来一起使用接下来先讲解一下php中的文件包含的函数

include

require

include_once

require_once

highlight_file

show_source

readfile

file_get_contents

fopen

file

这些便是常用的文件包含函数,这些函数虽然使用方便但是常常伴随一些漏洞但是这些函数的使用和一些配置文件有关

PHP.ini:

allow_url_fopen :on 默认开启 该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。

allow_url_include:off 默认关闭,该选项为on便是允许 包含URL 对象文件等。

为了能够尽可能的列举所有情况本次测试使用的PHP版本为>=5.2 具体为5.2,5.3,5.5,7.0;PHP版本<=5.2 可以使用%00进行截断。

接下来是一些例子:

http://127.0.0.1/test.php?file=file:///c:/users/Thinking/desktop/flag.txt

include($_GET['file'])

?>

这个便是一个文件包含的例子如果没有对用户提交的数据进行过滤,便可以访问服务器的任意文件了

情况二:需要截断:

在php版本<=5.2中进行测试是可以使用%00截断的。

http://127.0.0.1/test.php?file=file:///c:/users/Thinking/desktop/flag.txt%00

include($_GET['file'].’.php’)

?>

这个表示使用%00截断,这是函数的漏洞,记住即可

php的伪协议有php://input、 php://stdin、 php://memory ,php://filter和 php://temp 等等

file://协议可以访问本地的文件,但是必须是绝对路径

eg:http://127.0.0.1/cmd.php?file=file://D:/soft/phpStudy/WWW/phpcode.txt便会访问服务器的文件

php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。

eg:http://127.0.0.1/cmd.php?file=php://filter/read=convert.base64-encode/resource=./cmd.php

这个返回的base64编码的字符串

php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行

eg:http://127.0.0.1/cmd.php?file=php://input

2019-05-04_第1张图片
02 6.png
image.gif

这个函数的工作原理便是将post方式提交的数据读取出来,并当作命令来执行,因此便会返回这个页面

还有很多其他的方法参考:https://www.freebuf.com/column/148886.html这个

以上内容都是参考他人的博客

你可能感兴趣的:(2019-05-04)