Sqlmap入门

Sqlmap入门

参考:

https://github.com/sqlmapproject/sqlmap/wiki/Usage

https://www.kanxue.com/book-6-110.htm

原理

在owasp发布的top10 漏洞里面,注入漏洞一直是危害排名第一,其中数据库注入漏洞是危害的。

当攻击者发送的sql语句被sql解释器执行,通过执行这些恶意语句欺骗数据库执行,导致数据库信息泄漏

分类

按注入类型

常见的sql注入按照参数类型可分为两种:数字型和字符型

当发送注入点的参数为整数时,比如ID,num,page等,这种形式的就属于数字型注入漏洞。同样,当注入点是字符串时,则称为字符型注入,字符型注入需要引号来闭合

按返回结果

  • 回显注入:可以直接在存在注入点的当前页面中获取返回结果。

  • 报错注入:程序将数据库的返回错误信息结果直接显示在页面中,虽然没有返回数据库查询的结果,但是可以构造一些报错语句从错误信息中获取想要的结果。

  • 盲注:程序后端屏蔽了数据库的错误信息,没有直接显示结果也没有显示数据库报错信息,只能通过数据库的逻辑和延时函数来判断注入的结果。根据表现形式的不同,盲注又分为based boolean(返回结果只有对与错) 和 based time(由返回结果的时间判断) 两种

    select IF(ASCII(SUBSTR(DATABASE(),1,1))>97, 1, SLEEP(3))
    

按注入位置与方式

按照注入位置及方式可分为:post注入,get注入,cookie注入,盲注,延时注入,搜索注入,base64注入,无论分类如何,都可以归纳为以上两种形式

使用Mybatis的预先编译即可很好的预防sql注入

Sqlmap概述

--wizard Simple wizard interface for beginner users

-- sqlmap-shell Prompt for an interactive sqlmap shell

使用--sqlmap-shell无需每次输入sqlmap

概述

  • 支持六种sql注入

    • boolean-base blind:基于布尔的盲注,即可以根据返回页面判断条件真假的注入

    • time-base blind:基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断

      select IF(ASCII(SUBSTR(DATABASE(),1,1))>97, 1, SLEEP(3))
      

      如果库名的第一个字母大于a,返回1否则sleep 3 sec

    • error-based:基于报错注入,即页面会返回错误信息,或则把注入的语句的结果直接返回在页面种

    • UNION query-based:联合查询注入,可以使用union的情况下的注入;

    • stacked queries and out-of-band:堆查询注入,可以同时执行多条语句的执行时的注入。

Options

  • -h, --help Show basic help message and exit

    显示基本的帮助命令

  • -hh Show advanced help message and exit

    显示高级的帮助命令

  • --version Show program's version number and exit

    显示sqlmap version

  • -v VERBOSE Verbosity level: 0-6 (default 1)

    以verbose的形式输出结果

    • 0: Show only Python tracebacks, error and critical messages.
    • 1: Show also information and warning messages.
    • 2: Show also debug messages.
    • 3: Show also payloads injected.
    • 4: Show also HTTP requests.
    • 5: Show also HTTP responses' headers.
    • 6: Show also HTTP responses' page content.
sqlmap -d "mysql://root:12345@192.168.80.129:3306/mysql" -v3

Target

必须要指定一个target

  • -d DIRECT Connection string for direct database connection

    与数据库直连,需要该数据库的账户和密码,以及数据库的远程访问权限

    Pattern:

    sqlmap -d DBMS://username:passwd@DBMS_HOST:PORT/database

    Example:

    sqlmap -d "mysql://root:12345@192.168.80.129:3306/mysql"
    
  • -u URL, --url=URL Target URL (e.g. "http://www.site.com/vuln.php?id=1")

    与URL连接,如果以默认的80端口或是443对外开放web服务无需添加端口

  • -l LOGFILE Parse target(s) from Burp or WebScarab proxy log file

    使用burpsuite的request log 做为参数, 需要在burp中设置记录日志

    sqlmap -l filename
    
  • -m BULKFILE Scan multiple targets given in a textual file

    使用文本文件, 我们有文件url.txt 内容如下

      www.target1.com/vuln1.php?q=foobar
      www.target2.com/vuln2.asp?id=1
      www.target3.com/vuln3/id/1*
    

    然后可用使用如下命令让Sqlmap测试这些URL是否存在注入漏洞:

    sqlmap -m  url.txt
    
  • -r REQUESTFILE Load HTTP request from a file

    可以将一个HTTP请求保存在文件中,然后使用参数“-r”加载该文件,Sqlmap会解析该文件,从该文件分析目标并进行测试。

    设有如下所示的HTTP请求保存在文件get.txt中:

      GET /user.php?id=1 HTTP/1.1
      Host: 192.168.56.101:8080
      User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
      Accept-Language: zh-SG,en-US;q=0.7,en;q=0.3
      Accept-Encoding: gzip, deflate
      DNT: 1
      Connection: close
      Upgrade-Insecure-Requests: 1123456789
    

    则使用如下命令让Sqlmap解析该文件,以该文件中HTTP请求目标为攻击目标进行测试:

      python sqlmap.py -r get.txt
    
  • -g GOOGLEDORK Process Google dork results as target URLs

    使用谷歌特殊查询做为参数

    sqlmap -g "inurl:.php?id=1
    
  • -c CONFIGFILE Load options from a configuration INI file

    使用INI配置文件做为参数

