代码审计读书笔记一

PHP核心配置详解

register_globals(全局变量注册开关)

该选项为on的情况下,直接回把用户GET,POST等方式提交上来的参数注册成全局变量并初始化为参数对应的值,使提交的参数可以直接在脚本中使用。

配置范围为PHP_IN_ALL

PHP版本必须小于5.4.0

allow_url_include(是否允许包含远程文件)

当存在include($var)且var可控的情况下,可直接控制$var执行php代码

在PHP5.2.0后默认设置为off,配置范围为PHP_IN_ALL

与之类似的配置有allow_url_fopen,配置是否允许打开远程文件。

magic_quotes_gpc(魔术引号自动过滤)

当该选项为on时,会自动在get,post,cookie变量中的单引号,双引号,反斜杠以及空字符前面加上反斜杠,

但在php5中magic_quotes_gpc并不会过滤$_SERVER变量,PHP5.4被取消

php小于4.2.3,配置范围是PHP_IN_ALL,之后是PHP_IN_PERDIR

magic_quotes_runtime(魔术引号自动过滤)

magic_quotes_runtime

也是自动在单引号(‘)、双引号(")、反斜杠(\)及空字符
(NULL)的前面加上反斜杠(\)。它跟 magic_quotes_gpc 的区别是,处理的对象不一
样,magic_quotes_runtime 只对从数据库或者文件中获取的数据进行过滤,它的作用也
非常大,因为很多程序员只对外部输入的数据进行过滤,却没有想过从数据库获取的
数据同样也会有特殊字符存在,所以攻击者的做法是先将攻击代码写入数据库,在程
序读取、使用到被污染的数据后即可触发攻击。同样, magic_quotes_runtime 在 PHP 5.4
之后也被取消,配置范围是 PHP_INI_ALL。
有一个点要记住,只有部分函数受它的影响,所以在某些情况下这个配置是可以
绕 过 的, 受 影 响 的 列 表 包 括 get_meta_tags()、file_get_contents()、file()、fgets()、fwrite()、
fread( )、fputcsv( )、stream_socket_recvfrom( )、exec( )、system( )、passthru( )、stream_
get_contents( )、bzread( )、gzfile( )、gzgets( )、gzwrite( )、gzread( )、exif_read_data( )、
dba_insert( )、dba_replace( )、dba_fetch( )、ibase_fetch_row( )、ibase_fetch_assoc( )、
ibase_fetch_object( )、mssql_fetch_row( )、mssql_fetch_object( )、mssql_fetch_array( )、
mssql_fetch_assoc( )、mysqli_fetch_row( )、mysqli_fetch_array( )、mysqli_fetch_
assoc( )、mysqli_fetch_object( )、pg_fetch_row( )、pg_fetch_assoc( )、pg_fetch_array( )、
pg_fetch_object( )、pg_fetch_all( )、pg_select( )、sybase_fetch_object( )、sybase_fetch_
array( )、sybase_fetch_assoc( )、SplFileObject::fgets( )、SplFileObject::fgetcsv( )、
SplFileObject::fwrite( )。

magic_quotes_sybase(魔术引号自动过滤)

magic_quotes_sybase 指令用于自动过滤特殊字符,当设置为 on 时,它会覆盖掉
magic_quotes_gpc=on 的配置,也就是说,即使配置了 gpc=on 也是没有效果的。这个
指令与 gpc 的共同点是处理的对象一致,即都对 GET、POST、Cookie 进行处理。而它

们之前的区别在于处理方式不一样,magic_quotes_sybase 仅仅是转义了空字符和把
单引号(‘)变成了双引号(‘‘ )。与 gpc 相比,这个指令使用得更少,它的配置范围是
PHP_INI_ALL,在 PHP 5.4.0 中移除了该选项。

safe_mode(安全模式)

当 safe_mode=on 时,联动可以配置的指令
有 safe_mode_include_dir、safe_mode_exec_dir、safe_mode_allowed_env_vars、safe_mode_
protected_env_vars。safe_mode 指 令 的 配 置 范 围 为 PHP_INI_SYSTEM,PHP 5.4 之
后被取消。

下面是启用 safe_mode 指令时受影响的函数、变量及配置指令的完整列表:
apache_request_headers( )、ackticks( )、hdir( )、hgrp( )、chmode( )、chown( )、
copy( )、dbase_open( )、dbmopen( )、dl( )、exec( )、filepro( )、filepro_retrieve( )、
ilepro_rowcount( )、fopen( )、header( )、highlight_file( )、ifx_*、ingres_*、link( )、
mail( )、max_execution_time( )、mkdir( )、move_uploaded_file( )、mysql_*、parse_ini_
file()、passthru( )、pg_lo_import( )、popen( )、posix_mkfifo( )、putenv( )、rename( )、
zmdir( )、set_time_limit( )、shell_exec( )、show_source( )、symlink( )、system( )、
touch( )。

open_basedir PHP 可访问目录

open_basedir 指令用来限制 PHP 只能访问哪些目录,通常我们只需要设置 Web
件目录即可,如果需要加载外部脚本,也需要把脚本所在目录路径加入到 open_basedir
指令中,多个目录以分号 ( ;) 分割。使用 open_basedir 需要注意的一点是,指定的限
制实际上是前缀,而不是目录名。例如,如果配置 open_ b asedir =/www/a,那么目录
/www/a 和 /www/ab 都是可以访问的。所以如果要将访问仅限制在指定的目录内,请用
斜线结束路径名。例如设置成:open_basedir = /www/a/。
当 open_basedir 配置目录后,执行脚本访问其他文件都需要验证文件路径,因此在
执行效率上面也会有一定的影响。该指令的配置范围在 PHP 版本小于 5.2.3 时是 PHP_
INI_SYSTEM,在 PHP 版本大于等于 5.2.3 是 PHP_INI_ALL。

disable_functions 禁用函数

当你想用本指令禁止一些危险函数时,切记要把 dl()
函数也加到禁止列表,因为攻击者可以利用 dl() 函数来加载自定义的 PHP 扩展以突破
disable_functions 指令的限制。本 指 令 配 置 范 围 为 php.ini only。

display_errors 和 error_reporting 错误显示

时间: 2024-10-19 08:04:29

代码审计读书笔记一的相关文章

《C#图解教程》读书笔记之三:方法

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.方法那些事儿 (1)方法的结构:方法头-指定方法的特征,方法体-可执行代码的语句序列: (2)方法的调用:参数.值参数.引用参数.输出参数.参数数组: ①参数: 形参-本地变量,声明在参数列表中:形参的值在代码开始之前被初始化: 实参-实参的值用于初始化形参: ②值参数: 为形参在栈上分配内存,将实参的值复制到形参: ③引用参数: 不为形参在栈上分配内存,形参的参数名作为实参变量的别名指向同一位置,必须使用ref关

《C#图解教程》读书笔记之五:委托和事件

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.委托初窥:一个拥有方法的对象 (1)本质:持有一个或多个方法的对象:委托和典型的对象不同,执行委托实际上是执行它所"持有"的方法.如果从C++的角度来理解委托,可以将其理解为一个类型安全的.面向对象的函数指针. (2)如何使用委托? ①声明委托类型(delegate关键字) ②使用该委托类型声明一个委托变量 ③为委托类型增加方法 ④调用委托执行方法 (3)委托的恒定性: 组合委托.为委托+=增加

《Effective C++》读书笔记汇总

我之前边读<Effective C++>边写下每个条款的读书笔记,这一版是C++11之前的版本.这里我将每个条款令我印象深刻的点小结一下. 1.C++包括:Plain C(面向过程).OOP(面向对象).模板(泛型和模板元编程).STL(C++标准库). 2.用inline.enum.const代替#define.#define定义的宏,一旦复杂起来,高手都很难掌控.不要带入C的习惯. 3.灵活使用const前缀.不需要进行改变的数据加上const前缀.指针的const前缀有两种形式,cons

【读书笔记】《Linux内核设计与实现》内核同步介绍&内核同步方法

简要做个笔记,以备忘. 需同步的原因是,我们并发访问了共享资源.我们将访问或操作共享资源的代码段称"临界区",如果两个执行线程处于同一临界区中同时执行,称"竞争条件".这里术语执行线程指任何正在执行的代码实例,如一个在内核执行的进程.一个中断处理程序或一个内核线程. 举个简单例子,i++操作.该操作可以转换为下面的机器指令序列: 1.得到当前变量i的值,并保存到一个寄存器. 2.将寄存器的值加1. 3.将i的新值写回到内存中. 当两个线程同时进入这个临界区,若i初值

鸟哥的Linux私房菜 基础学习篇读书笔记(7):Linux文件与目录管理

这一章主要讲述的是如何操作与管理Linux系统中的文件和目录,主要包括目录间的切换,目录的创建与删除,文件的创建与删除,文件的查找,文件内容的查看等等. 前一章中已经讲过相对路径以及绝对路径,绝对路径就是指从根目录("/")开始写起的路径名,而相对路径绝不会由根目录开始写起,相反,相对路径是相对于当前工作目录的路径名.Linux操作系统中有几个特殊的目录: . 代表此层目录: .. 代表上一层目录: - 代表前一个工作目录: ~ 代表当前用户身份所在的主文件夹: ~account 代表

《30天自制操作系统》读书笔记(2)hello, world

让系统跑起来 要写一个操作系统,我们首先要有一个储存系统的介质,原版书似乎是06年出版的,可惜那时候没有电脑,没想到作者用的还是软盘,现在的电脑谁有软驱?不得已我使用一张128M的SD卡来代替,而事实上你用的是U盘还是软盘对我们的操作系统没有影响,缺点是你的U盘刷入系统后容量只能是1440 MB,即当年流行的3.5英寸软盘的大小,当然不用担心,再格式化一次(用DiskGeniu),就可以恢复. 我做事情的话,总是怕自己的努力的结果白费了,害怕辛辛苦苦看完这本书但是发现做出来的东西现在根本没法用,

《巴菲特与索罗斯的投资习惯》读书笔记

巴菲特与索罗斯的投资习惯 收益与风险 收益越高风险越大,或者风险越大收益越高都是没有道理的,风险和收益逻辑上不一定是正相关的,只不过收益越高,人们愿意承担的风险越高而已. 降低风险的同时提高收益是不矛盾的.但风险控制应优先于收益. 同样的事情,对你来说是危险的,但对于高手来说则没有风险,因此,为了降低风险,尽力成为高手吧 关于投资 赚钱只是投资的目的而已,投资策略才是投资的手段. 只是将注意力集中在目的上是没有意义的,因为它只是你的手段所产生的自然结果. 因此我们需要把注意力几种在对投资策略的调

Javascript读书笔记:函数定义和函数调用

定义函数 使用function关键字来定义函数,分为两种形式: 声明式函数定义: function add(m,n) { alert(m+n); } 这种方式等同于构造一个Function类的实例的方式: var add = new Function("m", "n", "alert(m+n);"); Function类构造方法的最后一个参数为函数体:"alert(m+n);",前面的都是函数的形参,参数必须是字符串形式的:&

《Java编程那点事儿》读书笔记(七)——多线程

1.继承Thread类 通过编写新的类继承Thread类可以实现多线程,其中线程的代码必须书写在run方法内部或者在run方法内部进行调用. public class NewThread extends Thread { private int ThreadNum; public NewThread(int ThreadNum){ this.ThreadNum = ThreadNum; } public void run(){ try{ for(int i = 0;i < 10;i ++){ T