【面试二三事】安全岗面试谈关于SQL注入

来源:互联网 发布:网络系统管理课程 编辑:程序博客网 时间:2024/09/21 06:33

【面试二三事】安全岗面试谈关于SQL注入

- 0x01 起因

最近去面试xm某家安全公司(子公司),问到关于SQL注入的一个问题,我支支吾吾的回答了问题之后,对自己的答案还算满意,可不想却得到一句:

你会一点,但是“不懂原理”

扎心了!


- 0x02 问题

  • 跳过个人介绍,面试官就对我进行了探底,谈谈我Web渗透的“基本”流程。
  • 因为本身就是安全岗,就简述了自己总结的Web渗透过程。
    • 1、定期对网段进行端口扫描,对每个端口的服务进行资料收集(因为安全多为白帽测试,在大一点的公司联系相关可获取到更有利的信息,也都愿意配合)
    • 2、对开放的端口进行分类,对涉及Web服务的URL进行整理
    • 3、对存在的系统进行登录渗透
      • 防撞库
      • SQL注入
      • 万能密码
      • 短信炸弹
      • 明文传输
    • 4、对功能、找接口、找输入框。
    • 5、对以上收集资料进行跨站脚本批量测试。
    • 6、对实际功能进行越权测试。

这确实就是最最基本的流程了,其他的当然就是随机应变了。


问题自然就出现了,SQL注入和万能密码本是同根,我最后灵机一动说:万能密码,一般登录渗透测试做的是万能密码。

不料弄巧成拙了,问题自然也被引出来了:

  1. SQL注入和万能密码有什么不同吗?
  2. SQL注入or 1=1和or 1=2结果一样吗?
  3. SQL注入中and 1=1和and 1=2返回结果一样,是否存在注入点。

- 0x03 解决问题

以下为个人见解,因为是Web开发转安全岗,所以站在开发的角度上思考。
1、万能密码是实质就是SQL注入,但又存在区别。

String user;String psw;//1String sql = "Select * from user where username='"+ user +"' and psw='" + psw+"'";//2String sql = "Select password from user where username='"+user+"'";

一般的登录验证为如上两种方法,但是其实形成SQL注入的并不是哪种方法引起的,而是如下。

  1. 采用字符串拼接的形式使得SQL语句可控。
  2. 对用户输入的内容过于信任,没有进行过滤。

做个大胆的假设,万能密码是在SQL注入存在的前提下才会产生。

以上的代码中,我为拼接成如下:
String user = “1’ or 1=1–”
String psw = “1’ or 1=1”;

Select * from user where user=’1’ or 1=1– and psw=’1’ or 1=1

因为两个-为注释后面所有SQL语句,后面的语句也被过滤,psw为了防止空验证则随意填写。

那么第二句话的“区别”究竟在哪里呢?

万能密码不仅仅是实质上的SQL注入,还存在逻辑漏洞

为什么这么说,因为万能密码能实现的关键其实是下一句的代码:

if(result != -1) {    //登录成功代码} else {    //登录失败代码}//或者如下if(rs.next()) {    //登录成功}

这段代码中是开发中经常写的,仅仅判断是否为-1(因为没有找到相应的行的时候返回-1)或者是否存在返回内容。

而这些不严谨的判断方式也正是引起万能密码的原因之一


- 0x04 总结教训

最后,跟大家说一句,面试这类模棱两可的答案,不会是面试官想要的,不要过度的深究和钻牛角尖,很可能把自己绕进去,也可能把水平一般的面试官也给绕进去,即使你是对的那在当时你也只能是错的,因为面试本来就是门“技术活”。