Request

决定怎么连接target

  • --method=METHOD Force usage of given HTTP method (e.g. PUT)

    一般来说,Sqlmap能自动判断出是使用GET方法还是POST方法,但在某些情况下需要的可能是PUT等很少见的方法

    sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli_blind/?id=1" --method=put
    
  • --data=DATA Data string to be sent through POST (e.g. "id=1")

    做为post的参数,当有多个参数时,使用&拼接。

    这里我们先用burpsuite拦截请求,查看post的参数

由此发现参数分别是uname,passwd,submit

sqlmap -u "http://192.168.80.129/sqli/Less-11/" --data="uname=123&passwd=123&submit=Submit" 

通过sqlmap获取到注入的sql,通过burp可以校验

  • --param-del=PARA.. Character used for splitting parameter values (e.g. &)

    通过--param-del=";"来指定delimeter

    sqlmap -u "http://localhost/dvwa/vulnerabilities/brute/" --data="username=admin;password=password" --param-del=";"
    

http-headers

sqlmap如果请求需要cookie, sqlmap需要手动设置cookie值。

指定--level >=2 检测cookie是否有sql注入

  • --cookie=COOKIE HTTP Cookie header value (e.g. "PHPSESSID=a8d127e..")

    当检测需要使用cookie时,使用--cookie。默认使用分号分隔,可以通过--cookie-del来指定分隔符

    sqlmap -u "http://192.168.80.129/dvwa/vulnerabilities/sqli_blind/#" --data="id=2&Submit=Submit" --cookie="security=medium; PHPSESSID=psraicopdtede7ok52erpr08bo"
    
  • --load-cookies=L.. File containing cookies in Netscape/wget format

    从文件中载入Netscape或wget格式的cookie

  • --drop-set-cookie Ignore Set-Cookie header from response

    将响应体中的cookie丢弃

指定--level >=3 检测user-agent是否有sql注入

  • --user-agent=AGENT HTTP User-Agent header value

    设置请求头中user-agent。默认使用 sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)做为User-Agent

  • --random-agent Use randomly selected HTTP User-Agent header value

    从usr/share/sqlmap/data/txt/user-agents.txt中随机取出一个User-Agent。注意,在一次会话中只是用同一个User-Agent,并不是每发一个HTTP请求包,都随机一个User-Agent。起到反检测的作用

    sqlmap -u "http://192.168.80.129/dvwa/vulnerabilities/sqli_blind/#" --data="id=2&Submit=Submit" --drop-set-cookie --random-agent
    

    使用了user-agent

    未使用user-agent

指定--level >= 5 检测host是否存在sql注入

  • --host=HOST HTTP Host header value

    指定请求头中的HOST

指定--level>=3 检测referer是否存在sql注入

  • --referer=REFERER HTTP Referer header value

    指定请求头中referer,用来伪造请求参数

  • -H HEADER, --hea.. Extra header (e.g. "X-Forwarded-For: 127.0.0.1")

    指定额外单一的请求头,如token

    --headers=HEADERS Extra headers (e.g. "Accept-Language: fr\nETag: 123")

    指定多个请求头,需要使用\n换行

    sqlmap -u "http://192.168.80.129/sqli/Less-3/?id=1" --banner -headers="token:123\n config:abc"
    

  • --auth-type=AUTH.. HTTP authentication type (Basic, Digest, NTLM or PKI)

    指定认证的方式

  • --auth-cred=AUTH.. HTTP authentication credentials (name:password)

    指定认证的用户名和密码

proxy

  • --proxy=PROXY Use a proxy to connect to the target URL

    指定代理,用于隐藏真实IP

    sqlmap -u "http://192.168.80.129/sqli/Less-3/?id=1" --proxy="http://192.168.80.1:80"
    
  • --proxy-file=PRO.. Load proxy list from a file

    使用文件中的代理

  • --tor Use Tor anonymity network

    使用tor匿名网络

  • --tor-type=TORTYPE Set Tor proxy type (HTTP, SOCKS4 or SOCKS5 (default))

    指定代理的模式,默认使用SOCKS5

action

  • --ignore-code=IG.. Ignore (problematic) HTTP error code (e.g. 401)

    忽略对指定status code的响应

    sqlmap -u "http://192.168.80.129/sqli/Less-3/?id=1"  --ignore-code=401
    
    
  • --delay=DELAY Delay in seconds between each HTTP request

    设置每次请求之间的间隔,可以有效躲避检测

    sqlmap -u "http://192.168.80.129/sqli/Less-3/?id=1" --delay=1
    
    
  • --timeout=TIMEOUT Seconds to wait before timeout connection (default 30)

    设置连接的超时时间

  • --retries=RETRIES Retries when the connection timeouts (default 3)

    设置重试次数

  • --randomize=RPARAM Randomly change value for given parameter(s)

    随机生成HTTP请求中的参数,这里表示随机生成id,可以避免触发安全机制

    sqlmap -u http://192.168.80.129/sqli/Less-3/?id=1 --randomize=id
    
  • --safe-url=SAFEURL URL address to visit frequently during testing

    --safe-post=SAFE.. POST data to send to a safe URL

    --safe-req=SAFER.. Load safe HTTP request from a file

    --safe-freq=SAFE.. Test requests between two visits to a given safe URL

    有时服务器检测到某个客户端错误请求过多会对其进行屏蔽,而Sqlmap的测试往往会产生大量的错误请求,为避免被屏蔽,可以是不是产生几个正常的请求以迷惑服务器。这里所谓的安全URL是指访问会返回200、没有任何报错的URL。相应地,Sqlmap也不会对安全URL进行任何注入测试。

  • --force-ssl Force usage of SSL/HTTPS

    强制使用SSL通道

Optimization

These options can be used to optimize the performance of sqlmap

可以加快sqlmap的探测速度

  • -o Turn on all optimization switches

    使用所有的加快探测速度的手段

  • --keep-alive Use persistent HTTP(s) connections

    设置连接为长连接,默认使用Close,连接一次就会关闭

  • --threads=THREADS Max number of concurrent HTTP(s) requests (default 1)

    设定并发的线程

  • --predict-output Predict common queries output

    预测输出,与--thread不兼容

  • --null-connection Retrieve page length without actual HTTP response body

    返回Content-length,不接收ResponseBody

Injection

These options can be used to specify which parameters to test for, provide custom injection payloads and optional tampering scripts

用于指定检测的参数, 客制化payload

  • -p TESTPARAMETER Testable parameter(s)

    指定需要探测的参数或是报文头,当有多个参数时使用逗号分隔

    sqlmap -u "http://192.168.80.129/sqli/Less-1/?id=1&name=chz&pwd=123" -p "id,pwd" -o  --current-db
    

    同样也可以指定user-agent

    sqlmap -u "http://192.168.80.129/sqli/Less-1/?id=1&name=chz&pwd=123" -p user-agent -o  --current-db
    
  • --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")

    使用正则排除

    sqlmap -u http://192.168.80.129/sqli/Less-1/?id"=1&name=chz&pwd=123" --param-exclude="Cache.*" -o
    
  • --dbms=DBMS Force back-end DBMS to provided value

    指定DBMS,如Oracle,MySQL。会自动识别

    sqlmap -u http://192.168.80.129/sqli/Less-1/?id"=1&name=chz&pwd=123"  -o --dbms="MySQL"
    
  • --os=OS Force back-end DBMS operating system to provided value

    指定操作系统,如windows,linux。会自动识别

  • --invalid-bignum Use big numbers for invalidating values

    --invalid-logical Use logical operations for invalidating values

    --invalid-string Use random strings for invalidating values

    用大的数据做为注入的无效参数

    在sqlmap需要使原始参数值无效(例如id=12)时,它使用经典的否定(例如id=-13)。有了这个开关,就可以强制使用指定的来替换该错误参数

  • --prefix=PREFIX Injection payload prefix string
    --suffix=SUFFIX Injection payload suffix string

    使用指定的前后缀来修饰payload

  • --no-escape Turn off string escaping mechanism

    有时Sqlmap会使用用单引号括起来的字符串值作为payload,如“SELECT ‘foobar’”,默认地这些值会被编码,如上例将被编码为:
    “SELECT CHAR(102)+CHAR(111)+CHAR(111)+CHAR(98)+CHAR(97)+CHAR(114))”。这样做既可以混淆视听让人一时难以洞察payload的内容又可以在后台服务器使用类似magic_quote或mysql_real_escape_string这样的转义函数的情况下字符串不受影响。当然在某些情况下需要关闭字符串编码,如为了缩减payload长度,用户可以使用“–no-escape”来关闭字符串编码。

  • --tamper=TAMPER Use given script(s) for tampering injection data

    除了用CHAR()编码字符串外Sqlmap没有对payload进行任何混淆。
    该参数用于对payload进行混淆以绕过IPS或WAF。
    该参数后跟一个tamper脚本的名字。若该tamper脚本位于sqlmap的安装目录的tamper/目录中,就可以省略路径和后缀名,只写文件名。
    多个tamper脚本之间用空格隔开。

    sqlmap -u http://192.168.80.129/sqli/Less-1/?id"=1&name=chz&pwd=123"  --tamper=space2comment.py
    

