关于php运行服务的方式

除了依赖中间件的方式除外还有php -S 127.0.0.1:9000这种方式

这点与python高度类似、

关于php函数中的那些危险全局变量

magic_quotes_gpc

这个函数多用于数据库等接口等铭感程序,magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,对POST、𝑃𝑂𝑆𝑇

__GET以及进行数据库操作的sql进行转义处理,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。防止sql注入(在5.3被废弃,在5.4后移除)

关于其相关配置

当PHP magic_quotes_gpc=on

如果此时你对输入的数据作了addslashes()处理,

那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。

如果仅为magic_quotes_gpc=on,无再对写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理,则sql语句顺利执行,数据成功写入数据库,数据库保存格式和输出数据格式都和输入一样,不带反斜杠

当PHP magic_quotes_gpc=off

必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。数据库保存格式和输出数据格式都和输入一样,不带反斜杠

参考链接

register_globals

register_globals是php.ini里的一个配置,这个配置影响到php如何接收传递过来的参数.(在4.2后默认false)

验证代码如下

1
2
3
4
5
6
7
8
9
10
11
<form action='' method='get'>
<input type='text' name='username' value='alex' >
<input type='submit' name='sub' value='sub'>
</form>
<?php
echo 'username::',$username;
echo '<br>sub::',$sub;
echo '<br>GET::';
print_r($_GET);

?>

当register_globals = Off的时候,程序运行提交输出结果为:

当register_globals = On的时候,程序运行提交输出结果为:

1
2
3
4
5
username::alex  

sub::sub

array ( [username] => alex [sub] => sub )

allow_url_fopen与allow_url_include

首先来看allow_url_fopen

这个选项的作用是开启远程打开文件,其作用就是 PHP 是否能够通过 URL (而非本地文件路径) 来打开文件。这个配置选项的值会影响到一些 PHP 中与文件操作相关的函数的行为,例如 fopen() 和 file_get_contents() 。具体来说,当 allow_url_fopen 被设置为 On(开启)时,这些函数可以用来 读取 或 写入 远程文件。而当该配置项被设置为 Off(关闭)时,这些函数 只能用于操作本地文件。

操作远程文件(这个配置在任何的php版本中是默认开启的)
1
2
3
4
5
6
7
<?php


# 通过 file_get_contents() 函数获取
# 百度页面的 HTML 内容。
$content = file_get_contents('http://www.kaedeh0.top/1111.jpg');
var_dump($content);

结果如下,很明显这里包含了我的图片了,但是因为解析问题就。。。

file 协议

在 PHP 中,<font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">file</font> 协议的使用不受 <font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">allow_url_fopen</font> 配置项的控制。对此,请参考如下示例:

1
2
3
4
5
6
7
8
9
10
<?php


# 通过 allow_url_fopen 函数获取
# allow_url_fopen 配置项的值。
var_dump(ini_get('allow_url_fopen'));

# 尝试使用 file_get_contents 获取当前主机路径
# C:\Users\Public\Documents\index.php 中的内容
var_dump(file_get_contents('file:///D:\phpstudy_pro\WWW\test\index.php'));

allow_url_include

这个与allow_url_fopen类似,但是又有点不一样,这玩意需要手动开启,默认是off

1
2
<?php
include('http://www.kaedeh0.top/1');

很明显,这个远程文件被包含了

这俩的区别

在开启 <font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">allow_url_fopen</font> 配置项后,PHP <font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">仅能够对远程文件进行读写等文件操作</font>
在开启 <font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">allow_url_include</font> 配置项后,PHP 将能够通过 <font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">include</font> 等函数 <font style="color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">将远程文件包含至当前文件并将其作为 PHP 代码进行执行</font>

short_open_tag(后续版本都支持这样写,然后就废除了 )

这个全局变量我感觉问题不大,其实就是一个代码的简化罢了

在PHP中,短标签(short_open_tag)是一种简化的PHP代码书写方式,允许使用 代替标准的 标签。这种标签在某些情况下可以提高代码的简洁性和可读性,但默认情况下在某些PHP版本中是关闭的。

开启后

echo "Hello, World!"; ?>可以写成echo "Hello, World!"; ?>

safe_mode(5.4后废除)

php的安全模式提供一个基本安全的共享环境,在一个有多个用户帐户存在的php开放的web服务器上。 当一个web服务器上运行的php打开了安全模式,那么一些函数将被完全的禁止,并且会限制一些可用的功能。 在安全模式下,一些尝试访问文件系统的函数功能将被限制。 运行web服务器用户id,如果想要操作某个文件,则必须拥有该文件读取或者写入的访问权 限,实现这个限制功能对于php来说是没有问题的。

open_basedir

这个玩意非常有用,可以限制你可以访问的文件目录,拿了shell也没用

disable_function/disable_classes

这俩也好用,可以限制用户不能去运行那些函数与类,即使你网站被拿shell了也可以进一步的防止攻击者加载一些危险函数

对于在php代码审计中存在的函数看不懂的情况可以去看php手册

https://www.php.net/manual/zh/index.php

对于相关php危险函数与cve漏洞

可以去github和xz.Aliyun.com去学习