类型: 安全缺陷
SQL注入是一种数据库攻击手段。攻击者通过向应用程序提交恶意代码来改变原SQL语句的含义,进而执行任意SQL命令,达到入侵数据库乃至操作系统的目的。使用Persistence执行由用户输入构建的动态SQL指令,会让攻击者有机会篡改指令的含义或者执行任意的SQL命令。
public void doPrivilegedAction(HttpServletRequest request, char[] password) throws SQLException {
String username = request.getParameter("name");
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJPA");
EntityManager em = emf.createEntityManager();
String pwd = hashPassword(password);
String sqlString = "SELECT * FROM db_user WHERE username = '" + username + "' AND password = '" + pwd + "'";
Query createQuery = em.createQuery(sqlString);
//...
Object singleResult = createQuery.getSingleResult();
if(object == null){
//...
}
//...
}
如果攻击者能够替代username和password中的任意字符串,它们可以使用下面的关于username的字符串进行SQL注入。
validuser’ OR ‘1’=’1
当其注入到命令时,命令就会变成:
SELECT FROM db_user WHERE username=’validuser’ OR ‘1’=’1’ AND password=’’
同样,攻击者可以为password提供如下字符串。
‘ OR ‘1’=’1
当其注入到命令时,命令就会变成:
SELECT FROM db_user WHERE username=’’ AND password=’’ OR ‘1’=’1’