【面试二三事】安全岗面试谈关于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;
//1
String sql = "Select * from user where username='"+ user +"' and psw='" + psw+"'";
//2
String 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 总结教训

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


  • 0x05 交流

如果你是网络安全爱好者,欢迎加群交流:
网络安全交流群

  • QQ:425343603
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值