SQL注入之重新认识
Posted i春秋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入之重新认识相关的知识,希望对你有一定的参考价值。
i春秋社区
引言
作为长期占据 OWASP Top 10 首位的注入,认识它掌握它是每个渗透测试人员必不可少的一个过程。下面我们一起学习SQL注入,本篇为SQL之重新认识,下一篇为SQL之老生常谈,主要讲解绕过和工具注入的知识。
SQL注入简介
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。 [1] 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.
注入原理
程序命令没能对用户输入的内容能作出正确的处理导致执行非预期命令或访问数据。或者说产生注入的原因是接受相关参数未经正确处理直接带入数据库进行查询操作。发起注入攻击需要存在可控参数(数据)提交方式的确认和SQL命令相关点。
明确常见存在SQL注入网站链接形式
常见的出现SQL注入的网站链接形式:
http://www.zhangweishibi***.com/***.asp?id=xx (ASP)http://www.zhangweishibi***.com/***.php?id=xx (PHP)http://www.zhangweishibi***.com/***.jsp?id=xx (JSP)http://www.zhangweishibi***.com/***.aspx?id=xx (ASPX)http://www.zhangweishibi***.com/***.asp?id=xx&page=** (注入的时候需要明确注入的参数是id还是page,工具默认对后面的page参数进行注入,如需改变需要手动设置)http://www.zhangweishibi***.com/news/id/* 伪静态http://www.zhangweishibi***.com/index/new/php8.html 伪静态(**在这里代表有可能为数字或者字符串)
常见脚本数据库默认组合
asp + access/SQLServerphp + mysqljsp + Oracle
常见判断是否存在注入漏洞的方法
1.单双引号报错法
2.正确错误法
我把它命名为正确错误法,其实它就是就是经典的and 1=1、and 1=2 测试法。利用的是1=1永远为真,1=2永远为假的原理。当使用and 1=1进行测试时返回正常页面而and 1=2进行测试时返回错误页面或者页面没有正常显示则说明该链接存在SQL 漏洞。
举个栗子(注意为了绕过WAF,我把1和2转为了十六进制)
第一步:数字转为16进制
第二步:直接注入判断
当and 1=1 时候页面显示正常,而and 1=2 页面显示出错。说明存在注入点。
SQL注入参数类型判断
按参数类型主要分为下面三种:
(1) 数字型
字段=数字 这类注入的参数是数字型,SQL 语句原貌大致如下:Select * from user where 字段=1;
注入的参数为 ID=49 And [查询条件],即是生成语句:Select * from 表名 where 字段=49 And [查询条件]
(2) 字符型
QL 语句原貌大致概如下:Select * from 表名 where 字段=’asd‘
(3) 搜索型
select * from 表名 where 字段 like '%关键字%'。
判断常见数据库类型
不同的数据库的函数、注入方法都是有差异的,所以在注入之前,我们还要判断一下数据库的类型。识别数据库管理系统(DBMS)的类型是注入中不可或缺的一环,因为不知道DBMS的类型,不同的DBMS都有特有的属性或者内置功能,而我们注入的时候往往需要使用到其特有的属性或者内置功能,所以识别DBMS的类型是不可或缺的一部分。(--在数据库中代表是注释的意思)注意:以下方法可能会因为数据库版本的不同产生差异。
a.MYSQL数据库
实验环境使用的是zzcms8.2。
1.BENCHMARK()
MySQL有一个内置的BENCHMARK()函数,可以测试某些特定操作的执行速度。 参数可以是需要执行的次数和表达式。 表达式可以是任何的标量表达式,比如返回值是标量的子查询或者函数。请注意:该函数只是简单地返回服务器执行表达式的时间,而不会涉及分析和优化的开销。该函数可以很方便地测试某些特定操作的性能,比如通过测试可以发现,MD5()比SHA1()函数要快:
2.字符串拼接
MYSQL允许进行字符串拼接。
b.Oracle数据库
根据应用程序所提供的错误,如果有一个“ora-xxxx”错误,每个x是一个整数,这意味着数据库是Oracle,JSP应用程序通常有Oracle数据库。
c.SQL Server
认识SQL注入类型
(1)基于报错注入
页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
MYSQL数据库
Oracle数据库
SQL serve
(2)基于时间的盲注
不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
(3)基于布尔的盲注
MYSQL数据库
返回页面判断条件真假的注入。
部分盲注可以观察不同的HTTP状态码,确定响应时间、内容的长度,并在HTTP响应中的查看HTML内容来进行确认。
全盲
Oracle数据库
部分盲注可以观察不同的HTTP状态码,确定响应时间、内容的长度,并在HTTP响应中的查看HTML内容来进行确认。
全盲
SQL server
全盲
SQL注入常用函数及注入语句
Access:asc(字符) SQLServer:unicode(字符) 作用:返回某字符的 ASCII 码
Access:chr(数字) SQLServer:nchar(数字) 作用:与 asc 相反,根据
ASCII 码返回字符Access:mid(字符串,N,L) SQLServer:substring(字符串,N,L) 作用:返回字符串从 N 个字符起长度为 L 的子字符串,即 N 到 N+L 之间的字符串
Access:abc(数字) SQLServer:abc (数字) 作用:返回数字的绝对值(在猜解汉字的时候会用到)Access:A between B And C SQLServer:A between B And C 作用:判断 A 是否界于 B 与 C 之间
Mysql:
version()
MySQL 版本
user() 数据库用户名
database() 数据库名
@@datadir 数据库路径
@@version_compile_os 操作系统版本
hex() 把十进制转为十六进制
concat() 连接字符串ascii()
ascii编码
length() 获取长度
substring() mid() 取出字符串
group_concat() 连接一个组的所有字符串 以逗号分隔每一条数据
updatexml()、
extractvalue() 用于报错注入
sleep() 休眠
猜数据库 select schema_name from information_schema.schemata
猜某库的数据表 select table_name from information_schema.tables where table_schema=’xxxxx’
猜某表的所有列 Select column_name from information_schema.columns where table_name=’xxxxx’
获取某列的内容 Select xx_column from xx_table
列出所有的数据库select group_concat(schema_name) from information_schema.schemata
列出某个库当中所有的表select group_concat(table_name) from information_schema.tables where table_schema='xxxxx'
Oracle解析IPselect utl_inaddr.get_host_address('google.com') from dual;
获取系统信息select banner from v$version where rownum=1 ; -- oracle versi--
获取用户信息select user from dual; -- current userselect username from user_users; -- current userselect username from all_users; -- all user , the current user can see...select username from dba_users; -- all user , need pris--
获取密码hashselect name, password, astatus from sys.user$; -- password hash <=10g , need privsselect name, password, spare4 from sys.user$; -- password has 11g , need privs--
数据库select global_name from global_name; -- current databaseselect sys.database_name from dual; -- current databaseselect name from v$database; -- current database name , need privsselect instance_name from v$instance; -- current database name , need privs
-- 模式select distinct owner from all_tables; -- all schema
-- 表select table_name from all_tables where owner='xxx'; -- all table name
-- 列select owner,table_name,column_name from all_tab_columns where table_name='xxx';select owner,table_name,column_name from all_tab_cols where table_name='xxx';
总结
本文总结了许多注入基础点,学习是从点到线到面的过程。别少看了点的积累,没有点的累积何来线面。所以大家一定要重视基础知识。
编辑:咕嘟嘟
责任编辑:小南瓜
校对:小林龙马、山雾草野
戳阅读原文,跟作者进行深度交流吧~
以上是关于SQL注入之重新认识的主要内容,如果未能解决你的问题,请参考以下文章