2017-2018-1 20179215《Linux内核原理与分析》第十二周作业
Sql注入基础原理介绍
分组:和20179205王雅哲共同完成实验
一、实验说明
1.1 sql注入
SQL注入攻击通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作。
SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
●SQL注入威胁表现形式可以体现为以下几点:
●绕过认证,获得非法权限
●猜解后台数据库全部的信息
●注入可以借助数据库的存储过程进行提权等操作
●SQL注入攻击的典型手段:
●判断应用程序是否存在注入漏洞
●收集信息、并判断数据库类型
●根据注入参数类型,重构SQL语句的原貌
●猜解表名、字段名
●获取账户信息、攻击web或为下一步攻击做准备
1.2 web程序三层架构
三层架构(3-tier architecture) 通常意义上就是将整个业务应用划分为:
界面层(User Interface layer)
业务逻辑层(Business Logic Layer)
数据访问层(Data access layer)。
区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构被应用于众多类型的软件开发。由数据库驱动的Web应用程序依从三层架构的思想也分为了三层:
表示层。
业务逻辑层(又称领域层)
数据访问层(又称存储层)
拓扑结构如下图所示:

当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。这种网站内部直接发送的Sql请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 Sql 语句,如果用户输入的数据被构造成恶意 Sql 代码,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查,则会带来意想不到的危险。
二、实验过程
本实验将通过 LAMP 搭建 Sql 注入环境,两个实验分别介绍 Sql 注入爆破数据库、Sql 注入绕过验证两个知识点。
1、Sql 注入示例一.猜解数据库
(1)如下图所示,先下载文件并解压运行:

(2)进入 Firefox 浏览器,输入网址 : localhost/dvwasql , 点击create/Reset Database创建数据库:

(3)进入登录界面,默认用户名为:admin 密码为:password

(4)将 Security 级别调整为 low

(5)进入 SQL injection页面开始注入:

(6)先输入 1 ,查看回显 (URL中ID=1,说明php页面通过get方法传递参数):

(7)那实际上后台执行了什么样的Sql语句呢?点击 view source查看源代码 :

可以看到,实际执行的Sql语句是:
SELECT first_name, last_name FROM users WHERE user_id = '1';
我们是通过控制参数Id的值来返回我们需要的信息。如果我们不按常理出牌,比如在输入框中输入 1' order by 1#,实际执行的Sql语句就会变成:
SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1#`;(按照Mysql语法,#后面会被注释掉,使用这种方法屏蔽掉后面的单引号,避免语法错误)
这条语句的意思是查询users表中user_id为1的数据并按第一字段排行。
(8)输入 1' order by 1#和 1' order by 2#时都返回正常,当输入 1' order by 3#时,返回错误:



由此可知,users表中只有两个字段,数据为两列。
接下来我们使用 union select联合查询继续获取信息。union 运算符可以将两个或两个以上 select 语句的查询结果集合合并成一个结果集合显示,即执行联合查询。需要注意在使用 union 查询的时候需要和主查询的列数相同,而我们之前已经知道了主查询列数为 2,接下来就好办了。输入1' union select database(),user()#进行查询 :
database()将会返回当前网站所使用的数据库名字.
user()将会返回执行当前查询的用户名.
实际执行的Sql语句是 :
SELECT first_name, last_name FROM users WHERE user_id = '1' union select database(),user()#`;

通过上图返回信息,我们成功获取到:
当前网站使用数据库为 dvwa .
当前执行查询用户名为 root@localhost .
同理我们再输入 1' union select version(),@@version_compile_os#进行查询:
version() 获取当前数据库版本.
@@version_compile_os 获取当前操作系统。
实际执行的Sql语句是:
SELECT first_name, last_name FROM users WHERE user_id = '1' union select version(),@@version_compile_os#`;

(9)接下来我们尝试获取 dvwa 数据库中的表名。

由经验我们可以大胆猜测users表的字段为 user 和 password ,所以输入:1' union select user,password from users#进行查询:

2、Sql 注入实例二.验证绕过
(1)如下图所示,先下载文件并解压运行:

(2)进入 Firefox 浏览器,输入网址 : localhost/sql2 , 按照顺序,初始化数据:




(3)准备工作完成之后,我们进入首页发现这是一个普通的登录页面,只要输入正确的用户名和密码就能登录成功。我们先尝试随意输入用户名 123 和密码 123 登录,发现提示错误。
(4)按照第一个实验的思路,我们尝试在用户名中输入 123' or 1=1 #, 密码同样输入 123' or 1=1 # :


为什么能够成功登陆呢?因为实际执行的语句是:
select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'
按照 Mysql 语法,# 后面的内容会被忽略,所以以上语句等同于(实际上密码框里不输入任何东西也一样):
select * from users where username='123' or 1=1
由于判断语句 or 1=1 恒成立,所以结果当然返回真,成功登录。
(5)再尝试不使用 # 屏蔽单引号,采用手动闭合的方式:我们尝试在用户名中输入 123' or '1'='1, 密码同样输入 123' or '1'='1 (不能少了单引号,否则会有语法错误):


