示例1
以下代码使用硬编码密码连接到数据库:
...
DriverManager.getConnection(url,“scott”,“tiger”);
...
这是连接客户端上的外部硬编码密码的示例。此代码将成功运行,但任何有权访问它的人都可以访问密码。程序发布后,除非程序打了补丁,否则数据库用户“scott”不会返回密码为“tiger”的数据库。有权访问此信息的狡猾员工可以利用此信息闯入系统。更糟糕的是,如果攻击者能够访问应用程序的字节码,他们可以使用javap-c命令访问反汇编的代码,其中包含使用的密码值。对于上面的示例,此操作的结果可能如下所示:
javap-c连接管理器类22:ldc#36//字符串jdbc:mysql://ixne.com/rxsql
24:ldc#38//字符串scott
26:ldc#17//弦虎
示例2
以下代码是后端内部硬编码密码的示例:
int VerifyAdmin(字符*密码){
if(strcmp(密码,“Mew!”)){}printf(“进入诊断模式…\n”);返回(1);
}
int VerifyAdmin(字符串密码){if(!password.equals(“喵!”)){返回(0)
}//诊断模式返回(1); }
此程序的每个实例都可以使用相同的密码进入诊断模式。更糟糕的是,如果这个程序是以只包含二进制代码的发行版发布的,那么很难更改密码或禁用这个“功能”
示例3
以下代码示例尝试使用硬编码加密密钥验证密码。
int VerifyAdmin(字符*密码){
if(strcmp(密码,“68af404b513073584c4b6f22b6c63e6b”){
printf(“密码不正确!\n”);
返回(0);
}printf(“进入诊断模式…\n”);返回(1);
}
public boolean VerifyAdmin(字符串密码){if(密码等于(“68af404b513073584c4b6f22b6c63e6b”){System.out.println(“进入诊断模式…”);
返回true;
}System.out.println(“密码不正确!”);返回false;
int VerifyAdmin(字符串密码){if(密码.Equals(“68af404b513073584c4b6f22b6c63e6b”){慰问。WriteLine(“进入诊断模式…”);
返回(1);
}慰问。WriteLine(“密码不正确!”);返回(0); }
加密密钥位于与密码进行比较的硬编码字符串值中。攻击者很可能会读取密钥并危害系统。
示例4
以下示例显示了Java和ASP的部分属性和配置文件。NET应用程序。这些文件包括用户名和密码信息,但它们存储在明文中。
这个Java示例显示了一个带有明文用户名/密码对的属性文件。
#Java Web App ResourceBundle属性文件
...
webapp.ldap.username=秘书用户名
webapp.ldap.password=机密密码
...
以下示例显示ASP的配置文件的一部分。网络应用程序。此配置文件包含数据库连接的用户名和密码信息,但这对信息以明文形式存储。
...<连接字符串><add name=“ud_DEV”connectionString=“connectDB=uDB;uid=db2admin;pwd=password;dbalias=uDB;”providerName=“System.Data.Odbc”/>
</connectionStrings>...
用户名和密码信息不应包含在配置文件或明文形式的属性文件中,因为这将允许任何可以读取文件的人访问资源。如果可能,请加密此信息。
示例5
2022年,OT:ICEFALL研究考察了10家不同运营技术(OT)供应商的产品。研究人员报告了56个漏洞,并表示这些产品“设计上不安全”[参考-1283]. 如果受到攻击,这些漏洞通常允许对手更改产品的操作方式,从拒绝服务到更改产品执行的代码。由于这些产品经常用于电力、电力、水和其他行业,因此甚至可能存在安全隐患。
多家供应商在其OT产品中使用了硬编码凭证。