Detection

These options can be used to customize the detection phase

  • --level=LEVEL Level of tests to perform (1-5, default 1)

    设置探测等级

    GET and POST parameters are always tested, HTTP Cookie header values are tested from level 2 and HTTP User-Agent/Referer headers' value is tested from level 3.

  • --risk=RISK Risk of tests to perform (1-3, default 1)

    设置风险等级

Techniques

These options can be used to tweak testing of specific SQL injection techniques

  • --technique=TECH SQL injection techniques to use (default "BEUSTQ")

    指定使用什么类型的SQL注入来探测,默认使用所有

    1. B: Boolean-based blind
    2. E: Error-based
    3. U: Union query-based
    4. S: Stacked queries
    5. T: Time-based blind
    6. Q: Inline queries
    sqlmap -u "http://192.168.80.129/sqli/Less-1/?id=1" --technique=ES
    
  • --time-sec=TIMESEC Seconds to delay the DBMS response (default 5)

    指定基于时间的盲注的sleep时间

Fingerprint

  • -f, --fingerprint Perform an extensive DBMS version fingerprint

    获取DBMS的版本信息

Enumeration

These options can be used to enumerate the back-end database management system information, structure and data contained in the tables. Moreover you can run your own SQL statements.

额外条件-D-T-C--start--stop

枚举数据库中信息

  • -a, --all Retrieve everything

    同时还可以获取账户密码的Hash ,也包括解码一些常见的明文密码

  • -b, --banner Retrieve DBMS banner

    获取数据库的bann信息

  • --current-user Retrieve DBMS current user

    获取数据库当前的用户

  • --hostname Retrieve DBMS server hostname

    获取主机名

  • --users Enumerate DBMS users

    获取所有用户名

  • --privileges Enumerate DBMS users privileges

    获取用户权限,使用-U指定用户

  • --passwords Enumerate DBMS users password hashes

    获取密码哈希值以及解密,使用-U指定用户

    sqlmap -u "http://192.168.80.129/sqli/Less-1/?id=1" -o --password -U root
    

    可以使用如下格式尝试登入数据库,需要远程登入授权才能登入

    mysql -h 192.168.80.129 -u root -p
    
  • --dbs Enumerate DBMS databases

    获取所有的数据库

  • --tables Enumerate DBMS database tables

    如果没有指定 -D枚举所有数据库中所有表。使用--exclude-sysdbs来排除系统的表

  • --columns Enumerate DBMS database table columns

    通过-D指定DB,如果没有指定DB就使用当前探测的数据库;使用-T指定table,如果没有指定查询所有table的字段以及类型;使用-C指定查询某一列

    sqlmap -u "http://192.168.80.129/sqli/Less-1/?id=1" -o --columns -D mysql
    
  • --schema Enumerate DBMS schema

    列出所有的数据库,表名,字段名,字段类型。使用--exclude-sysdbs排除系统数据库

  • --dump Dump DBMS database table entries

    获取表中的详细信息,并存储到本地

    sqlmap -u "http://192.168.80.129/sqli/Less-1/?id=1" --dump -D security -T users 
    

    !

    可以使用-D-T-C; 还可以使用--start--stop查询指定行数, 起到分页查询的功能

    sqlmap -u "http://192.168.80.129/sqli/Less-1/?id=1" --dump -D security -T users --start 1 --stop 2
    
  • --dump-all Dump all DBMS databases tables entries

    一次性存储所有数据库中的所有表,可以和--exclude-sysdbs一起使用

  • --search Search column(s), table(s) and/or database name(s)

    所属指定的库名,表名,列名,可以采用模糊匹配。需要配合-D,-T-C一起使用

    sqlmap -u "http://192.168.80.129/sqli/Less-1/?id=1" --search -D security -C "pass,name"
    

    多个参数时使用逗号隔开

  • --sql-shell Prompt for an interactive SQL shell

    以shell的格式,连接当前被探测的数据库,可以使用MySQL语法

