mysql漏洞怎么注入 sql注入漏洞是什么意思啊
部分sql注入总结
本人ctf选手一名,在最近做练习时遇到了一些sql注入的题目,但是sql注入一直是我的弱项之一,所以写一篇总结记录一下最近学到的一些sql注入漏洞的利用。
创新互联专业为企业提供凤泉网站建设、凤泉做网站、凤泉网站设计、凤泉网站制作等企业网站建设、网页设计与制作、凤泉企业网站模板建站服务,十载凤泉做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
在可以联合查询的题目中,一般会将数据库查询的数据回显到首页面中,这是联合注入的前提。
适用于有回显同时数据库软件版本是5.0以上的MYSQL数据库,因为MYSQL会有一个系统数据库information_schema, information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等
联合注入的过程:
判断注入点可以用and 1=1/and 1=2用于判断注入点
当注入类型为数字型时返回页面会不同,但都能正常执行。
sql注入通常为数字型注入和字符型注入:
1、数字型注入
数字型语句:
在这种情况下直接使用and 1=1/and 1=2是都可以正常执行的但是返回的界面是不一样的
2、字符型注入
字符型语句:
字符型语句输入我们的输入会被一对单引号或这双引号闭合起来。
所以如果我们同样输入and 1=1/and 1=2会发现回显画面是并无不同的。
在我们传入and 1=1/and 1=2时语句变为
传入的东西变成了字符串并不会被当做命令。
所以字符型的测试方法最简单的就是加上单引号 ' ,出现报错。
加上注释符--后正常回显界面。
这里还有的点就是sql语句的闭合也是有时候不同的,下面是一些常见的
这一步可以用到order by函数,order by 函数是对MySQL中查询结果按照指定字段名进行排序,除了指定字 段名还可以指定字段的栏位进行排序,第一个查询字段为1,第二个为2,依次类推,所以可以利用order by就可以判断列数。
以字符型注入为例:
在列数存在时会正常回显
但是列数不存在时就会报错
这步就说明了为什么是联合注入了,用到了UNION,UNION的作用是将两个select查询结果合并
但是程序在展示数据的时候通常只会取结果集的第一行数据,这就让联合注入有了利用的点。
当我们查询的第一行是不存在的时候就会回显第二行给我们。
讲查询的数据置为-1,那第一行的数据为空,第二行自然就变为了第一行
在这个基础上进行注入
可以发现2,3都为可以利用的显示点。
和前面一样利用union select,加上group_concat()一次性显示。
现在非常多的Web程序没有正常的错误回显,这样就需要我们利用报错注入的方式来进行SQL注入了
报错注入的利用步骤和联合注入一致,只是利用函数不同。
以updatexml为例。
UpdateXML(xml_target, xpath_expr, new_xml)
xml_target: 需要操作的xml片段
xpath_expr: 需要更新的xml路径(Xpath格式)
new_xml: 更新后的内容
此函数用来更新选定XML片段的内容,将XML标记的给定片段的单个部分替换为 xml_target 新的XML片段 new_xml ,然后返回更改的XML。xml_target替换的部分 与xpath_expr 用户提供的XPath表达式匹配。
这个函数当xpath路径错误时就会报错,而且会将路径内容返回,这就能在报错内容中看到我们想要的内容。
而且以~开头的内容不是xml格式的语法,那就可以用concat函数拼接~使其报错,当然只要是不符合格式的都可以使其报错。
[极客大挑战 2019]HardSQL
登录界面尝试注入,测试后发现是单引号字符型注入,且对union和空格进行了过滤,不能用到联合注入,但是有错误信息回显,说明可以使用报错注入。
利用updatexml函数的报错原理进行注入在路径处利用concat函数拼接~和我们的注入语句
发现xpath错误并执行sql语句将错误返回。
在进行爆表这一步发现了等号也被过滤,但是可以用到like代替等号。
爆字段
爆数据
这里就出现了问题flag是不完整的,因为updatexml能查询字符串的最大长度为32,所以这里要用到left函数和right函数进行读取
报错注入有很多函数可以用不止updatexml一种,以下三种也是常用函数:
堆叠注入就是多条语句一同执行。
原理就是mysql_multi_query() 支持多条sql语句同时执行,用;分隔,成堆的执行sql语句。
比如
在权限足够的情况下甚至可以对数据库进行增删改查。但是堆叠注入的限制是很大的。但是与union联合执行不同的是它可以同时执行无数条语句而且是任何sql语句。而union执行的语句是有限的。
[强网杯 2019]随便注
判断完注入类型后尝试联合注入,发现select被过滤,且正则不区分大小写过滤。
那么就用堆叠注入,使用show就可以不用select了。
接下去获取表信息和字段信息
那一串数字十分可疑大概率flag就在里面,查看一下
这里的表名要加上反单引号,是数据库的引用符。
发现flag,但是没办法直接读取。再读取words,发现里面有个id字段,猜测数据库语句为
结合1'or 1=1#可以读取全部数据可以利用改名的方法把修改1919810931114514为words,flag修改为id,就可以把flag读取了。
最终payload:
盲注需要掌握的几个函数
在网页屏蔽了错误信息时就只能通过网页返回True或者False判断,本质上是一种暴力破解,这就是布尔盲注的利用点。
首先,判断注入点和注入类型是一样的。
但是盲注没有判断列数这一步和判断显示位这两步,这是和可回显注入的不同。
判断完注入类型后就要判断数据库的长度,这里就用到了length函数。
以[WUSTCTF2020]颜值成绩查询为例
输入参数后,发现url处有个get传入的stunum
然后用到length函数测试是否有注入点。
发现页面有明显变化
将传入变为
页面回显此学生不存在
那么就可以得出数据库名长度为3
测试发现过滤了空格
然后就是要查数据库名了,这里有两种方法
一、只用substr函数,直接对比
这种方法在写脚本时可以用于直接遍历。
二、加上ascii函数
这个payload在写脚本时直接遍历同样可以,也可用于二分法查找,二分法速度更快。
接下来的步骤就和联合注入一样,只不过使用substr函数一个一个截取字符逐个判断。但是这种盲注手工一个一个注十分麻烦所以要用到脚本。
直接遍历脚本
二分法脚本
时间盲注用于代码存在sql注入漏洞,然而页面既不会回显数据,也不会回显错误信息
语句执行后也不提示真假,我们不能通过页面的内容来判断
所以有布尔盲注就必有时间盲注,但有时间盲注不一定有布尔盲注
时间盲注主要是利用sleep函数让网页的响应时间不同从而实现注入。
sql-lab-less8:
无论输入什么都只会回显一个you are in...,这就是时间盲注的特点。
当正常输入?id=1时时间为11毫秒
判断为单引号字符型注入后,插入sleep语句
明显发现响应时间为3053毫秒。
利用时间的不同就可以利用脚本跑出数据库,后续步骤和布尔盲注一致。
爆库
爆表
爆字段
脚本
在进行SQL注入时,发现union,and,or被完全过滤掉了,就可以考虑使用异或注入
什么是异或呢
异或是一种逻辑运算,运算法则简言之就是:两个条件相同(同真或同假)即为假(0),两个条件不同即为真(1),null与任何条件做异或运算都为null,如果从数学的角度理解就是,空集与任何集合的交集都为空
即 1^1=0,0^0=0,1^0=1
利用这个原理可以在union,and,or都被过滤的情况下实现注入
[极客大挑战 2019]FinalSQL
给了五个选项但是都没什么用,在点击后都会在url处出现?id。
而且union,and,or都被过滤
测试发现?id=1^1会报错
但是?id=1^0会返回?id=1的页面,这就是前面说的原理,当1^0时是等于1的所以返回?id=1的页面。
根据原理写出payload,进而写出脚本。
爆库
爆表
爆字段
据此可以写出基于异或的布尔盲注脚本
实验推荐:课程:SQL注入初级(合天网安实验室)
Mysql 注入之 limit 注入
参考链接:
一般实际过程中使用 limit 时,大概有两种情况,一种使用 order by ,一种就是不使用 order by 关键字
执行语句
这种情况下的 limit 后面可以使用 union 进行联合查询注入
执行语句
执行语句
此时后面再次使用 union 将会报错
除了 union 就没有其他可以使用的了吗,非也
此方法适用于 5.0.0 MySQL 5.6.6 版本,在limit语句后面的注入
MySQL 5中的SELECT语法:
limit 关键字后面还可跟 PROCEDURE 和 INTO 两个关键字,但是 INTO 后面写入文件需要知道绝对路径以及写入shell的权限,因此利用比较难,因此这里以 PROCEDURE 为例进行注入
报错,尝试一下对其中一个参数进行注入,这里首先尝试报错注入
成功爆出 mysql 版本信息,证明如果存在报错回显的话,可以使用报错注入在 limit 后面进行注入
不存在回显怎么办,延迟注入呀
执行命令
如果 select version(); 第一个为5,则多次执行sha(1)达到延迟效果
这里使用 sleep 进行尝试,但均未成功,所以需要使用BENCHMARK进行替代
如何对网站进行SQL注入
首先你要了解什么是SQL注入漏洞,SQL注入漏洞就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。
简单来说,网站一般都是由web应用程序,数据库,服务器等组成的,网站的所有用户数据,密码表单等等都是保存在数据库当中的,数据库的内容按到常理来说是只能在服务器内部进行查询,当然,但是,开发人员对客户端用户向客户端提交的参数没有进行过滤,那么,黑客就可以从客户端【浏览器,等等,详细可以学习http协议】向服务器提交查询数据库的SQL语句,如果提交的语句成功的被服务器给接收到并且执行么,那么黑客岂不是想怎么查询数据库里面的内容就怎么查询,不是么?那些管理账号密码,会员数据不是分分钟就到手了?SQL注入漏洞危害是非常大的。
当然,这种漏洞是根据提交参数没过滤而产生的,那么除了浏览器的get提交参数,http协议中还有,post提交,cookie提交,等等。注入漏洞不是网上那些所谓的黑阔,用什么啊D,明小子之类的乱检测一气而找出来的,如果楼主想研究这个漏洞的产生,原理,利用和防御,是需要进行代码审计,SQL注入语句基础,等等。
现在一般常用的工具:SQLmap【这是一款神器,现在是公认最强大的开源注入工具】
建议楼主去看几本书:《SQL注入天书》《SQL注入漏洞的产生与防御》
这个漏洞的利用不是几句话就能说清楚的,详细的可以追问,纯手工打字,望楼主采纳。
什么是mysql注入
MySQL SQL 注入
SQL注入可能是目前互联网上存在的最丰富的编程缺陷。 这是未经授权的人可以访问各种关键和私人数据的漏洞。 SQL注入不是Web或数据库服务器中的缺陷,而是由于编程实践较差且缺乏经验而导致的。 它是从远程位置执行的最致命和最容易的攻击之一。
我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。
以下实例中,输入的用户名必须为字母、数字及下划线的组合,且用户名长度为 8 到 20 个字符之间:
让我们看下在没有过滤特殊字符时,出现的SQL情况:
以上的注入语句中,我们没有对 $name 的变量进行过滤,$name 中插入了我们不需要的SQL语句,将删除 users 表中的所有数据。
在PHP中的 mysqli_query() 是不允许执行多个 SQL 语句的,但是在 SQLite 和 PostgreSQL 是可以同时执行多条SQL语句的,所以我们对这些用户的数据需要进行严格的验证。
防止SQL注入,我们需要注意以下几个要点:
永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双”-“进行转换等。
永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
教程来源:树懒学堂_一站式数据知识学习平台_MySQK 防止SQL注入
分享名称:mysql漏洞怎么注入 sql注入漏洞是什么意思啊
网站URL:http://azwzsj.com/article/hjceie.html