文章目录
php伪协议在ctf比赛中常和文件包含,ssrf相关联,再往深的挖甚至还能和反序列化扯上关系。其实网络安全就是如此,所有的知识不是一潭死水,而是一个环。😐
<1>php伪协议
1.1.对更改php.ini文件中‘allow_url_fopen‘和’allow_url_include’的理解
- ini是(initial’初始化‘)的缩写,ini文件用来对操作系统或特定程序初始化或进行参数设置,也就是说php.ini是PHP的一个配置文件。
- php.ini中有’allow_url_fopen‘和’allow_url_include’。前者的意思是设置是否允许url中的封装协议打开文件,后者的意思是设置是否允许包含url里的封装协议文件。
1.2.PHP伪协议为什么叫php伪协议
php上的协议是一种自定协议不具有广泛性所以叫伪协议
1.3.对php.ini中的部分语句改变的必要性的理解
- php.ini的作用是是指导php解析器对php语句的处理方式
- 将’allow_url_fopen‘改为’allow_url_fopen=on‘;'allow_url_include’改为’allow_url-include=on‘让计算机可以将URL处理。
1.4.file://
- 条件:allow_url_fopen:off/on;allow_url_include:off/on
- 作用:读取本地文件
- 使用格式:file://[文件绝对路径] or [文件相对路劲]
1.5.php://
这一类为协议的作用是访问输入输出流
1.5.1.php://input
- 条件:allow_url_fopen=off/on;allow_url_include=on
- 作用:可用于查看源码,同时是要查看未压缩文件的只读流。在post请求中能查看请求的原始数据,并将post请求中的post数据当作php代码执行。(只读流是说只能进行读操作的数据)
- 用法:直接将想要执行的代码写到post传的参数里并且在file_get_content等函数中使用php://input就可以了
1.5.2.php://filter
- 条件:allow_url_fopen=off/on;allow_url_include=off/on
- 作用:用过滤器读写数据流
- 用法:格式为php://filter/[write] or [read]=[过滤器]/[resource]=[文件路径](某些文章中喜欢把 ‘文件路径‘ 叫做 ’数据流‘,其实这样更准确 )
参数 | 描述 |
read | 用读链的过滤器读数据流 |
write | 用写链的过滤器写数据流 |
resorce | 声明过滤哪一个数据流 |
不指定读写 | 当不指定读写时会自己根据情况而定 |
字符串过滤器 | 作用 |
string.rot13 | rot13变换 |
string.toupper | 将字母变成大写 |
string.tolower | 将字母变成小写 |
string.strip_tags | 去除html、php的标记 |
转换过滤器 | 作用 |
convert.base64-decode | 将数据流base64解码 |
convert.base64-encode | 将数据流base64编码 |
convert.quoted-printable-encode | 将数据流quoted-printable编码 |
convert.quoted-printable-decode | 将数据流quoted-printable解码 |
压缩过滤器 | 作用 |
zlib.deflate | 按照gzip的格式解压数据流 |
zlib.inflate | 按照gzip的格式压缩数据流 |
bzip2.compress | 按照bz2的格式压缩数据流 |
bzip2.decompress | 按照bz2格式解压数据流 |
加密过滤器 | 作用 |
mcrypt | 按对称加密算法加密 |
mdecrypt | 按对称加密算法解密 |
1.5.3.其它php://
- 5.3.1.php://fd
条件:allow_url_fopen=off/on;allow_url_include=off/on
作用:直接按照文件描述符访问文件 - 5.3.2.php://memery
条件:allow_url_fopen=off/on;allow_url_include=on
作用:将临时数据读写到临时文件中 - 5.3.3.php://temp
条件:allow_url_fopen=off/on;allow_url_include=on
作用:也是读写临时文件不过与php://memery不同的是2mb时写临时数据到指定的临时文件中 - 5.3.4.php://output
条件:allow_url_fopen=off/on;allow_url_include=off/on
作用:将数据写入输出缓冲区
1.6.zip://
- 条件:allow_url_fopen=off/on;allow_url_include=off/on
- 作用:直接访问zip文件中的数据流
- 说明:可以访问任意的子文件,且后缀可以是任意的如jpg、png等,都会按照zip解析
- 使用格式:zip://[文件的绝对路径]#[压缩文件中的文件]
例如:zip:///etc/password/forming.zip#forming.php
这句话能直接访问forming.zip文件中的forming.php文件
1.7.zlib://
- 条件:allow_url_fopen=pff/on;allow_url_include=off/on
- 作用:功能类似gzopen(),在php的官方文档中建议用compress.zlib://代替
- 说明:可以访问任意的子文件,且后缀可以是任意的如jpg、png等,都会按照gz解析
- 使用格式:compress.zlib://[文件绝对路径]
1.8.bzip2://
- 条件:allow_url_fopen=off/on;allow_url_include=off/on
- 作用:功能类似bzopen(),在php的官方说明中建议用compress.bzip://代替
- 说明:可以访问任意的子文件,且后缀可以是任意的如jpg、png等都会按照bz解析
- 使用格式:compress.bzip2://[文件绝对路径]
1.9.data://
- 条件:allow_url_fopen=on;allow_url_include=on
- 作用:作为一个封装器对进行数据流读写
- 使用格式:data://text/plain,[code] data://text/plain,base64,[code]
1.10.phar://
- 条件:allow_url_fopen=off/on;allow_url_include=off/on
- 作用:类似zip可以直接访问zip文件中的子文件
- 使用格式:phar://zip文件路径/子文件
<2>其它网络安全相关知识
2.1.弱比较
2.1.1.对强类型与弱类型语言的理解
1.强类型语言是一种强制类型定义的语言,一旦某一个变量被定义类型,如果不经过强制转换,则它永远就是该数据类型了,强类型语言包括Java 、Python、C++等语言。
2.弱类型语言是一种弱类型定义的语言,某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过显性强制转换。弱类型语言包括vb 、PHP、javascript等语言
2.1.2.对“三等号”“双等号”的区别的理解
1.===是恒等,两个数要类型相同且数值相同
2.==是比较运算,不会检查两个数的类型
2.1.3.比较操作
数字和字符串比较,php会把字符串转换成数字再比较。php转换原则是:若字符串以数字开头,则取开头数字作为转换结果,若无则输出0
2.2.md5
2.2.1.md5是什么
有人认为是一种加密的方式,因为md5将原文件改变。但是也有人不认为,因为md5加密出的文件无法复原。
2.2.2.实现的方法(笼统)
一串数据占用的位数与512bit取余,如果余数不是448,则要补位(部位的方式为一位是1剩下的全补成零)。之后再将没有补位前的数据长度用64位表示。装入***标准幻数***。此时数据长度为(n+1)512,之后将每一个512分为16个32子分位,进行四轮运算,最后得出一个128位的散列值。
2.3.为什么0exxx恒为零的原因
0exxx是指数表达形式,其中e前面是指数的实数位,而e后面是指数表达式的指数位,进行科学计数法转换以后,0无论乘多少次方都为零,所以0exxx的结果是0
2.4.URL的标准格式
-
URL的标准格式为protocol://hostname[:port]/path[?query#fragment]
举例:”http://www.baidu.com/movie/movieshow?id=234&number=1314#name“
- protocol是指网络传输协议(如:http、https、file等)。
- hostname是指存放资源的与域名、主机名或IP地址。
- port是指端口,有时用默认端口所以不显示。
- path是指一个主机上的一个目录或者文件地址,它决定了服务器如何处理这个请求。
- query从?到#之间是参数(也叫搜索部分),参数之间用&来间隔。
- fragment用于指定网络资源中的片段,搜索部分搜索出的信息多种多样,通过fragment可以明确指出哪些信息是我们需要 。
2.5.base64
对base64与ASCII码转换的理解。
- base64是用64个打印字符表示二进制数据。
- 64个打印字符对应64个数字,所以只需6个bit就能表示任意一个打印字符,而一个byte的8个bit有两个就要一直表示0。
- 三个传统字节可以用四个base64字符来表示。
- 当只有一个传统字节时,用两个base64字符表示多余的bit用0来填补,同理三个也是一样的情况。
- 详细讲解