零基础从sqli-labs开始学SQL注入个人记录向

Posted 我还有头发还能学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了零基础从sqli-labs开始学SQL注入个人记录向相关的知识,希望对你有一定的参考价值。

纯安服小白,想自学入坑一点,无基础也没有头绪,打算从打靶场开始一点点扩展开学习,如果有大佬愿意带带我的话感激不尽TAT

文中内容皆为自己查资料以及一部分个人理解,不保证完全正确,如果有错误的地方非常欢迎大佬们提出指导。

Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)

提示输入数字型参数作为ID

输入?id=1,url中,?后为参数。出现用户名密码,表示获取到数据库中的数据,不同的id可获得不同的数据。

判断注入点

此处判断出sql注入的第一个条件:可能存在注入的位置。GET的参数id是与数据库进行交互的点

在数字参数后加单引号,判断语句是否拼接以及是字符型还是数字型。

单引号报错,双引号不报错,推测语句闭合方式为单引号。加单引号报错,说明参数类型是字符型。(参考sql注入基础原理(超详细)_牛牛Blog的博客-CSDN博客_sql注入攻击的原理^v52^pc_rank_34_queryrelevant25,201^v3^add_ask&spm=1018.2226.3001.4187)

在单引号后加上注释符号(#或--+等),验证闭合方式。

判断第二个条件:是否能注入

id分别为1' and 1=1 --+和1' and 1=2--+,通过回显情况,进一步判断能否注入。1=1为永真,当1成功查询,若1=1也成功查询,则页面返回正常,1=2为永假,因此若1=2得到执行,则页面必返回不正常。通过对比二者返回结果,可知改点能否进行注入。

mysql数据库可以通过and 1=1和and 1=2来判断字符型还是数字型,输入?id=1 and 1=1和?id=1 and 1=2时,返回的都是id=1的结果,是由于id是一个int型的数值,无论是1还是1 and 1=1都判断为1,所以返回id=1的结果;如果是数字型,则?id=1 and 1=1返回id=1的结果,?id=1 and 1=2会没有回显,因为id=1是正确语句可以被查询,而1=2是永假,所以会有异常或无回显。

实际执行命令为SELECT name,password FROM 表 WHERE id = ‘1’ and 1=1 --+'(由于是字符型,所以需要将最后的单引号注释,保证可以正常执行。如果是数字型,则不需要加单引号,实际执行命令为SELECT name,password FROM 表 WHERE id = 1 and 1=1)

联合注入union

存在sql注入漏洞,接下来使用联合查询,联合查询需要两张表列数相同,所以先判断当前表的列数。order by 4时报错,表示超过列数(order by 1和order by列名没有什么区别,超过当前有的列数之后会报错,常用于判断列数)

联合查询union,将多条select语句的结果合并到一起,要求查询时多个select语句的检索到的字段数量必须一致,每一条记录的各字段类型和顺序最好一致,union默认去重,可使用union all包含重复项

联合查询union select1,2,3(前面order by得到的列数),可以显示我们插入的语句的返回位置。(参考链接:union select的使用sql注入中的union联合查询,union select 1,2,3_头顶蜘蛛网,脚踩大水缸的博客-CSDN博客_sql注入unionselect

回显没有变化是因为union查询中前半部分id=1查询成功,因为源码中带了一个limit 0,1的语句,所以只回显是第一个也就是id=1的结果,就不会回显select 1,2,3的内容,所以我们要让前半部分查询失败,就会显示后半部分的内容(具体解释看上面那个参考链接)

因为id是从1开始的,所以id=-1时是查询不到的,这时候回显显示的就是select 1,2,3的结果,回显的是2,3的部分,也说明这里可以进行sql注入

使用mysql数据库中的一些函数获取一些数据信息,此处获取当前数据库名和版本号,使用database(),version()函数

获取该数据库中的表信息。将group_concat(table_name) from information_schema.tables where table_schema='security'--+ 翻译成人话就是:从information_schema数据库中的tables表中查找数据库security所含有的表有哪些

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

mysql语法:select xxx,xxx,xxx from xxx where xxx,犯傻写成?id=-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security',3--+结果就报错了,应该是?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

获取表信息之后可以看到,security数据库中包含四个表,推断账号密码信息存在user表中,下一步获取字段信息。

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

该语句的意思是查询information_schema数据库下的columns表里面且table_users字段内容是users的所有column_name的内。注意table_name字段不是只存在于tables表,也是存在columns表中。表示所有字段对应的表名。

可以看到user表中有username和password字段,判断账号密码对应这两个字段。中间的id起到分隔账号和密码的作用,可以用其他代替。

?id=-1' union select 1,2,group_concat(username ,id , password) from users--+

参考链接:

  1. 详细sqli-labs(1-65)通关讲解 详细sqli-labs(1-65)通关讲解_糊涂是福yyyy的博客-CSDN博客_sqllabs通关
  2. 简单聊聊SQL注入的原理以及一般步骤 https://www.jb51.net/article/238148.htm
  3. sql注入基础原理(超详细) sql注入基础原理(超详细)_牛牛Blog的博客-CSDN博客_sql注入攻击的原理
  4. 新人学习sqli-labs!最全教程(更新中)【写的很详细但不知道为什么只有第一关…】 新人学习sqli-labs!最全教程(更新中) - wuhuKD - 博客园
  5. sql注入中的union联合查询,union select 1,2,3 sql注入中的union联合查询,union select 1,2,3_头顶蜘蛛网,脚踩大水缸的博客-CSDN博客_sql注入unionselect
  6. SQL注入中可利用的函数,如database()、user(),@@datadir SQL注入中可利用的函数,如database()、user(),@@datadir_头顶蜘蛛网,脚踩大水缸的博客-CSDN博客_sql注入 user()
  7. 详解union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘ ‘--+ 详解union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘ ‘--+_头顶蜘蛛网,脚踩大水缸的博客-CSDN博客
  8. sql注入,关于id=‘1 and 1=1‘ sql注入,关于id=‘1 and 1=1‘_一晓风的博客-CSDN博客_sql注入id=1

SQL注入(Sqli-labs实战)|思路整理

不知道如何找注入点请看该篇文章:零基础看SQL注入
小知识:

数据库版本: version()
数据库名字:database()
数据库用户:user()
操作系统:@@version_compile_os
information_schema表特性,记录库名,表名,列名
information_schema.schemata:记录了所有数据库名
information_schema.tables:记录所有表名
information_schema.columns:记录所有列名
table_name:表名
column_name:列名
table_schema: 数据库名字

高权限注入及低权限注入

通过user()查询可知,用户权限为root(高权限),高权限表示可以有权限管理该机下的所有数据库:


可管理的数据库:


反之: 如果为低权限,就只能查询某一个特定的库

跨库查询及应用思路

获取所有数据库名:

http://127.0.0.1/sqli-labs-master/Less-2/?id=-1 union select 1,group_concat(schema_name), 3 from information_schema.schemata

查询指定数据库的所有表名

http://127.0.0.1/sqli-labs-master/Less-2/?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'

获取指定security数据库下的列名信息

http://127.0.0.1/sqli-labs-master/Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name = 'users' and table_schema='security'

查询指定数据

http://127.0.0.1/sqli-labs-master/Less-2/?id=-1 union select 1,group_concat(username),group_concat(password) from security.users


schemata下面的一些相关信息:

推荐几篇好的文章:
MSSQL注入
https://www.cnblogs.com/xishaonian/p/6173644.html
墨者刷题笔记
https://blog.csdn.net/qq_39936434/category_9103379.html

以上是关于零基础从sqli-labs开始学SQL注入个人记录向的主要内容,如果未能解决你的问题,请参考以下文章

Sqli-labs搭建

对于sqli-labs基础篇全程使用sqlmap不用手工注入(七夕礼物!!!)

通过sqli-labs学习sql注入——基础挑战之less1-3

学数据库,对于零基础.... 从哪开始

[小东]6月份作业之SQL注入基础-基于Sqli-lab平台

小白注入学习:sqli-labs--less8学习记录