用法-注入-sqlmap用户手册-测试-IT技术博客

注入

这些选项可用于指定要测试的参数,提供自定义注入有效负载和可选的篡改脚本。


可测试的参数

选项:-p,-skip和--param-exclude


默认情况下,sqlmap测试所有GET参数和POST参数。当--level的值> = 2时,它还会测试HTTP Cookie标头值。当此值> = 3时,它还会测试SQL注入的HTTP User-Agent和HTTP Referer标头值。但是,可以手动指定要sqlmap测试的参数的逗号分隔列表。这也将绕过对--level值的依赖。


例如,要测试GET参数ID和仅用于HTTP User-Agent,请提供-p“ id,user-agent”。


如果用户希望从测试中排除某些参数,则可以使用--skip选项。当您要为--level使用更高的值并测试所有可用参数(通常不测试某些HTTP标头)时,这特别有用。


例如,要跳过对--level = 5处的HTTP标头User-Agent和HTTP标头Referer的测试,请提供--skip =“ user-agent,referer”。


也有可能基于基于某些参数的名称的正则表达式从测试中排除某些参数。在这种情况下,用户可以使用--param-exclude选项。


例如,要跳过对名称中包含字符串令牌或会话的参数的测试,请提供--param-exclude =“ token | session”。


URI注入点

在特殊情况下,注入点位于URI本身内。除非手动指出,否则sqlmap不会对URI路径执行任何自动测试。您必须在命令行中通过在希望sqlmap测试和利用SQL注入的每个URI点后附加一个星号(*)(注:还支持Havij样式%INJECT HERE%)来指定这些注入点。


例如,当使用Apache Web服务器的mod_rewrite模块或其他类似技术时,此功能特别有用。


有效命令行的示例为:

$ python sqlmap.py -u "
http://targeturl/param1/value1*/param2/value2/"


任意注入点

与URI注入点类似,星号(*)(注意:还支持Havij样式%INJECT HERE%)也可以指向GET,POST或HTTP标头中的任意注入点。 可以通过在选项-u所提供的GET参数值,选项--data所提供的POST参数值,选项-H,--headers所提供的HTTP标头值之内进行标记来指定注入点 ,--user-agent,--referer和/或--cookie,或在HTTP请求中从选项-r加载的HTTP请求中的一般位置。


有效命令行的示例为:

$ python sqlmap.py -u "http://targeturl" --cookie="param1=value1*;param2=value2"


强制DBMS

选项:--dbms


默认情况下,sqlmap自动检测Web应用程序的后端数据库管理系统。 sqlmap完全支持以下数据库管理系统:

  • MySQL

  • Oracle

  • PostgreSQL

  • Microsoft SQL Server

  • Microsoft Access

  • IBM DB2

  • SQLite

  • Firebird

  • Sybase

  • SAP MaxDB

  • HSQLDB

  • Informix

如果一旦识别出SQL注入后sqlmap由于某种原因无法检测到后端DBMS,或者如果您想要避免活动指纹,则可以自己提供后端DBMS的名称(例如postgresql)。对于MySQL和Microsoft SQL Server,分别以MySQL <version>和Microsoft SQL Server <version>的形式提供它们,其中<version>是DBMS的有效版本。例如适用于MySQL的5.0和适用于Microsoft SQL Server的2005。


如果您将--fingerprint与--dbms一起提供,则sqlmap仅对指定的数据库管理系统执行扩展指纹,请阅读以下内容以获取更多详细信息。


请注意,此选项不是强制性的,强烈建议仅在绝对确定后端数据库管理系统时使用此选项。如果您不知道,请让sqlmap为您自动为其指纹。

强制数据库管理系统的操作系统名称

选项:--os


默认情况下,当此信息依赖于任何其他提供的开关或选项时,sqlmap会自动检测Web应用程序的后端数据库管理系统基础操作系统。目前,完全支持的操作系统是:

  • Linux

  • Windows

如果您已经知道操作系统名称,则可以强制使用它,这样sqlmap就可以避免这样做。


请注意,此选项不是强制性的,强烈建议仅在绝对确定有关后端数据库管理系统底层操作系统的情况下使用此选项。如果您不知道它,请让sqlmap自动为您识别它。


强制使用大数字来使值无效

开关:--invalid-bignum


在sqlmap需要使原始参数值无效(例如id = 13)的情况下,它将使用经典取反(例如id = -13)。使用此开关,可以强制使用大整数值来实现相同的目标(例如,id = 99999999)。


