![4ed961016f47364b64436a6db3b7061a.png](https://i-blog.csdnimg.cn/blog_migrate/2d3f5da9212d70e3f1775ae754551d44.jpeg)
代码审计,是对应用程序源代码进行系统性检查的工作。目的是为了找到并且修复应用程序在开发阶段存在的一些漏洞或者程序逻辑错误,避免程序漏洞被非法利用给企业带来不必要的风险。
PHP代码审计我这里分享个基础篇,非小白篇哦,介绍常见的SQL注入,XSS,CSRF、文件操作、代码执行、命令执行等漏洞的挖掘思路和防范策略这些。
SQL注入
sql注入最为常见,一般出现在登陆界面、表单界面、http中的GET参数,x-forward-for等,另外在订单系统还容易发生二次注入,审计时需要关注这几个地方。教程:https://www.aqniukt.com/course/13878
1、 普通注入
对于与数据库交互的数据没有任何防护,这种低级错误比较少见,普通注入有int型和string型,对于这些我们只需要查找一些关键函数即可,比如mysql_connect、mysql_query、select from、mysql_fetch_row、update、insert、delete等,我们做白盒审计的时候,只需要查找这些关键词即可定向挖掘SQL注入漏洞。
2、 宽字节注入
在使用PHP连接数据库的时候,当设置set character_set_client=gbk时会导致一个编码转换的注入问题,也就是宽字节注入。
当存在宽字节注入时,注入参数里的%df%27会将过滤的(%5c)吃掉。举个例子,当/1.php?id=1存在注入,我们输入/1.php?id=1' and 1=1#,MYSQL执行的是
select * from user where id = '1' and 1 = 1#'
显然单引号没有闭合,但是当我们提交1.php?id=1%df' and 1 = 1#时,这时MYSQL运行的是
select * from user where id = '1運' and 1 = 1#'
单引号闭合,注入成功,造成这种结果的原因是客户端编码为GBK,MYSQL服务器对查询语句进行转码的过程中,将%df%5c变成了一个汉字“運”,造成了引号的逃逸。
3、 二次urldecode注入
如果网站某处使用了urldecode或者rawurldecode函数,则又可能导致二次注入。比如当网站先采用addslashes()、mysql_real_escape_string()、mysql_escape_string()函数对字符串进行过滤,然后再对字符串进行解码,这样就会造成二次注入。
![b5c5a3629e055536594312a69a2c3186.png](https://i-blog.csdnimg.cn/blog_migrate/c9700f7540bcfd3a04c58e4f629d3a84.png)
XSS漏洞
跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。教程:https://www.aqniukt.com/course/13883
xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。
常见的输出函数有:echo printf print print_r sprintf die var-dump var_export.
1、 漏洞挖掘
XSS漏洞比SQL注入更多,也更难防,经常出现在文章发表、评论回复、留言以及资料设置等地方,在通读代码的时候可以重点关注这几个地方。
挖掘XSS的漏洞关键在于寻找没有被过滤的参数,且这些参数传输到输出函数,常见的输出函数有print、print_r、printf、spintf、echo、die、var_dump、var_export,所以我们只要寻找带有变量的这些函数即可。
2、漏洞防范
- 特殊字符HTML实体转码
一般的XSS漏洞都是没有过滤特殊符号,比如<img src = "$_GET['a']"/>,这里只需要先输入双引号就可以提前闭合利用漏洞,防御这类的XSS一般对特殊字符进行过滤即可。常见的有单引号、双引号、尖括号、反斜杠、冒号、and符号、#。为了保证数据的完整性,最好采用HTML转码。
- 标签事件黑白名单
过滤字符仍有可能被利用,如宽字节转码可以吃掉反斜杠,面对这种情况可以采用黑/白名单。
![35e009a00d47b55f8b0e5e7318f4413c.png](https://i-blog.csdnimg.cn/blog_migrate/be826087068bf05288f162570a2e39c5.png)
CSRF漏洞
跨站点请求伪造(也称为CSRF)是一个Web安全漏洞,攻击者可以利用该漏洞诱使用户执行他们不打算执行的操作。它允许攻击者部分规避同一原始策略,该策略旨在防止不同的网站相互干扰。教程:https://www.aqniukt.com/course/13894
1、 漏洞挖掘
CSRF主要是用于越权操作,所有漏洞自然在有权限控制的地方,像管理后台、会员中心、论坛帖子以及交易管理等地方。
我们在漏洞挖掘的时候可以先搭建好环境,打开几个有非静态操作的页面,抓包看有没有token,如果没有token的话在直接请求页面,不带referer,如果返回的数据还是一样的话说明很可能存在csrf漏洞。
从白盒角度来说,主要是看核心文件里面有没有验证token和referer相关的代码。这里的核心文件指的是被大量引用的基础文件,或者直接搜token这个关键字,如果核心文件里面没有,再去看比较重要的功能点的代码。
2、 漏洞防范
防御CSRF漏洞的最主要问题是解决可信的问题,即使是管理员权限提交到服务器的数据,也不一定是完全可信的,所以针对CSRF的防御有以下两点:
- 增加token/referer验证避免img标签请求的水坑攻击
- 增加验证码
3、文件操作漏洞
文件操作包含文件包含、文件读取、文件删除、文件修改以及文件上传等。且一一道来?
4、文件包含
文件包含大多出现在模块加载的地方,比如传入的模块名参数,实际上是直接把这个拼接到了包含文件的路径中,比如espcms的代码:
$archive = indexget('archive','R');
$archive = empty($archive) ? 'adminuser':'$archive;
$action = indexget('action','R');
$action = empty($action) ? 'login':$action;
include admin_ROOT . adminfile . "/control/$archive.php";
传入的$archive就是被包含的文件名,所以我们在挖掘文件包含漏洞的时候可以先跟踪一下程序运行流程,看看文件名是否可控,另外就是直接搜索include()、include_once()、require()、require_once()这四个函数来回溯看看有没有可控的变量。
代码审计神器
RIPS是一款PHP开发的开源的PHP代码审计工具,由国外的安全研究者Johannes Dahse开发,目前开源的最新版本是0.55。程序小巧玲珑,仅有不到500kb,其中的PHP语法分析非常精准,可以实现跨文件变量和函数追踪,误报率较低。并有拥有简单易懂的用户界面,因此被许多安全研究人员钟爱,因此RIPS可谓是PHP代码审计之利器。
RIPS项目的官网为http://rips-scanner.sourceforge.net/和 https://www.ripstech.com/ , 大家如果有兴趣可以自行了解, 链接:https://pan.baidu.com/s/1hm6VA3vfSRglwF4zE2eqAA 密码:p2ty