代码审计必备知识点:
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等
在Java中SQL语句写法一般有以下几种方式:
一.JDBC 注入分析
安全写法: "select * from user where id = ?";
不安全写法: "select * from user where id ="+req.getParameter("id");
二.Mybatis 注入分析
#号会对语句进行预编译
${ } 只是进行string 替换,动态解析SQL的时候会进行变量替换
安全写法: select * from user where name = #{name}
不安全写法:select * from user where name = ${name}
三.Hibernate 注入分析
安全写法:参数绑定预编译
Query<User>.query=session.createNativeQuery("select * from user where name=:name");
query.setParameter("name",parameter) ;
不安全写法:
Query<User>.query=session.createNativeQuery("select * from user where name="+req.getParameter("id"));
java项目sql注入产生原理总结:
1、预编译使用不当:
sql="select * from user where id = ?";
sql+="and username ="+req.getParameter("username");
2、直接动态拼接:
"select * from user where id ="+req.getParameter("id");
3、order by&like&in查询:
由于这三种关键字不能预编译(预编译失效),所以需要过滤器或自定义过滤
防御:
能预编译的情况都做预编译,一些特殊无法做预编译的,则过滤用户可控的参数。
案例:Javaweb-代码审计SQL注入-INXEDU在线网校
环境:MYSQL:5.X TomCat:8.X JDK:1.8 IntelliJ IDEA
1.将源码导入到IntelliJ IDEA ,部署好环境,启动服务器
2.搜索关键字:jdbc mybatis—>$ hibernate,判断源码使用的是哪种方式写的sql语句。
3.判断出源码使用的是mybatis方式写sql语句,我们就可以查找 如:${} 这样的不安全写法。
可以看到下图的 IN(${value}) 不但使用了$()不安全写法,还使用了in关键字使预编译失效,极大概率会产生SQL注入漏洞。所以要知道是谁调用执行了这条SQL语句。
4.复制deleteArticleByIds 进行全局搜索
5.成功找到方法,选中——导航——调用层次结构,成功获取完整调用链
6.分析调用链,获取到路由地址:/admin/article/delete ,以post方式为articelId参数传递参数值
7.访问路由地址并且抓包,将数据包更改为post请求,增加post传参:articelId=1*
8.将数据包保存为1.txt,使用sqlmap检测sql注入。
cmd执行:python sqlmap.py -r 1.txt --dbs
成功获取数据库信息: