安全测试===sqlmap(壹)转载
六、优化
这些参数可以优化Sqlmap的性能。
1.一键优化
参数:-o
添加此参数相当于同时添加下列三个优化参数:
- --keep-alive
- --null-connection
- --threads=3 (如果没有设置一个更好的值)
这些参数具体含义见后文。
2.HTTP长连接
参数:--keep-alive
该参数让Sqlmap使用HTTP长连接。该参数与“--proxy”矛盾。
3.HTTP空连接
参数:--null-connection
有一种特殊的HTTP请求类型可以直接获得HTTP响应的大小而不用获得HTTP响应体。显然这在布尔型盲注中可以节约很大的带宽。当然这一技术是需要服务器端支持的。该参数与“--text-only”矛盾。
4.HTTP并发
参数:--threads
使用该参数指定Sqlmap可以达到的最大并发数。从性能和网站承受能力两方面考虑最大并发数不要超过10。
七、注入
这些参数被用于指定要测试的参数、定制攻击荷载和选择篡改脚本。
1.要测试的注入点
参数:-p和--skip
默认情况下Sqlmap会测试所有GET参数和POST参数,当level大于等于2时会测试cookie参数,当level大于等于3时会测试User-Agent和Referer。实际上还可以手动指定一个以逗号分隔的、要测试的参数列表,该列表中的参数不受level限制。这就是“-p”的作用。
举个例子,若想只测试GET参数“id”和User-Agent,则可以这么写:
-p "id,user-agent"
如果不想测试某一参数则可以使用“--skip”。如设置了level为5但不想测试User-Agent和Referer,则可以这么写:
--level=5 --skip="user-agent,referer"
有时会遇到伪静态网页。动态网页会明目张胆地列出参数,如:
/user.php?id=1
显然参数是id,值为1。但若是伪静态网页则可能这样写:
/user/1/
将参数隐藏在URL中。通常情况下Sqlmap不会对这样的伪静态网页的参数做测试,因为Sqlmap无法判断哪个是参数。若想要对这样的伪静态进行测试,只需要加上“*”,告诉Sqlmap哪个是伪静态参数就行,剩下事的和GET参数没有什么区别。如:
python sqlmap.py -u "http(s)://target.cc/user/1*/"
2.指定数据库管理系统
参数:--dbms
dbms是“Database Management System”的缩写。默认情况下Sqlmap会自动检测网站使用的数据库管理系统,Sqlmap支持以下这些数据库管理系统:
- MySQL
- Oracle
- PostgreSQL
- Microsoft SQL Server
- Microsoft Access
- Firebird
- SQLite
- Sybase
- SAP MaxDB
- DB2
如果Sqlmap自动检测失败或是不想让Sqlmap进行数据库指纹检测,可以使用参数“--dbms”手动指定数据库管理系统,如:“--dbms postgresql”。
对于Mysql和Microsoft SQL Server和要这样指定:
--dbms MySQL <version> --dbms Microsoft SQL Server <version>
对于MySQL来说,是类似这样的:5.0。对于Microsoft SQL Server来说,是类似这样的:2005。
如果在添加“--dbms”参数的同时还添加了“--fingerprint”,Sqlmap只会在指定的数据库管理系统内进行指纹识别。
只有在很确定时使用“--dbms”,否则还是让Sqlmap自动检测更好些。
3.指定运行数据库管理系统的操作系统
参数:--os
默认情况下Sqlmap会自动检测运行数据库管理系统的操作系统,目前完全支持的操作系统有:
- Linux
- Windows
如果很确定可以使用参数“--os”指定运行数据库管理系统的操作系统。当然在只用很确定时才应该使用此参数,否则还是让Sqlmap自动检测更好些。
4.生成无效参数值时强制使用大数
参数:--invalid-bignum
有时在注入测试时需要生成无效参数,一般情况下Sqlmap会取已有参数(如:id=13)的相反数(如:id=-13)作为无效参数。但若添加“--invalid-bignum”,Sqlmap就会取大数(如:id=99999999)作为无效参数。
5.生成无效参数值时强制使用逻辑操作符
参数:--invalid-logical
有时在注入测试时需要生成无效参数,一般情况下Sqlmap会取已有参数(如:id=13)的相反数(如:id=-13)作为无效参数。但若添加“--invalid-logical”,Sqlmap就会使用逻辑操作符(如:id=13 AND 18=19)作为无效参数。
6.生成无效参数值时强制使用字符串
参数:--invalid-string
有时在注入测试时需要生成无效参数,一般情况下Sqlmap会取已有参数(如:id=13)的相反数(如:id=-13)作为无效参数。但若添加“--invalid-logical”,Sqlmap就会使用字符串(如:id=akewmc)作为无效参数。
7.关闭payload转换
参数:--no-cast
在检索结果时Sqlmap会将所有输入转换为字符串类型,若遇到空值(NULL)则将其替换为空白字符。 这样做是为了防止如连接空值和字符串之类的任何错误发生并可以简化数据检索过程。 但是有报告显示在老版本的Mysql中这样做会导致数据检索出现问题,因此添加了“--no-cast”来告诉Sqlmap不要这样做。
8.关闭字符串编码
参数:--no-escape
有时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”来关闭字符串编码。
9.定制payload
参数:--prefix和--suffix
有时只有在payload后添加用户指定的后缀才能注入成功。另一种场景是用户已经知道查询语句怎么写的,此时可以直接指定payload的前缀和后缀来完成检测和注入。
一个有漏洞的源码示例如下:
query = "SELECT * FROM users WHERE id=('" . $\_GET['id'] . "') LIMIT 0, 1";
对这样的例子可以让Sqlmap自动检测边界范围也可以手动指出边界范围:
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语句会变成:
SELECT * FROM users WHERE id=('1') <PAYLOAD> AND ('abc'='abc') LIMIT 0, 1
这个句子语法是正确的,payloa也能执行。
在简单的测试环境下Sqlmap不需要被提供定制的边界范围就能够自动检测并完成注入,但在真实世界中某些应用可能会很复杂如嵌套JOIN查询,此时就需要为Sqlmap指明边界范围。
10.修改注入数据
参数:--tamper
除了用CHAR()编码字符串外Sqlmap没有对payload进行任何混淆。 该参数用于对payload进行混淆以绕过IPS或WAF。 该参数后跟一个tamper脚本的名字。 若该tamper脚本位于sqlmap的安装目录的tamper/目录中,就可以省略路径和后缀名,只写文件名。 多个tamper脚本之间用空格隔开。
在tamper/目录中有许多可用的tamper脚本。tamper脚本的作用是对payload进行混淆。 我们还可以自己写tamper脚本,这属于Sqlmap的高级用法,一个有效的tamper脚本如下所示:
# 必须要导入的库 from lib.core.enums import PRIORITY # 定义该tamper脚本的优先级 __priority__ = PRIORITY.NORMAL def tamper(payload): '''此处是tamper的说明''' retVal = payload # 此处是用于修改payload的代码 # 返回修改后的payload return retVal
下面是一个示例,该示例的目标是Mysql,假定大于号、空格和开头的SELECT是被禁止的:
python sqlmap.py -u "http://192.168.56.101:8080/ScorePrj/?id=1" \ --tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3
该示例部分输出如下:
[12:55:52] [DEBUG] cleaning up configuration parameters [12:55:52] [INFO] loading tamper script 'between' [12:55:52] [INFO] loading tamper script 'randomcase' [12:55:52] [INFO] loading tamper script 'space2comment' [...] [12:55:53] [INFO] testing for SQL injection on GET parameter 'id' [12:55:53] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause' [12:55:53] [PAYLOAD] 1 [12:55:53] [PAYLOAD] 1)/**/aNd/**/8083=4737/**/aNd/**/(4754/**/BetwEen/**/4754/**/aNd/**/4754 [12:55:53] [PAYLOAD] 1)/**/anD/**/4962=4962/**/anD/**/(2361/**/BeTweEN/**/2361/**/anD/**/2361 [12:55:53] [PAYLOAD] 1/**/aNd/**/9754/**/BETwEEn/**/1206/**/aNd/**/1206 [12:55:53] [PAYLOAD] 1/**/AnD/**/4962/**/beTweEn/**/4962/**/AnD/**/4962 [12:55:53] [PAYLOAD] 1/**/aND/**/2741/**/BetWeEn/**/9323/**/aND/**/9323--/**/Ihsa [12:55:53] [PAYLOAD] 1/**/anD/**/4962/**/BetweEN/**/4962/**/anD/**/4962--/**/wVUI [12:55:53] [PAYLOAD] 1')/**/anD/**/1694=6061/**/anD/**/('zLwu'='zLwu [12:55:53] [PAYLOAD] 1')/**/ANd/**/4962=4962/**/ANd/**/('Dsfw'='Dsfw [12:55:53] [PAYLOAD] 1'/**/aND/**/6307=8901/**/aND/**/'fKLn'='fKLn [12:55:53] [PAYLOAD] 1'/**/aNd/**/4962=4962/**/aNd/**/'YFsp'='YFsp [12:55:53] [PAYLOAD] 1%'/**/anD/**/3549=6854/**/anD/**/'%'=' [12:55:53] [PAYLOAD] 1%'/**/aND/**/4962=4962/**/aND/**/'%'=' [...] [12:55:54] [PAYLOAD] 1)/**/uNIoN/**/alL/**/Select/**/nuLl--/**/NRtq [12:55:54] [PAYLOAD] 1)/**/UnIOn/**/alL/**/sElEcT/**/nuLL,nuLL--/**/jalk [12:55:54] [PAYLOAD] 1)/**/Union/**/