强制使用逻辑运算来使值无效

开关:--invalid-logical


在sqlmap需要使原始参数值无效(例如id = 13)的情况下,它将使用经典取反(例如id = -13)。通过此开关,可以强制使用布尔运算来实现相同的目标(例如,id = 13 AND 18 = 19)。


强制使用随机字符串来使值无效

开关:--invalid-string


在sqlmap需要使原始参数值无效(例如id = 13)的情况下,它将使用经典取反(例如id = -13)。通过此开关,可以强制使用随机字符串来实现相同的目标(例如,id = akewmc)。


关闭有效载荷投放机制

开关:--no-cast


检索结果时,sqlmap使用一种机制,其中所有条目都强制转换为字符串类型,并在出现NULL值的情况下替换为空格字符。这样做是为了防止出现任何错误状态(例如,将NULL值与字符串值连接在一起)并简化数据检索过程本身。不过,据报导,在某些情况下(例如MySQL DBMS的较旧版本)由于资料撷取本身的问题(例如没有值传回),因此必须关闭(使用此开关)该机制。


关闭字符串转义机制

开关:--no-escape


如果sqlmap需要在有效负载中使用(单引号分隔)字符串值(例如SELECT'foobar'),则这些值会自动转义(例如SELECT CHAR(102)+ CHAR(111)+ CHAR(111)+ CHAR (98)+ CHAR(97)+ CHAR(114))。这样做的原因有两点:混淆有效内容并防止后端服务器上的查询转义机制(例如magic_quotes和/或mysql_real_escape_string)潜在的问题。用户可以使用此开关将其关闭(例如,减小有效负载大小)。


定制注入有效载荷

选项:--prefix和--suffix


在某些情况下,仅当用户提供要添加到注入有效负载的特定后缀时,漏洞参数才可利用。当用户已经知道查询语法并想通过直接提供注入有效载荷前缀和后缀来检测和利用SQL注入时,这些选项很方便出现的另一种情况就会出现。


易受攻击的源代码示例:

$query = "SELECT * FROM users WHERE id=('" . $_GET['id'] . "') LIMIT 0, 1";

若要检测和利用此SQL注入,可以让sqlmap在检测阶段为您检测边界(如SQL有效负载前缀和后缀的组合),也可以自行提供。


例如:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php\
?id=1" -p id --prefix "')" --suffix "AND ('abc'='abc"
[...]

这将导致所有sqlmap请求最终以如下查询结束:

$query = "SELECT * FROM users WHERE id=('1') <PAYLOAD> AND ('abc'='abc') LIMIT 0, 1";

这使得查询在语法上正确。


在这个简单的示例中,sqlmap可以检测SQL注入并加以利用,而无需提供自定义边界,但是有时在实际应用中,当注入点位于嵌套的JOIN查询内时,有必要提供它。

篡改注入数据

选项:--tamper


sqlmap本身不会混淆发送的负载,除了单引号之间的字符串被其类似CHAR()的表示形式替代。


在您和后端数据库管理系统之间的输入验证机制较弱的情况下,此选项可能非常有用且功能强大。该机制通常是由应用程序源代码,昂贵的企业级IPS设备或Web应用程序防火墙(WAF)调用的自行开发的输入验证例程。所有定义相同概念的流行语都以不同的方式实现,并且通常要花费很多钱。


要利用此选项,请为sqlmap提供一个以逗号分隔的篡改脚本列表,它将处理有效负载并将其转换为有效负载。您可以定义自己的篡改脚本,使用tamper /文件夹中的sqlmap脚本,也可以对其进行编辑,只要将它们以逗号分隔为选项–tamper的值即可(例如--tamper =“ between,randomcase”)。


有效的篡改脚本的格式如下:

# Needed imports
from lib.core.enums import PRIORITY
# Define which is the order of application of tamper scripts against
# the payload
__priority__ = PRIORITY.NORMAL
def tamper(payload):
    '''
    Description of your tamper script
    '''
    retVal = payload
    # your code to tamper the original payload
    # return the tampered payload
    return retVal

您可以在tamper /目录中检查有效且可用的篡改脚本。


针对MySQL目标的示例,假设>字符,空格和大写SELECT字符串被禁止:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --\
tamper tamper/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(*),CONC
AT(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/**/info
rmation_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 
[...]



标签: sqlmap教程sqlmapsqlmap手册用户手册sqlmap用户手册