代码审计必备知识点:
1、代码审计开始前准备:
环境搭建使用,工具插件安装使用,掌握各种漏洞原理及利用,代码开发类知识点。
2、代码审计前信息收集:
审计目标的程序名,版本,当前环境(系统,中间件,脚本语言等信息),各种插件等。
3、代码审计挖掘漏洞根本:
可控变量及特定函数,不存在过滤或过滤不严谨可以绕过导致的安全漏洞。
4、代码审计展开计划:
审计项目漏洞原理->审计思路->完整源码->应用框架->验证并利用漏洞。
代码审计两种方法:
功能点或关键字分析可能存在的漏洞
-抓包或搜索关键字找到代码出处及对应文件。
-追踪过滤或接收的数据函数,寻找触发此函数或代码的地方进行触发测试。
-常规或部分MVC模型源码可以采用关键字的搜索挖掘思路。
-框架 MVC 墨香源码一般会采用功能点分析抓包追踪挖掘思路。
1.搜索关键字找敏感函数
2.根据目标功能点判断可能存在的漏洞
常见漏洞关键字:
SQL注入:
select insert update mysql_query mysqli等
文件上传:
$_FILES,type="file",上传,move_uploaded_file()等
XSS跨站:
print print_r echo sprintf die var_dump var_export等
文件包含:
include include_once require require_once等
代码执行:
eval assert preg_replace call_user_func call_user_func_array等
命令执行:
system exec shell_exec ` ` passthru pcntl_exec popen proc_open等
变量覆盖:
extract() parse_str() import_request_variables() $$ 等
反序列化:
serialize() unserialize() __construct __destruct等
文件读取:
fopen file_get_contents fread fgets fgetss file fpassthru parse_ini_file readfile等
文件删除:
unlink() remove()等
文件下载:
download() download_file()等
通用关键字:
$_GET,$_POST,$_REQUEST,$_FILES,$_SERVER等
案例:.NET项目审计-启明星采购系统-未授权访问漏洞
.NET项目审计介绍
asp.net可以用C# ,VB.NET ,Jscript.net等等来开发,但是通常首选都是C#和VB.NET
审计asp.net的时候,首先得弄明白他的结构,他并不像php那么单纯。
一般来说,在asp.net应用中,需要进行观察的文件有:.aspx,.cs,.ashx,dll文件
1、.aspx是页面后的代码,aspx负责显示,服务器端的动作就是在.cs定义的。
2、.cs是类文件,公共类神马的就是这个了。
3、.ashx是一般处理程序,主要用于写web handler,可以理解成不会显示的aspx页面。
4、.dll就是cs文件编译之后的程序集。
ASP.NET中Inherits、CodeFile、CodeBehind 三个属性指向解析:
Inherits
msdn解释:定义提供给页继承的代码隐藏类。 它可以是从 Page 类派生的任何类。 此特性与 CodeFile 特性一起使用,后者包含指向代码隐藏类的源文件的路径。 Inherits 特性在使用 C# 作为页面语言时区分大小写,而在使用 Visual Basic 作为页面语言时不区分大小写。
CodeFile
msdn解释:指定指向页引用的代码隐藏文件的路径。 此特性与 Inherits 特性一起使用,用于将代码隐藏源文件与网页相关联。 此特性仅对编译的页有效。
Codebehind
msdn解释:指定包含与页关联的类的已编译文件的名称。 该特性不能在运行时使用。此特性用于 Web 应用程序项目。
开始审计:
1.下载源码,搭建好网站。登录进入后台,密码:admin/123456。点击盘点单——新建,复制地址
2.退出管理员登录,再次访问地址跳转到了登录验证。说明pd.aspx文件存在登录检测代码。
3.使用Visual Sdudio Code打开源码,找到pd.aspx文件,审计发现pd.aspx文件中没有检测代码,但是代码中引用了一个purchase.Master文件,验证文件应该在其中。
4.打开purchase.Master文件发现里面还是没有检测代码,代码中Inherits指向了一个pur类,而Inherits提供的都是隐藏类(dll文件)
5.选择bin目录下的purchase.dll(因为Inherits指向的就是Purchase),使用ILSpy工具打开purchase.dll进行反编译。
ILSpy下载:https://github.com/icsharpcode/ILSpy/releases
反编译成功,根据Inherits指向的路径找到pur类,在里面成功找到检测代码。
6.检测代码表示:只要 GetUserId <= 0 就会跳转到登录验证,只要GetUserId的值>0 即可绕过验证。所以需要知道 GetUserId 的值是怎么来的。点击代码中的GetUserId成功定位到其定义代码处。
根据代码得知:GetUserId的值是由请求包中Cookies中的 userinfo和userid 传递的
7.我们就可以在没有登录管理员账户的情况下访问未授权地址——进行抓包,然后修改Cookie值实现绕过检测。
访问:http://192.168.92.249:44/purchase/pd.aspx
抓包修改值:Cookie:userinfo=userid=1
放包成功绕过登录验证,访问到了管理员后台页面