- 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 交流
如果你是网络安全爱好者,欢迎加群交流:
- QQ:425343603