Brute force

  • --common-tables Check existence of common tables

    如果--tables不能获取信息,需要采用该命令。通常由于以下几点造成

    • The database management system is MySQL < 5.0 where information_schema is not available.
    • The database management system is Microsoft Access and system table MSysObjects is not readable - default setting.
    • The session user does not have read privileges against the system table storing the scheme of the databases.
  • --common-columns Check existence of common columns

    as mentioned before

File system access

These options can be used to access the back-end database management system underlying file system

读取后端目标及中的文件

  • --file-read=FILE.. Read a file from the back-end DBMS file system

  • --file-write=FIL.. Write a local file on the back-end DBMS file system

    --file-dest=FILE.. Back-end DBMS absolute filepath to write to

Operating system access

Windows registry access

General

These options can be used to set some general working parameters

设置通用参数

sqlmap第一次查询target时,会将结果缓存到session文件中,后面再次查询时就直接从session文件中获取结果

  • -s SESSIONFILE Load session from a stored (.sqlite) file

    加载一个SESSIONFILE,文件通常存储在~/.local/share/sqlmap/output/192.168.80.129

    qlmap -u "http://192.168.80.129/sqli/Less-1/?id=1" -s ~/.local/share/sqlmap/output/192.168.80.129/session.sqlite 
    

    能跳过检测,直接给出检测结果。

  • -t TRAFFICFILE Log all HTTP traffic into a textual file

    把所有的HTTP(s)流量存入日志中,主要用于调试目的

    sqlmap -u "http://192.168.80.129/sqli/Less-1/?id=1" -t /root/Desktop/target.txt
    
  • --batch Never ask for user input, use the default behavior

    使用默认做为选项

  • --charset=CHARSET Blind SQL injection charset (e.g. "0123456789abcdef")

    使用指定的字符集

    sqlmap -u "http://192.168.80.129/sqli/Less-1/?id=1" --charset="123456789qazwsxedcrfv"
    
  • --crawl=CRAWLDEPTH Crawl the website starting from the target URL

    爬取指定url所有的子url, 并对他们进行sql注入检测

    sqlmap -u "http://192.168.80.129/sqli" --crawl=3 --batch 
    

    由于访问所有url,就不需要通过url指定注入点

  • --forms Parse and test forms on target URL

    检查请求是否以表单提交,并检测sql注入

    sqlmap -u "http://192.168.80.129/sqli/Less-11?id=12" --forms
    
  • --eta Display for each output the estimated time of arrival

    用于输出展示,数据库内容的进度条

    sqlmap -u "http://192.168.80.129/sqli/Less-1?id=12" -D security -T users --dump --fresh-queries --batch --eta
    
  • --flush-session Flush session files for current target

    无视session文件的结果,重新进行检测注入点

  • --fresh-queries Ignore query results stored in session file

    无视session文件的结果,重新检查数据库

  • --parse-errors Parse and display DBMS error messages from responses

    显示插入payload时,数据库中返回的错误信息

  • --save=SAVECONFIG Save options to a configuration INI file

    将当前执行的命令存储成配置文件,下次可以通过-c参数来调用

    sqlmap -u "http://192.168.80.129/sqli/Less-2/?id=1" --save="/root/Desktop/temp.txt"
    sqlmap -c "root/Desktop/temp.txt"
    
  • --har=HARFILE Log all HTTP traffic into a HAR file

    将所有的请求和响应存储成json格式

    sqlmap -u "http://192.168.80.129/sqli/Less-2/?id=1" --har="/root/Desktop/temp.har"
    

Miscellaneous

杂项

  • --cleanup Clean up the DBMS from sqlmap specific UDF and table

    清除sqlmap入侵后端后留下临时表或udf,强烈推荐

  • --list-tampers Display list of available tamper scripts

    列出所有的tamper脚本

    sqlmap --list-tampers
    
  • --mobile Imitate smartphone through HTTP User-Agent header

    模仿手机的HTTP user-agent

  • --identify-waf Make a thorough testing for a WAF/IPS protection

    检测数据库服务器有无使用WAF

  • --skip-waf Skip heuristic detection of WAF/IPS protection

    绕过waf

    sqlmap -u "http://192.168.80.129/sqli/Less-7/?id=1" --skip-waf
    
posted @ 2020-09-15 00:16  CyberPelican  阅读(430)  评论(0编辑  收藏  举报