代码审计基础常识记录


代码审计感觉学起来比较痛苦,但是木的办法,要想找到自己的0day,这一道坎感觉是无法越过了。或许也能加深我们对于漏洞原理的理解。

代码审计前的准备

1、熟悉网站结构,大体框架
2、入口文件:index.php admin.php等等
3、配置文件config.php、php.ini、user.ini,httped.conf
4、过滤功能:就是对于参数获取之后有没有什么处理,比如替换、删除等等

三种审计方法

1、通读全部代码:公司企业使用的,比较费时,对于小的、代码量少的也可使用
2、敏感函数查找分析:找到敏感函数,然后看看他的来源和处理过程,有没有人为可控的参数传入;我感觉我们私人审计可能这个方法用的会多点
3、定向功能分析:根据程序的业务逻辑来审计(据说大佬都是用的这个方法)
常见业务功能漏洞:
程序初始安装、站点信息泄露、文件上传管理、登录认证权限管理、数据库备份恢复、找回密码、验证码

PHP配置文件的分析

几个重要的php.ini选项:

1、Register Globals = Off  默认值预设为 Off(下面写的都是基本默认的)设定为 On 时,程序可以接收来自服务器的各种环境变量,包括表单提交的变量,容易产生变量覆盖(视情况,但是全局变量关掉会很麻烦)

2、display_errors = On 错误等级决定是否可能泄露绝对路径(视情况,错误全关影响调试) E_ALL 最高级别,展示所有错误信息,审计时最好打开,网站上线时关闭

3、short_open_tag = On 默认可用短标签 短标签有可能可以帮助我们渗透时免查、免杀;这个设置可以将<?php?>缩写为<??>;<?echo缩写为<?= 

4、safe_mode = Off 默认关闭  安全模式,PHP 用来限制文档的存取、限制环境变量的存取,限制system()等函数执行 以及敏感文件的读取

5、safe_mode_exec_dir = /var/www/html  这个目录下才可以执行(高版本PHP已废弃)

6、disable_classes =      disable_functions = opendir,readdir,scandir,fopen,unlink   禁用某些类、函数 在php.ini设置

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

8、upload_tmp_dir = 文件上传临时目录 Linux是/tmp windows是C:\Windows\Temp

9、open_basedir = .:/tmp/  用户访问目录限制  默认不配置是空的 一般都是只能访问网站目录  此配置可有效防止PHP木马跨站运行;Linux使用:分隔    windows使用;分隔

10、magic quotes  魔术引号(宽字节注入大家不会陌生)   magic_quotes_gpc = On   5.4.0移除   虽然移除,但是这个功能很可能被开发者自定义使用

11、open_base_dir 禁止使用目录以外的文件操作,有效的消除文件包含

12、expose_php  设为 Off ,这样 php 不会在 http 文件头中泄露信息

13、allow_url_fopen = On  一直都是开启的  可以远程打开url文件,但是这个选项不是执行远程文件的

14、allow_url_include = Off 是否允许远程文件包含(PHP5.2以后默认关闭此功能)允许include、include_once等文件包含函数执行远程文件,所以这个选项比较重要,如果打开远程包含一句话木马就比较可怕了;关于远程文件包含推荐先知社区的伪协议文件包含文章

15、log_errors = On  记录错误日志得就带上吧 

其他:

16、session.cookie_httponly = ON 时,客户端脚本(JavaScript等)无法访问该 cookie,打开该指令可以有效预防通过 XSS 攻击劫持会话ID

17、session.cookie_domain 是否只包含本域,如果是父域,则其他子域能够获取本域的cookies

18、如果使用 HTTPS,那么应该设置 session.cookie_secure=ON,确保使用 HTTPS 来传输 cookies

各种漏洞的敏感函数

  1. 跨站脚本漏洞
  2. 文件包含(文件泄露)
  3. 文件操作(管理)
  4. 命令(代码)执行:命令执行和代码执行的原理其实有细微差别:
  5. SQL注入
  6. 变量覆盖
  7. 会话安全
  8. 特殊函数
  9. SSRF漏洞就找一些参数和功能点吧

1、跨站脚本漏洞(就是直接echo能输出链接的诱骗别人去点的那种):

echo、print、printf、vprintf、<%=$test%>

2、文件包含(文件泄露):

include、include_once、require、require_once、show_source、highlight_file、readfile、file_get_contents、fopen、file

3、文件操作(管理):

copy、file_get_contents、file_put_contents、file、fopen、move_uploaded_file、readfile、rmdir、rename、unlink&delete、fwrite、fread、chmod、fgetc、fgetcsv、fgets、fgetss、

4、命令(代码)执行:

eval():把给定的字符串作为PHP代码执行

preg_replace():当与"/e"开关一起使用时,替换字符串将被解释为PHP代码(这个地方可能会不太好理解)

exec()、shell_exec() proc_open()、pentl_exec()  passthru()、 escapeshellcmd()

passthru():执行指定命令,返回所有结果到客户浏览器 

 `` (反引号)  执行指定命令,返回所有结果到一个数组 

system() 同passthru(),但是不处理二进制数据 

popen()  执行指定的命令,把输入或输出连接到PHP文件描述符

assert断言也具有把字符串当做代码执行的效果

call_user_func、call_user_func_array、create_function 代码注入(闭合+exp+注释掉后面部分)

array_walk()、 array_map()、array_filter()、usort()、ob_start()

5、SQL注入:

insert、delete、update、select(SQL语句查询的地方,看看有没有对变量过滤,有没有可乘之机)

6、变量覆盖:

$$(这个可能也不太好理解)、extract()、parse_str、mb_parse_str、import_request_variables、Register_globals=ON 时,GET 方式提交变量会直接覆盖

7、会话安全:

HTTPOnly 设置、domain 设置、path 设置设置设置、 cookies 持续时间 、 secure 设置、session 固定

8、特殊函数:

配置相关:ini_get()成功时返回配置选项的值

数字判断:is_numeric()数字或数字字符串返回true,仅仅使用is_numeric()而不使用intval转换可能插入16进制字符串到数据库,造成二次注入

变量覆盖:parse_str()

列目录:glob()

无参数函数获取信息:
get_defined_vars() //返回包含所有定义的变量列表的多维数组,包括环境变量、服务器变量、用户自定义
get_defined_constants()//返回当前所有已定义的常量名和值
get_defined_functions() //返回一个包含所有已定义函数列表和多维数组
get_include_files() //返回包含所有文件的文件名

9、SSRF漏洞就找一些参数和功能点吧

函数:curl等

参数:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain .......

功能点:图片链接、分享、收藏下载

最后附一张审计学习中比较全面的思维导图: