前言:
  之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识.
  web开发初学者往往会忽视一些常见的漏洞, 比如SQL注入攻击, XSS攻击. 本文将简述SQL注入攻击的原理, 并分享下关卡设计, 其在打开潘多拉魔盒的情况下, 又能很好地限制危害.

效果展示:
  先打下广告: 网页闯关游戏入口(请狠狠地点击我, ^_^).
  本文的想法实施于第十一关--健忘的教授.
  
  很直接的呈现一个登陆对话框, 考验玩家能否借助非常规的方式来绕开登陆验证.

SQL注入攻击:
  虽然SQL注入攻击已是老生常谈, 不过还是得唠叨几句"科普"一下, ^_^.
  应用程序再获取到用户提交的数据后, 有些会进行SQL语句的拼接并执行. 倘若用户提交的数据中包含SQL执行命令, 同时程序并没有对数据进行过滤和安全验证. 这样就有可能绕过验证并获取数据, 甚至注入恶意代码, 导致数据被篡改, 丢失.
  • 以用户登录为例
  服务的用户数据模型如下:

  1. table tb_user (
  2.   username varchar(32),
  3.   password varchar(32)
  4. );

  服务的登陆验证SQL如下:

  1. SELECT * FROM tb_user WHERE username = '?' AND password = '?';

  登陆的输入框入图所示:
  
  其对应的form表单为:

  1. <form method="post">
  2.   用户名: <input name="username" />
  3.   密码: <input name="password" type="password"/>
  4. </form>

  hacker只要在form表单中, 巧妙设计字段内容, 注入sql执行命令, 以绕过数据验证.
  比如username字段, 填写为: ' or 1 = 1 #.
  这样服务器端, 最终拼接的SQL为:

  1. SELECT * FROM tb_user WHERE username = '' or 1 = 1 #' AND password= '?'

  由于字符'#'在SQL规范中, 表示注释, '#'字符后直到行尾的所有字符都将被忽略掉.
  因此最终的SQL等价于如下:

  1. SELECT * FROM tb_user WHERE username = '' or 1 = 1

  用户数据将被返回, 如果尝试登录的是管理员后台, 那hacker将轻松获取到管理员的权限, 这非常的可怕.
  魔高一丈道高一尺, 既然知道SQL注入的攻击原理是什么? 那么防范措施就有针对性了, 千万不要相信用户提交的数据, 做好过滤和验证.

关卡设计:
  本关就是来考察玩家对SQL注入的认知功底. 因此模拟构建了一个登陆窗口, 接受开放式的答案.
  如何对答案进行验证呢? 1). 模拟SQL的执行解析. 2). 直接跑真实的SQL.
  对于方案一, 工作量大, 多个SQL命令需要支持, 有可能覆盖不全所有的解, 有点得不偿失.
  对于方案二, 容易实现, 但是给系统带来了潜在风险, 比如注入drop tables等危险的命令.
  权衡比较, 还是采用第二种方案, 至于风险控制亦可控.
  服务程序是采用Java来编写的, 若要放开SQL注入漏洞限定, 那就不能使用mybatis/hibernate这些ORM框架, 因为这些框架已经帮我们做了escape数据的工作.
  让我们回到石器时代, 直接裸用jdbc来实现, 代码如下:

  1. /**
  2. *
  3. * 构造经典的SQL注入攻击
  4. * @param username 用户输入的用户名
  5. * @param password 用户输入的密码
  6. * @return
  7. */
  8. public boolean verifySQLInject(String username, String password) {
  9.  
  10.   Connection connection = null;
  11.  
  12.   try {
  13.     // *) 动态载入Mysql Driver驱动类
  14.     Class.forName("com.mysql.jdbc.Driver");
  15.  
  16.     // *) 获取 DB Connection
  17.     connection = DriverManager.getConnection(dbUrl, dbUsername, dbPassword);
  18.  
  19.     Statement stmt = connection.createStatement();
  20.  
  21.     String sql = String.format(
  22.               "SELECT * " +
  23.               "FROM tb_virtual_user " +
  24.               "WHERE username = '%s' AND password = '%s'",
  25.               username, password
  26.       );
  27.     ResultSet rs = stmt.executeQuery(sql);
  28.     if ( rs.next() ) {
  29.       stmt.close();
  30.  
  31.       // *) 登陆成功
  32.       return true;
  33.     }
  34.   } catch (ClassNotFoundException e) {
  35.     e.printStackTrace();
  36.   } catch (SQLException e) {
  37.     e.printStackTrace();
  38.   } finally {
  39.     if ( connection != null ) {
  40.       try {
  41.         connection.close();
  42.       } catch (SQLException e) {
  43.         // e.printStackTrace();
  44.       }
  45.     }
  46.   }
  47.   return false;
  48.  
  49. }

  注: 该代码确切地执行了用户登录的SQL语句, 常规登录和非法sql注入构造都将返回失败.
  同时正如前文所提到的, 为了验证SQL注入攻击, 从而放弃数据验证和过滤. 万一有人不是用于解题, 而是专门搞破坏怎么办? 犹如自己给自己埋了个炸弹, 你永远不知道它什么时候爆炸.
  事实上, 这是多虑的. 我们可以创建两个mysql账号, 一个专门用于sql注入验证(只授予select权限), 而剩下则用于其他的业务数据. 这样就轻松做到隔离, 且十分安全.

  1. GRANT USAGE ON *.* TO 'game1001'@'localhost' IDENTIFIED BY PASSWORD '*25A2CD7698FEED80089150F089755D752423A821';
  2. GRANT SELECT ON `db_gameweb`.`tb_virtual_user` TO 'game1001'@'localhost';

  比如创建账号game1001, 它只被授予对tb_virtual_user表的只读权限.
  这样服务就能允许sql注入存在, 但这些sql注入不具攻击性.

后记:
  其实对该题, 我还是很满意的. 我一直希望能构建类似的题, 寓教于乐. 就当自己一个以后奋斗的方向吧! 与君共勉.

公众号&游戏站点:
  个人微信公众号: 木目的H5游戏世界
  
  个人游戏作品集站点(尚在建设中...): www.mmxfgame.com,  也可直接ip访问http://120.26.221.54/.

网页闯关游戏(riddle webgame)--SQL注入的潘多拉魔盒的更多相关文章

  1. 网页闯关游戏(riddle webgame)--H5刮刮卡的原理和实践

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 对于刮刮卡, 想必大家都很熟悉, 也很喜 ...

  2. 网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点

    前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. 本文讲描述, 如何在网页端实现一个仿微信 ...

  3. 网页闯关游戏(riddle webgame)--游戏玩法和整体介绍

    前言: 记得上大学那会, 有位传说中的大牛, 写了一个网页闯关类的游戏. 当时我们玩得不亦乐乎, 也是第一次接触到这种形式的游戏. 不过当时纯玩家心态, 并没有想过去创造一个. 最近想起这事, 突然想 ...

  4. XSS闯关游戏准备阶段及XSS构造方法

    请下载好XSS闯关文件后,解压后放在服务器的对应文件夹即可 在该闯关中,会在网页提示一个payload数值 payload,翻译过来是有效载荷 通常在传输数据时,为了使数据传输更可靠,要把原始数据分批 ...

  5. 仿5173游戏交易平台系统SQL注入(可直接脱裤)+Getshell

    最近没事登登好几年前玩过的游戏看看,发现有人喊高价收号,这一看就是骗子,这等骗子还想骗我?我就来看看这逗逼是怎么骗人的,结果发现这人给了一个说是 5173平台交易的网站,叫我直接把号的信息填上去然后填 ...

  6. hack游戏攻略(黑吧安全吧的黑客闯关游戏)古墓探秘

    2019.2.11 这个是找到的一个黑客游戏,就是一关一关,挺像ctf的,玩玩也挺有意思,还能涨知识. 地址:http://hkyx.myhack58.com/ 入口: 入口就是这样的.提示是 图内有 ...

  7. 51nod 1450 闯关游戏

    首先肯定要先把所有的关卡打通后去找两星几率最大的关卡刷星(论打游戏经验的重要性). 所以从两星几率小的关打起,记录当前拿到x个星星的几率和当前走过的期望步数,如果发现剩下的关必须全两星,就直接计算答案 ...

  8. 51nod1450 闯关游戏

    题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 一个游戏App由N个小游戏(关卡)构成,将其标记为0,1,2,..N-1.这些小游戏没有相互制约的性质 ...

  9. python3 黑板客爬虫闯关游戏(四)

    这关较第三关难度增加许多,主要多了并发编程 密码一共有100位,分布在13页,每页打开的时间在15秒左右,所以理所当然的想到要用并发,但是后来发现同IP访问间隔时间不能小于8秒,不然会返回404,所以 ...

随机推荐

  1. 移动端web页面如何适配

    移动端web页面如何适配,现有两个方案: 1 设置viewport进行缩放 简单粗暴,使用过程中反应缩放会导致有些页面元素会糊的情况.天猫的web app的首页使用这种方案 在页面中加入viewpor ...

  2. HQL 参数绑定、唯一结果、分页、投影总结(下)

    分页: 在用hibernate封装的分页方法前,我们先回顾一下,Oracle里面原生分页做法 --分页查询 --(pageNo-1)*pagesize=起始行 pageNo*pagesize=结束行 ...

  3. MFC编程入门之七(对话框:为对话框添加控件)

    创建对话框资源需要创建对话框模板.修改对话框属性.为对话框添加各种控件等步骤,前面一讲中已经讲了创建对话框模板和修改对话框属性,本节继续讲如何为对话框添加控件.  上一节中创建了一个名为"A ...

  4. 简单回忆一下JavaScript中的数据类型

    说到JavaScript,大家都应该知道,它是一门脚本语言,也是一门弱类型语言,也是一门解析型的语言,同时也是一门动态类型的语言. 很好,至于JavaScript中数据类型.其分为基本数据类型和复杂数 ...

  5. Google 黑客搜索技巧

    常用的google关键字: foo1 foo2 (也就是关联,比如搜索xx公司 xx美女) operatorfoo filetype123 类型 sitefoo.com 相对直接看网站更有意思,可以得 ...

  6. toolkit学习笔记

  7. HTML 水平线<hr/>标签

    定义和用法: <hr/>标签在HTML页面中创建一条水平线. 水平分隔线(horizontal rule)可以在视觉上将文档分隔成各个部分. HTML 与 XHTML 之间的差异 在 HT ...

  8. CodeForces #100 C 贪心+STL

    题目链接:CodeForces #100  C 题意:现在给出n个snowball的半径,3个半径严格递增或递减的snowball,可以组成1个snowmen.问最多能组成多少个snowmen.并且按 ...

  9. createjs 利用createjs 写拼图功能

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...

  10. Quartz Spring与Spring Task总结

    Spring对Quartz作了一个封装,同时,Spring自己也提供了一个任务定时器(spring-task),现把它总结一下.    对于Quartz,我们使用的时候主要是注重两个方面,一个是定时任 ...