快捷搜索: 王者荣耀 脱发

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

    0x01 起因

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

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

扎心了!


    0x02 问题

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

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


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

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

SQL注入和万能密码有什么不同吗? SQL注入or 1=1和or 1=2结果一样吗? 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注入的并不是哪种方法引起的,而是如下。

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

做个大胆的假设,万能密码是在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 交流

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

经验分享 程序员 微信小程序 职场和发展