About Sqlmap
About Sqlmap Security
0x01 前言
关于sqlmap,其实早就想写下总结个这哥是我接触安全认识的第一个神器,非常之叼。sqlmap是十分著名的自动化的SQL注入工具,他是开源的,由python写成,支持py2.X版本。这个神器支持N多种数据库,我就不一一赘述了,感兴趣的可以自己去查,我主要记录下它的命令以及语法。
下载方式:当然是github了。
git clone https://github.com/sqlmapproject/sqlmap.git
升级:
sqlmap --update
0x02 参数&例子
–help 查看帮助手册
python sqlmap.py --help
–version 查看sqlmap的版本信息
python sqlmap.py --version
-v 显示详细的等级,其实分为七个等级,从0到7,默认是1
python sqlmap.py -u "http://127.0.0.1/test.php?id=1" --dbs -v 1
-d sqlmap可以直接连接数据库,当作数据库客户端使用(我没有连接成功,好像需要改配置)
python sqlmap.py mysql://username:password@host:port/数据库
-u 后面跟url地址,最好加上双引号,然后一定要有参数存在,这个通常用于get注入
python sqlmap.py -u "http://127.0.0.1/test.php?id=1" --dbs
-l logfile,可以把Burp或者WEBScarab代理记录的log日志文件提交上来,sqlmap可以一个一个检测是否存在注入
-m 将有多个URL的文件提交上来进行扫描
python sqlmap.py -m url.txt --dbs
-r 提取HTTP request信息的文件,比如用burp抓包,获取request的包,然后另存为post.txt,用-r去读取,然后实施post注入,需要跟-p参数结合,指定注入的参数。当请求是HTTPS的时候,需要配合–force–ssl参数来使用,或者在host头后面加上443来使用
python sqlmap.py -r post.txt -p "username,password" --dbs
-x sitemapurl,将站点地图sitemap文件提交上来
-g 使用google去搜索,sqlmap可以测试Google搜索结果中的GET参数(只取前100个),这个需要结合Google语法去搞
python sqlmap.py -g "inrul:\".php?id=1\""
-c 加载sqlmap.comf文件里面的相关配置,这个我不是很明白,之后用到了我再研究
–data 此参数是把数据以post的方式提交,sqlmap会像检测get参数一样检测post的参数
python sqlmap.py -u "http://127.0.0.1/test.php" --data "id=1" -f --banner --dbs --users
–param-del 当get或者post的数据需要使用其他字符串分割测试参数的时候,就可以用这个
python sqlmap.py -u "http://127.0.0.1/test.php" --data "id=1;username=admin" --param-del=";" --banner --dbs --users
–cookie 这个是cookie注入的时候需要设置的参数,我并没有看懂真正的用法,回头再详细写。检测cookie注入方法就是设置level的值,当参数值>=2时,sqlmap会自动的检测cookie。
-level 共有五个等级,从1到5,默认为1,sqlmap使用的payload可以在xml/payloads.xml中看到,你也可以根据相应的格式添加自己的payload。
这个参数不仅影响使用哪些payload同时也会影响测试的注入点,GET和POST的数据都会测试,HTTP Cookie在level为2的时候就会测试,HTTP User-Agent/Referer头在level为3的时候就会测试。
总之在你不确定哪个payload或者参数为注入点的时候,为了保证全面性,建议使用高的level值。
python sqlmap.py -u "http://127.0.0.1/test.php?id=1" -level 3
–risk 设置风险等级,共有四个风险等级,从1到4,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。
在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句,可能导致更新的整个表,可能造成很大的风险。测试的语句同样可以在xml/payloads.xml中找到,也可以按照格式自行添加payload。
–eval 在有些时候,需要根据某个参数的变化,而修改另一个参数,才能形成正常的请求,这时可以用–eval参数在每次请求时,根据所写的python代码做完修改。
python sqlmap.py -u "http://127.0.0.1/test.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
-p 指定注入的参数,通常与post注入相结合
python sqlmap.py -r post.txt -p "username" --dbs
–dbs 列举数据库表,当前用户有权限读取包含所有数据库列表信息的表中的时候,即可列出所有的数据库。一般在检测注入的时候,都会跟上这个参数。
python sqlmap.py -u "http://127.0.0.1/test.php?id=1" --dbs
–dbms 指定数据库,默认情况系sqlmap会自动的探测web应用后端的数据库是什么,sqlmap支持的数据库有:
MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、SQLite、Firebird、Sybase、SAP MaxDB、DB2
python sqlmap.py -u "http://127.0.0.1/test.php?id=1" --dbms mysql
–os 指定数据库服务系统,默认情况下sqlmap会自动的探测数据库服务器系统,支持的系统有:Linux、Windows。
–prefix,–suffix 在有些环境中,需要在注入的payload的前面或者后面加一些字符,来保证payload的正常执行。不是很明白,需要实例检验。
原SQL语句$query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1";
python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "’)" --suffix "AND (’abc’=’abc"
改变后$query = "SELECT * FROM users WHERE id=(’1’) <PAYLOAD> AND (’abc’=’abc’) LIMIT 0, 1";
–tamper 修改注入的数据。这个需要看我借鉴的大佬的博客来具体解释。
–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 设定延迟注入的时间,当使用时间的盲注时,可以使用这个参数设定,默认的是5秒。
–union-cols 默认情况下,sqlmap测试UNION查询注入会测试1-10个字段数,当–level为5的时候他会增加测试到50个字段数。设定–union-cols的值应该是一段整数,如:12-16,是测试12-16个字段数。
–union-char 设定UNION查询使用的字符,默认情况下sqlmap针对UNION查询的注入会使用NULL字符,但是有些情况下会造成页面返回失败,而一个随机整数是成功的,这是你可以用–union-char指定UNION查询的字符。
-b,banner 大多数的数据库系统都有一个函数可以返回数据库的版本号,通常这个函数是version()或者变量@@version这主要取决与是什么数据库。
–current-user 在大多数据库中可以获取到管理数据的用户。
–current-db 返还当前连接的数据库。
–is-dba 判断当前的用户是否为管理,是的话会返回True。
–users 列出数据库管理用户。
–password 当前用户有权限读取包含用户密码的彪的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。
-D 指定要操作的数据库
python sqlmap.py -u "http://127.0.0.1/test.php?id=1" --tables -D test
-T 指定要操作的表
python sqlmap.py -u "http://127.0.0.1/test.php?id=1" --columns -T user -D test
-C 指定操作的列名
python sqlmap.py -u "http://127.0.0.1/test.php?id=1" -C
-C后跟着用逗号分割的列名,将会在所有数据库表中搜索指定的列名
-T后跟着用逗号分割的表名,将会在所有数据库中搜索指定的表名
-D后跟着用逗号分割的库名,将会在所有数据库中搜索指定的库名
–dump 获取整个表的数据,一般结合-T,-D参数使用。
python sqlmap.py -u "http://127.0.0.1/test.php?id=1" --dump -D user
–dump-all 参数获取所有数据表的内容,可同时加上–exclude-sysdbs只获取用户数据库的表,需要注意在Microsoft SQL Server中master数据库没有考虑成为一个系统数据库,因为有的管理员会把他当初用户数据库一样来使用它。
–count 获取表中数据个数,有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数。
–common-tables 暴力破解表名,当使用–tables无法获取到数据库的表时,可以使用此参数。
通常是如下情况:
1、MySQL数据库版本小于5.0,没有information_schema表。
2、数据库是Microssoft Access,系统表MSysObjects是不可读的(默认)。
3、当前用户没有权限读取系统中保存数据结构的表的权限。
暴力破解的表在txt/common-tables.txt文件中,你可以自己添加。
–common-columns 暴力破解表名,与暴力破解表名一样,暴力跑的列名在txt/common-columns.txt中。
–charset 强制使用的字符集编码,不使用SQLmap自动识别的(如HTTP头中的Content-Type)字符集编码,强制指定字符集编码如:
python sqlmap.py -u "http://127.0.0.1/test.php?id=1" --dbs --charset=GBK
–crawl 爬行网站的url,sqlmap可以收集潜在的可能存在漏洞的链接,后面跟的参数是爬行的深度
–batch 非交互模式,用此参数,不需要用户输入,将会使用sqlmap提示的默认值一直运行下去。
–parse-errors 有时目标没有关闭DBMS的报错,当数据库语句错误时,会输出错误语句,用此参数可以会显出错误信息。
–identify-waf qlmap可以尝试找出WAF/IPS/IDS保护,方便用户做出绕过方式。目前大约支持30种产品的识别。
python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" --identify-waf -v 3
0x03 常用的
基本上常用的就几个,但是如果掌握得多了,也会很省时间。但是大佬们都是手写脚本……我这样的菜鸡,需要多了解了解工具。
检测注入:
python sqlmap.py -u "http://127.0.0.1/test.php?id=1" --dbs
注数据:
python sqlmap,py -u "http://127.0.0.1/test.php?id=1" --tables -D database
python sqlmap.py -u "http://127.0.0.1/test.php?id=1" --columns -T table_name -D database
python sqlmap.py -u "http://127.0.0.1/test.php?id=1" --dump -T table_name
python sqlmap.py -r post.txt -p "username,password" --dbs
python sqlmap.py -u "http://127.0.0.1/test.php?id=1" --dbs -level 3
0x04 小结
这个要特别感谢大佬的博客给我的指导(最后有链接),真的是详细。不过具体的使用,还要结合实际情况,之后碰到了,我会一一写在这篇博客上。准备开始练习挖洞了~,应该会碰到很多。慢慢积累把。
最后,十分感谢大佬的博客的支持。