PHP伪协议

  PHP伪协议事实上是其支持的协议与封装协议,支持的种类有以下12种。

* file:// — 访问本地文件系统
* http:// — 访问 HTTP(s) 网址
* ftp:// — 访问 FTP(s) URLs
* php:// — 访问各个输入/输出流(I/O streams)
* zlib:// — 压缩流
* data:// — 数据(RFC 2397)
* glob:// — 查找匹配的文件路径模式
* phar:// — PHP 归档
* ssh2:// — Secure Shell 2
* rar:// — RAR
* ogg:// — 音频流
* expect:// — 处理交互式的流

把握大局

  1. 网站结构:浏览源码文件夹,了解程序大致目录。
  2. 入口文件:index.php、admin.php文件一般是整个程序的入口,详细读一下index文

件可以知道程序的架构,运行流程、包含的哪些配置文件,包含了哪些过滤文件以及包含哪些安全过滤文件,了解程序的业务逻辑。

  1. 配置文件:类似config.php文件,包含了数据库的配置信息,程序的一些信息。先看看数据库编码,如果是gbk则可能存在宽字节注入。如果变量的值用双引号、则可能存在双引号解析代码执行的问题。
  2. 过滤功能:通过祥读公共函数文件(lib.php)和安全过滤文件等文件,清晰掌握用户输入的数据,哪些被过滤,哪些没被过滤,在哪里被过滤,如何过滤的,能否绕过过滤的数据。过滤方式是替换还是正则?有没有GPC?有没有使用addslashes()处理。

审计方法

  1. 通读全文法:把握大局→根据入口文件进入各个功能进行审计。
  2. 敏感函数参数回溯法:最高效、最常用的方法。

大多数漏洞的产生是因为函数的使用不当导致的。使用软件查找匹配一些高危漏洞、关键函数及敏感关键字,如——Seay源代码审计系统。不推荐使用,误报率太高,但是可以练习一下,熟悉危险函数、关键函数。

  1. 定向功能分析法:最主要的方法

使用浏览器逐个访问浏览,看看这套程序有哪些功能。根据相关功能,大概推测可能存在哪些漏洞。

把握大局——定向功能——敏感函数参数回溯

常见功能漏洞:

程序初始安装 l  站点信息泄露(日志、备份文件) l  文件上传 l  模板、文件编辑 l  模板更改(zip)l  数据库备份 l  找回密码 l  修改配置信息 

常见的INI配置

配置文件

php.ini全局配置文件、.user.ini用户配置文件,与Apache的.htaccess类似。http.conf会覆盖php.ini的值。

变量相关

全局变量:register_globals,会造成变量之间的覆盖,例如传递一个一样的参数,post会覆盖掉get的值。

短标签:short_open_tag  <? ?>等价于<?php ?>、<?=等价于<? echo。从PHP 5.4.0起。

安全模式

//安全模式:safe_mode,开启system()无法执行,关闭可以。从5.3.0废弃,5.4.0移除。

安全模式下执行程序主目录:safe_mode_exec_dir = /var/www/html

如果PHP使用了该安全模式,system()和其他程序执行函数将拒绝启动不在此目录中的程序。必须使用/作为目录分隔符,包括Windows中。简单来说,就是这个目录下可以执行。

禁用类/函数:disable_classes= ,disable_functions= ,如disabe_function=opendir,readdir,

scandir,fopen,unlink。接受逗号分隔的函数名列表作为参数。只能设置在php.ini中。

上传文件及目录权限

设置上传及最大上传文件大小:file_uploads=on,upload_max_filesize=8M

文件上传临时目录:upload_tmp_dir=

上传临时文件保存的目录,需要可写,如果不设置,则采用系统临时目录。(/tmp、C:\window\Temp)

用户访问目录限制:open_basedir=.:/tmp/,open_basedir=.;c:\windows\temp

使用open_basedir选项能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问不应该访问的文件,一定程度上限制了phpshell的危害,我们一般可以设置只能访问网站目录,表示允许访问当前目录(既PHP脚本文件所在之目录)和/tmp/目录,有效防止PHP木马跨站运行。

错误信息

错误信息控制:display_error

是否将错误信息作为输出的一部分,站点发布后应该关闭这项功能,以免暴露信息,调试的时候可以开启。

设置错误报告级别:error_reporting = E_all  生产环境既发布环境应设置为0

<?php

error_reporting(E_ALL);

……

?>

将错误级别设置为最高,可以显示所有的问题,方便查错。在php.ini中设置。推荐使用E_ALL|E_STRICT ,即所有级别。

错误日志:

error_log = 错误日志的位置,必须对web用户可写入,如果不定义则默认写入到web服务器的错误日志中去。

log_error = on 将错误日志输出到文件,而不是直接输出到前端。

log_errors_max_length = 1024 错误日志关联信息的最大长度,设置为0表示无线长度。

魔术引号及远程文件

魔术引号:magic_quotes_gpc = on、magic_quotes_runtime = off

为GPC(GET/POST/COOKIE)操作设置magic_quotes状态。当magic_quotes为on,所有的单引号、双引号、反斜杠、NULL被一个反斜杠自动转义

本特性已自PHP 5.3.0起废弃并将自5.4.0移除。

是否允许打开远程文件:allow_url_fopen = on(默认)

本选项激活了URL形式的fopen封装协议使得可以访问URL对象例如文件。默认地封装协议提供ftp和http协议来访问远程文件。

是否允许包含远程文件:allow_url_include =off(默认)

