0x02-SQL注入-绕过登陆验证

目录

今日目标

在这里插入图片描述

这是什么漏洞?

我的目标是要登录到 Bender 这个用户的账户。

在这里插入图片描述

Bender 是一个普通用户,要完成这个挑战,必须要猜测该用户的 email 账号,并且这是一个注入的漏洞,而不要去尝试获取该用户的密码 hash,或者尝试爆破该用户的密码,这是一个注入的练习。

跟第一篇文章一样,这还是一个绕过登陆验证的注入漏洞。

这个漏洞是怎么造成的?

开发者在开发登陆流程的时候

  • 没有使用 ORM 进行数据库请求,而是直接拼接了请求语句;
  • 没有对用户输入做过滤,校验,和编码;

关于第一点,可以参考这一系列文章的第一篇

关于第二点,在后面的如何应对一节中做说明。

怎么判断漏洞是否存在?

记得在第一篇文章中,说明了判断此类漏洞的方法。通过在输入框中输入单引号,或者双引号,然后查看服务端返回结果,如果返回结果有异样,那么可以判断注入漏洞存在。

如何利用这个漏洞?

第一篇文章中,我们可以绕过登陆验证,注入之后构造的数据库请求如:

SELECT user_name from Users where email = '' or 1 = 1 -- AND password = ...

由此,我们可以登陆任何用户的账户。

上一篇文章在成功绕过登陆验证之后,admin 账户的邮箱是这样的

在这里插入图片描述

那么 bender 用户的邮箱,就可以猜测应该是

bender@juice-sh.op

构造如下用户名,即可完成登陆

bender@juice-sh.op'  -- 

在这里插入图片描述

在这里插入图片描述

如何应对?

过滤

对于用户输入的过滤,也就是把一些敏感字符直接删除掉。例如,如果用户输入中有 < > 这样的尖括号,直接删除掉。但是这样的方式很粗暴,如果用户并没有注入的意图,只是有使用尖括号的需求,那么用户体验就会很差。

校验

暴力过滤会影响用户体验,那么可以稍做改进。在服务端收到用户输入之后,对用户输入进行一定的校验。我举得正则是比较好的方式,任何符合 <script 的非大小写敏感的模式,如果出现在不该出现的如用户登陆的逻辑当中,做统一的错误处理。

编码

更进一步,对于用户输入,在开始传输的时候,做一次 URL Encode。那么例如 <,在传输的时候,会被转换成 &lt;,也就避免了注入代码执行。

URL Encode 官方文档。

更加详细的防御方法,参见 OWASP 官方文档。



参考链接:

  • https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_A1-Injection
  • https://www.w3schools.com/tags/ref_urlencode.ASP
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
收到数据后,可以先将数据进行转义,然后再将转义后的数据保存为 jpg 格式的图片,可以参考以下示例代码实现: ```java import java.io.*; public class DataHandler { public static void main(String[] args) { // 接收到的数据 byte[] receivedData = new byte[]{0x7D, 0x01, 0x7D, 0x02, 0x7D, 0x03, 0x7D, 0x04, 0x7D, 0x05}; // 转义数据 byte[] escapedData = escapeData(receivedData); // 保存为 jpg 格式的图片 saveJpgFile(escapedData); } // 转义数据 private static byte[] escapeData(byte[] data) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); for (byte b : data) { switch (b) { case 0x7D: outputStream.write(0x7D); outputStream.write(0x01); break; case 0x02: outputStream.write(0x5B); break; case 0x03: outputStream.write(0x5D); break; case 0x04: outputStream.write(0x2C); break; case 0x05: outputStream.write(0x2A); break; default: outputStream.write(b); break; } } return outputStream.toByteArray(); } // 保存为 jpg 格式的图片 private static void saveJpgFile(byte[] data) { FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream("image.jpg"); fileOutputStream.write(data); } catch (IOException e) { e.printStackTrace(); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } } ``` 在这个示例代码中,我们使用了 ByteArrayOutputStream 和 FileOutputStream 类分别进行数据转义和保存图片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值