php代码审计-全局配置篇
关于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 | <form action='' method='get'> |
当register_globals = Off的时候,程序运行提交输出结果为:
当register_globals = On的时候,程序运行提交输出结果为:
1 | username::alex |
allow_url_fopen与allow_url_include
首先来看allow_url_fopen
这个选项的作用是开启远程打开文件,其作用就是 PHP 是否能够通过 URL (而非本地文件路径) 来打开文件。这个配置选项的值会影响到一些 PHP 中与文件操作相关的函数的行为,例如 fopen() 和 file_get_contents() 。具体来说,当 allow_url_fopen 被设置为 On(开启)时,这些函数可以用来 读取 或 写入 远程文件。而当该配置项被设置为 Off(关闭)时,这些函数 只能用于操作本地文件。
操作远程文件(这个配置在任何的php版本中是默认开启的)
1 |
|
结果如下,很明显这里包含了我的图片了,但是因为解析问题就。。。
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 |
|
allow_url_include
这个与allow_url_fopen类似,但是又有点不一样,这玩意需要手动开启,默认是off
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去学习