本选项激活允许include、inclu_once、require、require_once等函数使用URL形式的fopen封装协议。简单来说就是可以包含远程文件。

随记

erroe_reporting(0);         //关闭网站错误信息(不报错)

Print、echo、print_r()(显示数组内容)、var_dump()(比print_r多显示了参数类型)、exit();

双引号解析变量、单引号不解析变量;

超级全局变量:

$GLOBALS       引用全局作用域中可用的全部变量,但该变量必须是全局作用域。

$_SERVER        服务器和执行脚本环境信息

$_REQUEST     可以引用$_GET、$_POST、$COOKIE变量

$_ENV              环境变量

$_FILES            文件上传变量,注意要有S

笨鸟先飞早入林,笨人勤学早成材。

转载请注明出处:
撰写人:fox-yu http://www.cnblogs.com/fox-yu/

【代码审计】PHP代码审计---基础记录的更多相关文章

  1. python 文本编辑基础记录

    不熟悉编码方式,同时python的编码方式折磨我了很长时间,记录下,以免忘记,本文内容存在错误,是自己理解,看到仅当参考 Unicode 是字符集,有点像一本字典,utf-8是在unicode这本字典 ...

  2. [php基础]记录PHP错误日志 display_errors与log_errors的区别

    display_errors 错误回显,一般常用语开发模式,但是很多应用在正式环境中也忘记了关闭此选项.错误回显可以暴露出非常多的敏感信息,为攻击者下一步攻击提供便利.推荐关闭此选项. display ...

  3. java基础记录(一):开发环境的配置

    一.JDK的安装与环境变量配置 1.jdk下载与安装. jdk1.8.0_192下载地址 下载完成后,双击运行安装文件.可以选择你要安装的位置或者直接下一步,等待安装完成,最后关闭. 2.配置环境变量 ...

  4. mysql基础记录

    1. 概念介绍 数据库:专门存储数据,存储数据的仓库,同时提供了对数据的操作方法,增删改查的方法 事务 事务:是作为一个单元的一组有序的数据库操作,如果组当中所有操作都成功,则事务执行成功,如果有一个 ...

  5. jquery简单笔记(1) - 基础记录

    一.dom对象及jquery对象相互转换 jquery对象转换成dom对象,即 [index] 和 get(index) 第一种方式: var $j = $('#id'); // jquery对象 v ...

  6. js与jq基础记录

    1.在js传递参数中含加号(+)的处理方式: 只需要把js中传过去的+号替换成base64 编码 %2B:encodeURI(str).replace(/\+/g,'%2B'). 2.随机产生8位随机 ...

  7. PHP基础记录

    1. require和require_once的区别 require_once()包涵是绝对路径 include() 和require() :语句包括并运行指定文件. include() 产生一个警告 ...

  8. 关于linux网络基础记录

    1.linux操作系统是一套非常稳定的操作系统,作用永不止于提供网络服务那么简单.(www.Mail.FTP.DNS.DHCP.NAT.Router) 2.对于一个服务器而言,“搭建容易维护难”:维护 ...

  9. PHP代码审计学习-php安全基础

    PHP代码审计-php安全基础 php.ini选项 register_globals php>=4.2.0,php.ini 的 register_globals 选项的默认值预设为 Off,当 ...

随机推荐

  1. 专项测试实战 | 如何测试 App 流畅度(基于 FPS 和丢帧率)

    本文为霍格沃兹测试学院学员学习笔记. FPS 和丢帧率可以在一定程度上作为 APP 流畅度的一项衡量标准,本文介绍利用 adb shell dumpsys gfxinfo 命令获取软件渲染加载过程的数 ...

  2. Unity2018.4.7导出Xcode工程报错解决方案

    1. unity导出xcode工程有两种模式,一种为模拟器运行的工程,一种为真机运行的工程,这里遇到的错误,都是导出模拟器运行工程时报的错误. 错误1: unity UnityMetalSupport ...

  3. 【pytest】(四) pytest的一些其他的运行用法

    1. 可以设置当失败N个后停止测试 pytest -x 是当第一个失败产生后,停止 pytest --maxfail=2, 这里就是当失败2个用例后,停止测试 2.pytest 在命令行模式下支持多种 ...

  4. 使用Vagrant 后发现虚拟机磁盘空间爆满的血泪填坑记

      现象:  用了几天vagrant后,发现docker 里的 Mysql5.7 服务无法启动,用docker ps 命令,发现mysql一直在反复重启, 查看mysql log 发现说磁盘空间不够, ...

  5. Codeforces Round #560 (Div. 3)A-E

    A. Remainder output standard output You are given a huge decimal number consisting of nn digits. It ...

  6. ThreadLocal是什么?谈谈你对他的理解

    1.ThreadLocal是什么 从名字我们就可以看到ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的.ThreadLocal为变 ...

  7. 使用java爬虫从雪球网下载股票数据

    雪球网也是采用Ajax方式展示数据,我依然采用开发者工具查看其访问地址和返回数据. 访问使用到的库是jsoup,解析返回的json用的类库是jackson,二者的依赖是: <!-- jsoup ...

  8. MySQL中存储json格式数据

    1.1.1. JSON类型数据存储 新建表 create table json_user ( uid int auto_increment, data json, primary key(uid) ) ...

  9. leetcode刷题-82.删除排序链表中的重复元素 II

    题目 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4->5输出: 1- ...

  10. html基础:js

    js是一种脚本语言.在html中起到操控行为的作用.在html中,html代码如果是一个人的话,那么js就是这个人的行为 js在html的head中被引用,也可以在body中被引用.引用方式用< ...