实际执行的 Sql 语句是:
select * from users where username='123' or '1'='1' and password='123' or '1'='1`
两个 or 语句使 and 前后两个判断永远恒等于真,所以能够成功登录。
总结
一般来说,SQL注入一般存在于形如HTTP://xxx.xxx.xxx/abc.asp?id=XX等带有参数的ASP动态网页中,有时一个动态网页中可能只有一个参数,有时可能又N个参数,有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。如果ASP程序员没有安全意识,不进行必要的字符过滤,存在SQL注入的可能性就非常大。至于如何防范SQL注入攻击:请参考http://blog.csdn.net/testeralai/article/details/26478469
2017-2018-1 20179215《Linux内核原理与分析》第十二周作业的更多相关文章
- 2018-2019-1 20189221 《Linux内核原理与分析》第八周作业
2018-2019-1 20189221 <Linux内核原理与分析>第八周作业 实验七 编译链接过程 gcc –e –o hello.cpp hello.c / gcc -x cpp-o ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第七周作业
2018-2019-1 20189221 <Linux内核原理与分析>第七周作业 实验六 分析Linux内核创建一个新进程的过程 代码分析 task_struct: struct task ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第六周作业
2018-2019-1 20189221 <Linux内核原理与分析>第六周作业 实验五 实验过程 将Fork函数移植到Linux的MenuOS fork()函数通过系统调用创建一个与原来 ...
- 2018-2019-1 20189221《Linux内核原理与分析》第五周作业
2018-2019-1 20189221<Linux内核原理与分析>第五周作业 实验四 实验过程 当用户态进程调用一个系统调用时,cpu切换到内核态并开始执行一个内核函数. 在Linux中 ...
- 2018-2019-1 20189221《Linux内核原理与分析》第三周作业
2018-2019-1 20189221<Linux内核原理与分析>第三周作业 实验二 完成一个简单的时间片轮转多道程序内核代码 实验过程 在实验楼中编译内核 编写mymain.c函数和m ...
- 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业
<Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第十一周作业
<Linux内核原理与分析>第十一周作业 一.本周内容概述: 学习linux安全防护方面的知识 完成实验楼上的<ShellShock 攻击实验> 二.本周学习内容: 1.学习& ...
- 2019-2020-1 20199329《Linux内核原理与分析》第八周作业
<Linux内核原理与分析>第八周作业 一.本周内容概述: 理解编译链接的过程和ELF可执行文件格式 编程练习动态链接库的两种使用方式 使用gdb跟踪分析一个execve系统调用内核处理函 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第七周作业
<Linux内核原理与分析>第七周作业 一.本周内容概述: 对Linux系统如何创建一个新进程进行追踪 分析Linux内核创建一个新进程的过程 二.本周学习内容: 1.学习进程的描述 操作 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第六周作业
<Linux内核原理与分析>第六周作业 一.本周内容概述: 学习系统调用的相关理论知识,并使用库函数API和C代码中嵌入汇编代码两种方式使用getpid()系统调用 学习系统调用syste ...
随机推荐
- SpringMVC:学习笔记(3)——REST
SpringMVC:学习笔记(3)——REST 了解REST风格 按照传统的开发方式,我们在实现CURD操作时,会写多个映射路径,比如对一本书的操作,我们会写多个URL,可能如下 web/delete ...
- 《Effective MySQL之SQL语句最优化》读书笔记——乱七八糟系列(给自己看)
该书区别于诸如<MySQL技术内幕——InnoDB存储引擎>等书的一大特色是该书主要讲的是MySQL数据库中的索引技术,并分别讲了InnoDB.MyISAM.Memory三个存储引擎.其中 ...
- grads 读取shp
自从GrADS2.0.a8版本开始,GrADS引入了对shp图形的支持,关于此格式在这里不多说, 于是今晚就简单测试了一下最简单画图和查询命令(后续还将测试输出shp图形的命令) 测试数据采用的 ...
- 1000M链路的理论值计算
1000M约等于(1秒/(1纳秒))/ (1024*1024) ============================================================== 1.什么是 ...
- 浅谈CDN技术的性能与优势
从淘宝架构中的CDN入手分析 使用CDN和反向代理提高网站性能.由于淘宝的服务器不能分布在国内的每个地方,所以不同地区的用户访问需要通过互联路由器经过不同长度的路径来访问服务器,返回路径也一样,所以数 ...
- IOS 发布被拒 PLA 1.2问题 整个过程介绍 03 个人账户升级公司账户
根据上一篇文章,提交的邮件,苹果给我回了一封邮件 如下: 您好: 感谢您参与 Apple 开发者计划支持.我是 XXXX,非常荣幸协助您. 我们随时都可以开始将您的个人会员资格迁移到组织会员资格.首先 ...
- python使用笔记
修改文件模板,支持中文. File -> Settings -> Editor -> File and Code templates -> python Scropt 在里面加 ...
- Qt qobject_cast用法 向下转型
函数原型: T qobject_cast ( QObject * object ) 本方法返回object向下的转型T,如果转型不成功则返回0,如果传入的object本身就是0则返回0. 在使用时有两 ...
- 安装rackspace private cloud --5 Deployment configuration
运行Ansible playbooks之前,需要配置taget host Prerequisites . cp -r /opt/openstack-ansible/etc/openstack_depl ...
- 实时监测contenteditable(可编辑文档)的内容发生改变
如果是文本框用onchange,oninput,onpropertychange都可以实时监控值发生变化,但是div设置了属性contenteditable(可编辑文档)就不管用了. 最简单的方法用o ...