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 .
  • 当前执行查询用户名为 [email protected] .

    同理我们再输入 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

时间: 2024-10-28 11:12:42

2017-2018-1 20179215《Linux内核原理与分析》第十二周作业的相关文章

20169217 《Linux内核原理与分析》 第十一周作业

首先更新一下第一次实验关于堆栈的分析,这里我直接手写拍的图片. 这里再补充一点,第5步的call f 实际上等于 pushl %eip,movl f %eip,也就是将f的eip地址压栈,call g原理相同.leave等于movl %ebp,%esp,popl %ebp 也就是将ebp出栈,epb指向自己所存储值的栈,再将ebp的值付给esp,实现栈的释放.   接下来是实验: 2014年9月24日,Bash中发现了一个严重漏洞shellshock,该漏洞可用于许多系统,并且既可以远程也可以在

2017-2018-1 20179209《Linux内核原理与分析》第八周作业

Linux内核如何装载和启动一个可执行程 一.实验 1.1理解编译链接的过程和ELF可执行文件格式. 1.1.1编译链接过程 能用图说明的问题,就少用文字描述: 1.1.2ELF可执行文件 ELF可执行文件中有三种主要的目标文件: 一个可重定位文件保存着代码和适当的数据,用来和其他的object文件一起创建一个可执行文件或者是一个共享文件.主要是.o文件. 一个可执行文件保存着一个用来执行的程勋:该文件指出了exec如何创建程序进程映像. 一个共享object文件保存着代码和合适地数据,用来被下

2017-2018-1 20179203 《Linux内核原理与分析》第八周作业

攥写人:李鹏举 学号:20179203 ( 原创作品转载请注明出处) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ) 一.实验要求: 1.理解编译链接的过程和ELF可执行文件格式,详细内容参考本周第一节: 2.编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接,编程练习动态链接库的这两种使用方式,详细内容参考本周第二节: 3.使用gdb跟踪分析一个

2017-2018-1 20179202《Linux内核原理与分析》第八周作业

一 .可执行程序的装载 1. 预处理.编译.链接 gcc –e –o hello.cpp hello.c //预处理 gcc -x cpp-output -S -o hello.s hello.cpp //编译 gcc -x assembler -c hello.s -o hello.o-m32 //汇编 gcc -o hello hello.o //链接成可执行文件,使用共享库 用gcc -o hello.static hello.o -static静态编译出来的hello.static把C库

20169217 《Linux内核原理与分析》 第八周作业

此次作业仍然分为两个部分,第一部分为实验. 实验要求: 1. 阅读理解task_struct数据结构.   2. 分析fork函数对应的内核处理过程sys_clone,理解创建一个新进程如何创建和修改task_struct数据结构.   3.使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone ,验证对Linux系统创建一个新进程的理解. 实验内容: 1.理解task_struct数据结构. 操作系统内核里面有操作系统所谓的三大功能,就是进程管理,内存管理和文件系统.但这里面最核

20169217 《Linux内核原理与分析》第七周作业

首先完善一下上周的作业,上周的嵌入式汇编并没有编译成功,究其原因,还是我对传参理解不到位,write函数的3个参数都要传递才行,并不是只传谣打印的字符串就行. 在老师的指导下并且参考了毛卫华同学的代码之后,终于编译成功啦! #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> int main() { char* msg = "liuhongyi

20179209《Linux内核原理与分析》第十一周作业

Nmap配合Metasploit进行端口扫描 1.Nmap扫描器基本使用 1.1简介 Nmap(Network Mapper)最早是Linux下的网络扫描嗅探器.其基本功能有三个: 探测一组主机是否在线: 扫描主机端口,嗅探其所提供的网络服务: 推断主机所用的操作系统 . 1.2基本命令 探测某个网段中活跃的主机的命令有: 进行ping扫描,打印出对扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测):nmap -sP 192.168.1.0/24 仅列出指定网络上的每台主机,不发送

2017-2018-1 20179202《Linux内核原理与分析》第十一周作业

Metasploit实现木马生成.捆绑.免杀 1.预备知识 (1)Metasploit Metasploit是一款开源的安全漏洞检测工具,全称叫做The Metasploit Framework,简称MSF.MSF是一个漏洞框架,它允许使用者开发自己的漏洞脚本,从而进行测试.下图为Metasploit的体系结构: ??????????图片来源玩转Metasploit系列(第一集) 基础库文件: Rex:Metasploit中的基础库,用于支持不同的协议.转换,以及套接字处理 MSF CORE:该

2017-2018-1 20179219《Linux内核原理与设计》第七周作业

一.实验操作 使用GDB跟踪创建新进程的过程 首先删除menu文件夹后从github重新克隆一个新的menu,用test_fork.c取代test.c 编译后启动menuos,发现刚刚添加的命令fork已经能够使用了 接下来进行调试 设置断点: b sys_clone     b do_fork b dup_task_struct b copy_process b copy_thread b ret_from_fork fork显示结果如下: 二.学习笔记 1. //fork一个子进程的代码 #

2017-2018-1 20179219《Linux内核原理与设计》第六周作业

一.学习笔记 当在代码中出现如下指令: int $0x80 系统马上就会调到system call这个位置,下条指令从此开始 ENTRY(system_call) RING0_INT_FRAME # can't unwind into user space anyway ASM_CLAC pushl_cfi %eax # save orig_eax SAVE_ALL #保护现场 GET_THREAD_INFO(%ebp) # system call tracing in operation /