您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
aduit(aduit怎么读)
漏洞,命令,安全aduit(aduit怎么读)
发布时间:2016-12-08加入收藏来源:互联网点击:
很多朋友想了解关于aduit的一些资料信息,下面是小编整理的与aduit相关的内容分享给大家,一起来看看吧。
公众号:渗透师老A专注分享渗透经验,干货技巧....
本文作者:Pamela@涂鸦智能安全实验室
转自:https://www.freebuf.com/articles/web/287981.html
前言这篇文章主要是总结一下在安全工作中常见漏洞的代码审计方法,以及修复方案,希望能对初学代码审计小伙伴们有所帮助
代码审计的思路通常做代码审计都是检查敏感函数的参数,然后回溯变量,判断变量是否可控并且没有经过严格的过滤,这是一个逆向追踪的过程。
而代码审计并非这一种手段,还可以先找出哪些文件在接收外部传入的参数,然后跟踪变量的传递过程,观察是否有变量传入到高危函数里面,或者传递的过程中是否有代码逻辑漏洞,这是一种正向追踪的方式,这样的挖掘方式比逆向追踪挖掘得更全。
还有一种方式是直接挖掘功能点漏洞,根据自身的经验判断该类应用通常在哪些功能中会出现漏洞,直接全篇阅读该功能代码。
常见漏洞的代码审计1. HTTP响应头截断
漏洞描述
HTTP响应截断是由于应用程序未对用户提交的数据进行严格过滤,当用户恶意提交包含 CR(回车,即URL编码%0d或\r)和 LF(换行符,即URL编码%0a或\n)的HTTP请求,服务器可能会创建两个 HTTP 响应,攻击者可以控制第二个响应并加载攻击。 攻击者可控制响应的内容构造XSS攻击,其中响应中包含恶意的JavaScript或其它代码在用户的浏览器中执行,也有可能让用户重定向到攻击者控制的Web内容或在用户的主机上执行恶意操作。
审计方法
检查对响应头字段是否进行安全处理。
如果未对响应头进行任何安全处理,则为确认:
//未对响应头做任何安全处理,审计时为确认String data;if (data != null){ response.addHeader("Location", "/author.jsp?lang=" + data);}再举一例:
//同样的未对响应头做任何安全处理,审计时为确认String author = request.getParameter(AUTHOR_PARAMETER);// ...Cookie cookie = new Cookie("author", author);response.addCookie(cookie);如果对响应头做了响应的安全处理,则为误报:
//使用Refenence类对环境变量值进行编码,剔除特殊字符,为误报if (data != null){ String decode = Reference.decode(data); response.addHeader("Location", "/author.jsp?lang=" + decode);}修复方案:
1、对用户的输入进行合理验证,对特殊字符(如、、’、”等)等进行编码。
2、创建一份安全字符白名单,只接受完全由这些受认可的字符组成的输入出现在 HTTP 响应头文件中。 3、使用源代码静态分析工具,进行自动化的检测,可以有效的发现源代码中的 HTTP 响应截断问题。
2. 硬编码问题
漏洞描述
硬编码问题,是指将敏感数据(包括口令和加密密钥,部分账号的密码以及其他敏感信息等)硬编码在程序中。
审计步骤
1、看扫描出的硬编码是否为常规单词(或通读代码查看是否有硬编码敏感文件)
2、如果是常规单词,则为误报,如:
//fipAddress为硬编码public class IPaddress{private String ipAddress = "172.16.254.1"public static void main(String[] args){//...}}可以使用 javap -c IPaddress 命令来反编译 class 来发现其中硬编码的服务器 IP 地址,此处反
编译器的输出信息可以直接透漏服务器的明文 IP 地址为172.16.254.1
再举一例:
//SECRET_PASSWORD为硬编码private String SECRET_PASSWORD = "No fear in my heart!" Properties props = new Properties(); props.put(Context.SECURITY_CREDENTIALS, "password");3、如果是随机字符串,则为确认或待确认,如:
//1546272000000为硬编码byte[] sr = hBaseClient.buildRowKey(devId, "1546272000000");再举一例:
//qafgshw1900wxxxx为硬编码private String accessKeyId = "qafgshw1900wxxxx"4、追踪key值,如果key为硬编码则为确认,如:
//key值为硬编码byte[] key = {1, 2, 3, 4, 5, 6, 7, 8};SecretKeySpec spec = new SecretKeySpec(key, "AES");Cipher aes = Cipher.getInstance("AES");aes.init(Cipher.ENCRYPT_MODE, spec);return aesCipher.doFinal(secretData);追踪key值,如果追踪不到或者为安全形式,则为误报,如
//无法再继续追踪key值,为误报public static byte[] encryptByPrivateKey(byte[] data, String key) throws Exception { //key为密钥 byte[] keyBytes = decryptBASE64(key); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, privateKey); return cipher.doFinal(data);}再来一栗:
//存储密钥。KeyStore.getInstance("PKCS12")为密钥库,为误报try{ KeyStore keyStore = KeyStore.getInstance("PKCS12"); keyStore.load(null, null); KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(128); Key key = keyGen.generateKey(); keyStore.setKeyEntry("secret", key, "password".toCharArray(), null); keyStore.store(new FileOutputStream("output.p12"), "password".toCharArray());} catch (Exception ex){ ex.printStackTrace();}修复方案
推荐使用配置文件或者通过配置中心来下发这些敏感配置,密码和密钥应存储在单独的加密配置文件或密钥库中。
3. SQL注入
漏洞描述
注入攻击的本质,是程序把用户输入的数据当做代码执行。这里有两个关键条件:
第一是用户能够控制输入;
第二是用户输入的数据被拼接到要执行的代码中从而被执行。
sql 注入漏洞则是程序将用户输入数据拼接到了 sql 语句中,从而攻击者即可构造、改变 sql 语义从而进行攻击。
漏洞举例
(1) 直接通过拼接 sql
@RequestMapping("/SqlInjection/{id}")public ModelAndView SqlInjectTest(@PathVariable String id){String mysqldriver = "com.mysql.jdbc.Driver"String mysqlurl = "jdbc:mysql://127.0.0.1:3306/test?user=root&password=123456&useUnicode=true&characterEncoding=utf8&autoReconnect=true"#直接通过拼接 sqlString sql = "select * from user where id=" + id;ModelAndView mav = new ModelAndView("test2"); try{Class.forName(mysqldriver);Connection conn = DriverManager.getConnection(mysqlurl);PreparedStatement pstt = conn.prepareStatement(sql);ResultSet rs = pstt.executeQuery();再来一例:
//没有做任何其他安全处理措施stmt = conn.createStatement();rs = stmt.executeQuery("select * from user where username = '" + username+"' and password='"+password+"'");(2) 预编译使用有误
漏洞举例:
//只使用了占位符@RequestMapping("/SqlInjection/{id}")public ModelAndView SqlInjectTest(@PathVariable String id){String mysqldriver = "com.mysql.jdbc.Driver"String mysqlurl = "jdbc:mysql://127.0.0.1:3306/test?user=root&password=123456&useUnicode=true&characterEncoding=utf8&autoReconnect=true"String sql = "select * from user where id= ?"ModelAndView mav = new ModelAndView("test2"); try{Class.forName(mysqldriver);Connection conn = DriverManager.getConnection(mysqlurl);PreparedStatement pstt = conn.prepareStatement(sql);//pstt.setObject(1, id); //一般使用有误的是没有用这一句,编码者以为在上面的sql语句中直接使用占位符就可以了。ResultSet rs = pstt.executeQuery();上一篇:沟通漏斗(沟通漏斗原理)
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |