代码审计安全实践

  • 2019 年 11 月 11 日
  • 筆記

第一次写文章,希望大牛们轻喷

一、代码审计安全

代码编写安全:

程序的两大根本:变量与函数

漏洞形成的条件:可以控制的变量“一切输入都是有害的 ”

变量到达有利用价值的函数(危险函数)“一切进入函数的变量是有害的”

漏洞的利用效果取决于最终函数的功能,变量进入什么样的函数就导致什么样的效果。

变量安全:

秉承一个原则 “一切输入都是有害的”

预定义变量[常规外部提交的变量]:

除了$_GET,$_POST,$_Cookie的提交之外,还来源于$_SERVER,$_ENV, $_SESSION 等register_globals = on [未初始化的变量] 当On的时候,传递过来的值会被直接的注册为全局变量直接使用,而Off的时候,我们需要到特定的数组里去得到它,PHP » 4.20 默认为off

变量覆盖[未初始化及覆盖前定义的变量]:

如:$$使用不当、遍历初始化变量、 extract() 、parse_str()等

变量的传递与存储[中转的变量]:

存储于数据库、文件[如配置、缓存文件等

函数安全:

“什么样的函数导致什么样的漏洞”

文件包含包含漏洞:require、include、require_once、include_once

代码执行执行任意代码漏洞:eval()、assert()、preg_replace()、create_function()

命令执行执行任意命令漏洞:exec()、passthru()、proc_open()、shell_exec()、system()、popen()

文件系统操作文件(目录)读写等漏洞:file_get_contents、file_put_contents、fopen、readfile

数据库操作SQL注入漏洞:select from、mysql_connect、mysql_query、mysql_fetch_row 数据显示 XSS漏洞:print、print_r、echo、print、sprintf、die、Var_dump、var_export

二、代码审计和漏洞验证:

环境:

PHP.ASP等语言环境

Apache.Tomcat.Ngin等中间件

Mysql.Oracle等数据库

工具:

Notepad++、Sublime等代码编辑器

Seay.RIPS等代码审计工具

Burp等漏洞验证工具

三、常见漏洞挖掘与防范:

根据功能点定向审计,例如在文件上传功能模块、文件管理功能模块、登录功能等模块进行漏洞挖掘验证。

通读全部代码

四、安全编程规范:

1.SQL注入防护

(1)采用预编译,在Java Web开发一般在采用预处理,在sql语句中放入?占位符,然后通过后面的传参传递参数,可在一定程度上防止SQL注入。

(2)过滤函数和类, 使用pdo的prepare方式来处理sql查询,但是当PHP版本<5.3.6之前还是存在宽字节SQL注人漏洞,原因在于这样的查询方式是使用了PHP本地模拟prepare,再把完整的SQL语句发送给MySQL服务器,并且有使用setnames'gbk'语句,所以会有PHP和MySQL编码不一致的原因导致SQL注人

(3) GPC/RUTIME魔术引号

通常数据污染有两种方式:

1、是应用被动接收参数,类似于GET、POST等;

2、是主动获取参数,类似于读取远程页面或者文件内容等。

所以防止SQL注入的方法就是要守住这两条路

→ magic_ quotes_ gpc 负责对GET、POST、COOKIE的值进行过滤。

→ magic_ quotes_ runtime 对从数据库或者文件中获取的数据进行过滤。

2. 反引号命令执行

反引号(`)也可以执行命令,它的写法很简单,实际上反引号(`)执行命令是调用的shell_exec()函数。

这段代码正常执行的情况下是会输出当前用户名的,而我们在php.ini里面吧PHP安全模式打开一下,再重启下WebServer从新加载PHP配置文件,再执行这段代码的时候,我们会看到下面这个提示:

Waring:shell_exec() [function.shell_exec]: Cannot execute using backquotes inSafe Mode in D:wwwtest1.php on line 2

这个提示说明反引号执行命令的方式是使用的shell_exec()函数。

3.命令执行漏洞防范规范:

(1) 命令防注入函数: PHP在SQL防注入上有addslashes()和mysql_[real_]escape_string()等函数过滤SQL语句,输人一个string类型的参数,为要过滤的命令,返回过滤后的sting类型的命令,过滤后的string类型的命令,过滤的字符为

’&’、’;’、’|’、’*’、’?’、’~’、’<’、’>’、’^’、’(’、’)’、’[’、’]’、’{’、’}’、’$’、’’、’x0A’、’xFF’、’%’、单引号和双引号仅仅在不成对的时候被转义。

(2) 参数白名单: 参数白名单方式在大多数由于参数过滤不严产生的漏洞中都很好用是一种通用修复方法,我们之前已经讲过,可以在代码中或者配置文件中限定某些参数,在使用的时候匹配一下这个参数在不在这个白名单列表中,如果不在则直接显示错误提示即可。